Disparity map中的OpenCv深度估计

时间:2013-10-06 16:35:05

标签: c++ opencv computer-vision depth disparity-mapping

我正在尝试使用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值,所获得的深度值与前一个公式获得的值不同。

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

由于

2 个答案:

答案 0 :(得分:5)

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

在实践中,情况并非如此。例如,通常在rectifying图像之后执行匹配,即在使用已知的基本矩阵对它们进行扭曲之后,以便相应的像素被约束为属于同一行。一旦你有匹配 经过校正后的图像,可以使用整形扭曲的反转将它们重新映射到原始图像上,然后三角测量到三维空间中重建场景。 OpenCV有一个例行程序:reprojectImageTo3d

答案 1 :(得分:0)

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