6

我正在尝试使用 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改变了结果值。

如何设置此参数?这个参数怎么改?

谢谢

4

2 回答 2

6

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

在实践中,几乎从来没有这种情况。例如,通常在校正图像之后执行匹配,即在使用已知的基本矩阵扭曲它们之后,使得相应的像素被限制为属于同一行。一旦在校正后的图像上找到匹配项,您可以使用校正扭曲的逆将它们重新映射到原始图像上,然后三角剖分到 3D 空间以重建场景。OpenCV 有一个例程可以做到这一点:reprojectImageTo3d

于 2013-10-06T20:15:58.700 回答
0

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

于 2013-10-07T05:04:03.613 回答