2

我正在尝试在 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)
4

1 回答 1

9

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

原则,

 disparity := x_l - x_r

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


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

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

    x_l - x_r < ndisparities,

IE

    x_r > x_l - ndisparities 

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

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


一个修复:

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

由于ndisparities 取决于与最近物体的相机的距离(从 [A] 开始),因此要么将相机远离物体,要么将相机彼此靠近。

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

于 2013-04-05T12:31:32.263 回答