使用StereoBM时视差图中的黑色列

时间:2013-04-05 09:59:13

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

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

Disparity map

您可以在下面看到立体声对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)

1 个答案:

答案 0 :(得分:9)

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

原则上,

 disparity := x_l - x_r

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


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

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

    x_l - x_r < ndisparities,

    x_r > x_l - ndisparities 

因此,在左图像的前ndisparities列中查找与任意像素的正确图像的对应关系是没有意义的:只是你不能拥有。

从某种意义上说,右侧摄像机的视锥会在左侧摄像机视锥右侧准确显示ndisparities列。


A FIX:

如果您想在视差贴图的左侧显示更少的黑色列,则需要能够假设ndisparities的值更低。

由于ndisparities取决于距离最近物体的摄像机的距离(来自[A]),因此要么将摄像机放置得远离物体,要么将摄像机彼此靠近。

在你非常具体的情况下,你有很大的差异(立体声音响很多工作)!前景中的“x”符号表示与图像比例相当的差异!我相信你需要把你的相机放得更远。