Я пытаюсь оценить глубину от стереопары изображений с OpenCV. У меня есть карта несоответствия, и оценка глубины может быть получена как:
(Baseline*focal)
depth = ------------------
(disparity*SensorSize)
Я использовал технику Block Matching, чтобы найти одинаковые точки на двух выпрямленных изображениях.
OpenCV позволяет установить некоторый параметр сопоставления блоков, например BMState->numberOfDisparities
,
После сопоставления блоков:
cvFindStereoCorrespondenceBM( frame1r, frame2r, disp, BMState);
cvConvertScale( disp, disp, 16, 0 );
cvNormalize( disp, vdisp, 0, 255, CV_MINMAX );
Я нашел значение глубины как:
if(cvGet2D(vdisp,y,x).val[0]>0)
{
depth =((baseline*focal)/(((cvGet2D(vdisp,y,x).val[0])*SENSOR_ELEMENT_SIZE)));
}
Но полученное значение глубины отличается от значения, полученного в предыдущей формуле, из-за значения BMState->numberOfDisparities
это меняет значение результата.
Как я могу установить этот параметр? что изменить этот параметр?
Спасибо
Простая формула действительна тогда и только тогда, когда движение от левой камеры к правой является чистым переводом (в частности, параллельно горизонтальной оси изображения).
На практике это вряд ли когда-либо. Например, обычно выполняется сопоставление после выпрямляющий изображения, т. е. после деформации их с использованием известной фундаментальной матрицы, так что соответствующие пиксели должны принадлежать к одной и той же строке. Как только у вас есть спички на
выпрямленные изображения, вы можете переназначить их на исходные изображения, используя обратную сторону выпрямительной деформации, а затем триангулировать в трехмерное пространство, чтобы реконструировать сцену. OpenCV имеет рутину для этого: reprojectImageTo3d
Формула, которую вы упомянули выше, не будет работать, поскольку плоскость камеры и плоскость изображения не совпадают, т. Е. Камера будет расположена на некоторой высоте, а плоскость, которую она снимает, будет лежать на земле. Итак, вы должны сделать небольшую модификацию в этой формуле.
Вы можете установить эти значения диспаратности и известное расстояние на многочлен от подбор кривой.Из него вы получите коэффициенты, которые можно использовать для других неизвестных расстояний.
2-й способ — создать трехмерное облако точек, используя матрицу переноса и reprojectimageTo3d (Opencv API).