Depth/Disparity 来自 OpenCV 中移动相机的地图

Depth/Disparity Map from a moving camera in OpenCV

是否可以从移动的相机中获取 depth/disparity 地图?假设我在 x 位置拍摄了一张图像,在我移动了 5 厘米后拍摄了另一张照片,然后从那里我计算了图像的深度图。

我试过在 opencv 中使用 BlockMatching 但结果不是 good.The 第一和第二图像如下: first image,second image, disparity 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);

我该如何改进呢?从色差图中看,误差比较大(即高大的圆圈是红色的,与table的部分部分相同)。还有,从视差图中,有小的噪点(图中全是黑点),请问如何用附近的视差填充那些黑点?

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

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

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

最后,您的对象纹理很低,因此块匹配算法无法检测到太多。