【问题标题】:OpenCV disparity map is cut from leftOpenCV 视差图从左侧切开
【发布时间】:2017-02-23 17:58:02
【问题描述】:

我正在尝试使用 OpenCV 3.1 在 C++ 中计算视差图。我使用 StereoSGBM 算法,我需要能够识别远距离和非常近的物体。因此,我将 MinDisparity 设置为 -16,MaxDisparity 设置为 160。

相机现在已正确校准,但生成的视差图从左侧切开。切割量取决于 MaxDisparity 设置。

我会理解为什么近距离物体会发生这种情况。仅仅是因为一个图像上的像素在第二个图像上不可用。但这不会发生在更远的物体上。在这种情况下,对象在两个相机图像中都是完全可见的,但在生成的视差图中不可见。

看看这张照片。为什么结果上看不到我的手?

这个问题有什么解决办法吗?在高 MaxDisparity 设置的情况下计算所有可见区域的视差图?

【问题讨论】:

    标签: c++ opencv disparity-mapping


    【解决方案1】:

    您面临的问题是结果图片中的差异数量。 SGBM 搜索整个视差空间并尝试在另一张图片中找到最佳匹配。

    获取右侧图像的一个像素,并将其与左侧图像视差范围内的每个像素进行比较。如果左图太小,则视差无效。因此,左侧图像中最左侧的 176 个像素被丢弃。

    尝试减少最大差异和/或增加最小差异!

    【讨论】:

    • 但这对我来说毫无意义。如果我增加最小视差,我会丢失远处的物体,如果我减少最大视差,我会丢失近处的物体。由于我的手在两张图片中仍然可见,为什么它只是找不到正确的匹配项? ...我的另一个想法是计算两个独立的视差图,例如0-48 和 48-96 然后以某种方式组合它们(但我不确定如何),但我不认为它是 100% 的解决方案。
    • 我做了一个实验。我修改了 OpenCV 的 StereoSGBM 代码,让 minX1 始终从零开始,而不是从 maxDisparity 值开始,结果是它正常工作——我的手在视差图中可见,它的距离被正确检测到,似乎没有问题。
    • 它似乎工作正常。但是,一旦图像包含重复结构,您就会遇到一大堆问题!
    • 我明白,但是,无论我如何更改,立体匹配中都会出现重复结构的问题。我只需要整个视野的视差图。
    • @bigmuscle:是的,它总是会发生。但请注意,您的方法会使问题变得更糟!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2015-06-09
    相关资源
    最近更新 更多