来自OpenCV中移动摄像头的深度/视差图

时间:2018-01-31 17:32:00

标签: c++ opencv disparity-mapping

可以从移动的相机获取深度/视差图吗?假设我在x位置拍摄了一张图像,在我走了之后说了5cm然后拍摄了另一张照片,并从那里我计算了图像的深度图。

我尝试在opencv中使用BlockMatching但结果并不好。第一张和第二张图片如下: first imagesecond imagedisparity map (colour)disparity map

我的代码如下:

    GpuMat leftGPU;
    GpuMat rightGPU;
    leftGPU.upload(left);rightGPU.upload(right);
    GpuMat disparityGPU;
    GpuMat disparityGPU2;
    Mat disparity;Mat disparity1,disparity2;
    Ptr<cuda::StereoBM> stereo = createStereoBM(256,3);
    stereo->setMinDisparity(-39);
        stereo->setPreFilterCap(61);
        stereo->setPreFilterSize(3);
        stereo->setSpeckleRange(1);
        stereo->setUniquenessRatio(0);
    stereo->compute(leftGPU,rightGPU,disparityGPU);
    drawColorDisp(disparityGPU, disparityGPU2,256);
    disparityGPU.download(disparity);
    disparityGPU2.download(disparity2);
    imshow("display img",disparityGPU);

我该如何改进?从颜色视差图中,存在相当多的误差(即,高圆圈的颜色为红色,并且与表格的某些部分相同。)。此外,从视差图中,有小噪声(图片中的所有黑点),如何填充附近差异的黑点?

1 个答案:

答案 0 :(得分:0)

如果对象是静态的,则可能。

要正确进行立体匹配,首先需要纠正你的图像!如果您没有经过校准的摄像机,则可以从检测到的特征点进行校准。另请注意,对于cuda::StereoBM,最小默认差异为0.(我从未使用过cuda,但我认为您的setMinDisparity没有做任何事情,请参阅this anser。)

现在,在您的示例中,图像对应点仅相隔约1行,因此您的视差图实际上看起来并不太糟糕。在这种特殊情况下,可能会有更大的blockSize

最后,你的对象纹理非常低,因此块匹配算法检测不到很多。