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

FvD*_*FvD 2 c++ opencv image-processing computer-vision

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

视差图

你可以在这里看到立体声对和我的代码.提前感谢任何指针!

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)
Run Code Online (Sandbox Code Playgroud)

Aco*_*rbe 9

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

原则上,

 disparity := x_l - x_r
Run Code Online (Sandbox Code Playgroud)

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


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

既然你认为这ndisparities是你最大的差距,那就是正确的

    x_l - x_r < ndisparities,
Run Code Online (Sandbox Code Playgroud)

    x_r > x_l - ndisparities 
Run Code Online (Sandbox Code Playgroud)

因此,ndisparities在左图像的第一列中寻找与任何像素的正确图像的对应是没有意义的:只是你不能拥有.

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


一个固定:

如果您想要在视差图的左侧较少的黑色列,您需要能够假设较低的值 ndisparities.

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

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