【问题标题】:Black columns in the disparity map when using StereoBM使用 StereoBM 时视差图中的黑色列
【发布时间】:2013-04-05 09:59:13
【问题描述】:

我正在尝试在 OpenCV 中使用 StereoBM 从一对图像中提取视差图。忽略下面视差图的不良质量,您可以看到它的左侧有许多黑色列,对应于参数 ndisparities。我认为 ndisparities 只告诉 StereoBM 它可以在多远的地方搜索对应关系。什么可能导致这种行为?它似乎限制了生成的深度图的宽度,但我不明白为什么。

您可以在下面看到立体声对 here 和我的代码。提前感谢您的任何指点!

Mat Limg = imread("left.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat Rimg = imread("right.jpg", CV_LOAD_IMAGE_GRAYSCALE);

Mat disp(Limg.size(), CV_16SC1), disp8U;
int ndisparities = 512;
StereoBM SBM(StereoBM::BASIC_PRESET, ndisparities , 11);
SBM(Limg, Rimg, disp, CV_16S);

double minVal, maxVal;
minMaxLoc( disp, &minVal, &maxVal );
disp.convertTo( disp8U, CV_8UC1, 255/(maxVal - minVal));
imshow("disparity", disp8U)

【问题讨论】:

    标签: c++ opencv image-processing computer-vision


    【解决方案1】:

    视差图量化了左右图像中相应点对之间的纵向(对极)偏移。

    原则上,

     disparity := x_l - x_r
    

    其中x_lx_r 是空间中给定点的两个相机焦平面上的投影。 (请记住,较大的差异表征了距离相机更近的像素。[A])


    参数ndisparities 量化了您可以拥有的预期最大差异(假设您可以忽略最小差异)。

    由于您假设 ndisparities 是您最大的差异,因此它成立

        x_l - x_r < ndisparities,
    

        x_r > x_l - ndisparities 
    

    因此,在左图像的前ndisparities 列中寻找与任何像素的右图像的对应关系是没有意义的:根本不可能。

    从某种意义上说,右摄像头的视锥正好从左摄像头视锥右侧的ndisparities列开始。


    修复:

    如果您希望视差图左侧的黑色列更少,您需要能够假设ndisparities 的值较低。

    由于ndisparities 取决于与最近物体(距[A])的摄像头的距离,因此要么将摄像头远离物体,要么将摄像头彼此靠近。

    在您非常具体的情况下,您的差异很大(stereoBM 需要做很多工作)!前景中的“x”符号显示出与图像比例相当的差异!!我认为您需要将相机放在更远的地方。

    【讨论】:

    • 这确实具有令人惊讶的意义,尽管当允许更高的视差时视野会减小是不直观的。为了尽可能详细地观察物体,摄像机如此接近。
    • 嘿。这是一种解决方法。在图像的左侧填充一些图像。然后修剪它。 ...但很快我意识到这篇文章是 2013 年的一篇。我觉得太晚了。
    猜你喜欢
    • 2016-06-24
    • 2014-05-26
    • 1970-01-01
    • 2016-08-31
    • 2014-05-03
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多