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

Я пытаюсь оценить глубину по изображениям стереопары с 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)));
   }

но значение глубины obtaied отличается от значения obtaied с предыдущей формулой из-за значения BMState->numberOfDisparities это изменяет значение результата.

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

спасибо

2 ответов


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

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


формула, которую вы упомянули выше, не будет работать как плоскость камеры, а плоскость изображения-это не то же самое i.e камера будет расположена на некоторой высоте, а самолет, который она захватит, будет находиться на земле. Таким образом, вы должны сделать небольшую модификацию в этой формуле. Вы можете соответствовать этим значениям несоответствия и известному расстоянию на полинома by кривой.Из него вы получите коэффициенты, которые можно использовать для других неизвестных расстояний. 2-й способ-создать 3d-точку Облако с помощью wrap matrix и reprojectimageTo3d (OpenCV API).