我正在尝试使用 OpenCV 从立体对图像估计深度。我有视差图和深度估计可以获得:
(Baseline*focal)
depth = ------------------
(disparity*SensorSize)
我使用 block 匹配技术在两个校正后的图像中找到相同的点。
OpenCV 允许设置一些 block 匹配参数,例如 BMState->numberOfDisparities
。
block 匹配过程之后:
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
的值改变了结果值,所以得到的深度值与前面公式得到的值不同。
如何设置这个参数?怎么改这个参数?
谢谢
最佳答案
当且仅当从左摄像机到右摄像机的运动是纯平移(特别是平行于水平图像轴)时,这个简单的公式才有效。
在实践中几乎从来没有这种情况。例如,在 rectifying 之后执行匹配是很常见的。图像,即在使用已知的基本矩阵对它们进行变形之后,使得相应的像素被限制为属于同一行。一旦你有比赛 校正后的图像,您可以使用校正扭曲的逆将它们重新映射到原始图像上,然后三角化到 3D 空间以重建场景。 OpenCV 有一个例程可以做到这一点:reprojectImageTo3d
关于c++ - 视差图的 OpenCv 深度估计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19211190/