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

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

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

Спасибо

6

Решение

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

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

5

Другие решения

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector