我正在尝试在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)
答案 0 :(得分:9)
视差图量化左图像和右图像中的相应点对之间的纵向(极线)偏移。
原则上,
disparity := x_l - x_r
其中x_l
和x_r
是空间中给定点的两个摄像机焦平面上的投影。 (请记住,较大的差异表征了更接近到相机的像素。[A])
参数ndisparities
量化您可以拥有的预期最大差异(假设您可以忽略最小差异)。
由于您假设ndisparities
是您最大的差异,因此它是正确的
x_l - x_r < ndisparities,
即
x_r > x_l - ndisparities
因此,在左图像的前ndisparities
列中查找与任意像素的正确图像的对应关系是没有意义的:只是你不能拥有。
从某种意义上说,右侧摄像机的视锥会在左侧摄像机视锥右侧准确显示ndisparities
列。
A FIX:
如果您想在视差贴图的左侧显示更少的黑色列,则需要能够假设ndisparities
的值更低。
由于ndisparities
取决于距离最近物体的摄像机的距离(来自[A]),因此要么将摄像机放置得远离物体,要么将摄像机彼此靠近。
在你非常具体的情况下,你有很大的差异(立体声音响很多工作)!前景中的“x”符号表示与图像比例相当的差异!我相信你需要把你的相机放得更远。