我正在尝试使用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
值,所获得的深度值与前一个公式获得的值不同。
如何设置此参数?怎么改变这个参数?
由于
答案 0 :(得分:5)
当且仅当左相机到右相的动作是纯平移(特别是平行于水平图像轴)时,简单公式才有效。
在实践中,情况并非如此。例如,通常在rectifying图像之后执行匹配,即在使用已知的基本矩阵对它们进行扭曲之后,以便相应的像素被约束为属于同一行。一旦你有匹配 经过校正后的图像,可以使用整形扭曲的反转将它们重新映射到原始图像上,然后三角测量到三维空间中重建场景。 OpenCV有一个例行程序:reprojectImageTo3d
答案 1 :(得分:0)
上面提到的公式不适用于相机平面和图像平面不相同,即相机将位于某个高度,并且它捕获的平面将在地面上。所以,你必须对这个公式做一点修改。 您可以通过曲线拟合在多项式上拟合这些视差值和已知距离。从中您将获得可用于其他未知距离的系数。 第二种方法是使用wrap matrix和 reprojectimageTo3d(Opencv API)创建一个3d Point Cloud。