可以从移动的相机获取深度/视差图吗?假设我在x位置拍摄了一张图像,在我走了之后说了5cm然后拍摄了另一张照片,并从那里我计算了图像的深度图。
我尝试在opencv中使用BlockMatching但结果并不好。第一张和第二张图片如下: 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);
我该如何改进?从颜色视差图中,存在相当多的误差(即,高圆圈的颜色为红色,并且与表格的某些部分相同。)。此外,从视差图中,有小噪声(图片中的所有黑点),如何填充附近差异的黑点?
答案 0 :(得分:0)
如果对象是静态的,则可能。
要正确进行立体匹配,首先需要纠正你的图像!如果您没有经过校准的摄像机,则可以从检测到的特征点进行校准。另请注意,对于cuda::StereoBM
,最小默认差异为0.(我从未使用过cuda,但我认为您的setMinDisparity
没有做任何事情,请参阅this anser。)
现在,在您的示例中,图像对应点仅相隔约1行,因此您的视差图实际上看起来并不太糟糕。在这种特殊情况下,可能会有更大的blockSize
。
最后,你的对象纹理非常低,因此块匹配算法检测不到很多。