2013-10-06 67 views
5

我正在尝试使用OpenCV估计来自立体对图像的深度。我可以为获得视差图和深度估计:来自Difparity的OpenCv深度估计图

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

我已经使用块匹配技术来找到两个rectificated图像的相同点。 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

的简单的公式是有效的,当且仅当从相机左到右一个运动是一个纯粹的平移(特别是平行于水平图像轴)。

在实践中,这种情况几乎不存在。例如,通常在图像之后执行匹配,即在使用已知的基本矩阵对它们进行变形之后进行匹配,以便相应的像素被约束为属于同一行。一旦匹配了 校正后的图像,您可以使用校正扭曲的反转将它们重新映射到原始图像上,然后将其三角化到三维空间中以重建场景。 OpenCV有这样的例程:reprojectImageTo3d

+0

泰克斯为您的答案,我给块匹配过程中的两个矫正图像,所以这个公式应该正常工作?现在我将尝试使用reprojectImageTo3D函数。意大利语版本:Dal nome信条语意大利语,quindi per una maggiore chiarezza(per me); se utilizzogiàle immagini rettificate la formula precedente dovrebbe andare bene giusto? Se invece utilizzo ReprojectImageTo3D dovrei estrapolare soltanto il valore Z? Grazie per la risposta。 – Speed87

+0

定义“应该工作”?平行相机公式给出了相对于观察整流图像的理想相机的给定像素的深度。它的重建将是射影式的,但不是精确的。 [是的,我确实说意大利语,但这是一个只有英语的论坛] –

0

上面提到的公式不会像摄像机平面和图像平面一样工作,即摄像机将位于某个高度,并且它捕获的平面会在地面上。所以,你必须在这个公式中做一些修改。 您可以通过曲线拟合来拟合这些视差值和已知距离多项式。从中可以得到可用于其他未知距离的系数。 第二种方法是使用包装矩阵和reprojectimageTo3d(Opencv API)创建3d点云。