Оценка глубины OpenCv по карте Disparity

Я пытаюсь оценить глубину изображения стереопары с помощью OpenCV. У меня есть карта несоответствия, и оценка глубины может быть получена как:

             (Baseline*focal)
depth  =     ------------------
           (disparity*SensorSize)

Я использовал технику совпадения блоков, чтобы найти одинаковые точки на двух ректифицированных изображениях. 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, которое изменяет значение результата.

Как я могу установить этот параметр? что изменить этот параметр?

Спасибо


person Speed87    schedule 06.10.2013    source источник


Ответы (2)


Простая формула действительна тогда и только тогда, когда движение от левой камеры к правой является чистым переносом (в частности, параллельно горизонтальной оси изображения).

На практике это не так. Обычно сопоставление выполняется после исправления изображения, то есть после их деформации с использованием известной фундаментальной матрицы, так что соответствующие пиксели должны принадлежать одной и той же строке. Если у вас есть совпадения на исправленных изображениях, вы можете переназначить их на исходные изображения, используя обратную корректирующую деформацию, а затем выполнить триангуляцию в трехмерное пространство для восстановления сцены. В OpenCV есть процедура для этого: reprojectImageTo3d

person Francesco Callari    schedule 06.10.2013
comment
Спасибо за ваш ответ, я даю в процессе сопоставления блоков два исправленных изображения, так что эта формула должна работать правильно? Теперь попробую использовать функцию reprojectImageTo3D. ИТАЛЬЯНСКАЯ ВЕРСИЯ: Dal nome credo che tu sia italiano, quindi per una maggiore chiarezza (per me); se utilizzo già le immagini rettificate la formula Predente dovrebbe andare bene giusto? Утилизировать ли ReprojectImageTo3D больше, чем лучше Z? Grazie per la risposta. - person Speed87; 07.10.2013
comment
Определить должно работать? Формула параллельной камеры дает вам глубину в заданном пикселе по сравнению с идеальной камерой, которая наблюдает выпрямленное изображение. Его реконструкция будет проективно, но не метрически точной. [Да, я говорю по-итальянски, но это форум только на английском] - person Francesco Callari; 07.10.2013

Формула, которую вы упомянули выше, не будет работать, поскольку плоскость камеры и плоскость изображения не совпадают, т.е. камера будет расположена на некоторой высоте, а плоскость, которую она захватывает, будет на земле. Итак, вам нужно немного изменить эту формулу. Эти значения несоответствия и известное расстояние можно подогнать к полиному с помощью подбора кривой. Из него вы получите коэффициенты, которые можно использовать для других неизвестных расстояний. Второй способ - создать трехмерное облако точек с использованием матрицы переноса и reprojectimageTo3d (Opencv API).

person Aizen    schedule 07.10.2013