c++ - 视差图的 OpenCv 深度估计

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

我正在尝试使用 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/

相关文章:

python - 检测二维图像中的标记 [Python/OpenCV]

c++ - 从 boost 序列化文件中读取会抛出异常

c++ - 当 C++ 状态上的绑定(bind)变量更改时,QML 自定义项状态不会更改

matlab - 提取图像中特定线条或线段的一般方法

image - OpenCV,如何在不重新初始化窗口的情况下显示一系列图像

opencv - 使用 OpenCV 识别相似(不完全相同)的简单图像?

computer-vision - 识别图片中的动物

c++ - C++中使用STL实现DFS时遇到的段错误

c++ - 在同一解决方案 C++ express 上的许多项目中更改平台工具集

python - 录制OpenCV视频的最佳fps是多少?