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
就可以了。
最后,您的对象纹理很低,因此块匹配算法无法检测到太多。
是否可以从移动的相机中获取 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
就可以了。
最后,您的对象纹理很低,因此块匹配算法无法检测到太多。