2013-10-06 2 views
5

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

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

Благодаря

ответ

4

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

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

+0

Thaks для вашего ответа, я даю в процессе согласования блоков два исправленных изображения, поэтому эта формула должна работать правильно? Теперь я попытаюсь использовать функцию repjectImageTo3D. ИТАЛЬЯНСКАЯ ВЕРСИЯ: Далекое имя кредо че-ту-сиа-итальяно, quindi per una maggiore chiarezza (per me); se utilizzo già le immagini rettificate la formula precente dovrebbe andare bene giusto? Se invece utilizzo ReprojectImageTo3D dovrei estrapolare soltanto il valore Z? Grazie per la risposta. – Speed87

+0

Определить «должен работать»? Формула параллельной камеры дает вам глубину в заданном пикселе относительно идеальной камеры, которая наблюдает выпрямленное изображение. Его реконструкция будет проективной, но не метрической, точной. [Да, я говорю по-итальянски, но это англоязычный форум] –

0

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

Смежные вопросы