首页 > 解决方案 > 视差图后过滤

问题描述

经过校准和校正后,我能够提取立体相机的相机馈送的非常准确的视差图。该地图包含正确的视差值,因为当我将它们转换为公制距离时,它们非常准确。现在我的视差图看起来像这样:

左边是校正图像,右边是视差图,低于我额头的正确估计(~0.5米,视差图上的白点)

左边是校正图像,右边是视差图,低于我额头的正确估计(~0.5米,视差图上的白点)

SGBM 值设置为:

minDisparities -> 0;
numDisparities -> 32;
P1 -> 0;
P2 -> 0;
block Size -> 0;
Speckle window range -> 0;
Speckle window Size -> 0;
disp12MaxDiff -> 0;
preFilterCap -> 44;
uniquenessRatio -> 0;
mode ->2 (MODE_SGBM_3WAY);

但我可以通过一组轨迹栏轻松更改所有这些。

如您所见,视差图看起来有颗粒感,许多非纹理区域具有无法检测视差值的黑色像素。此外,细节和边缘并不好,这对于我的最终应用程序是不可接受的。我试图寻找过滤器,发现一个非常常见的过滤器是我应用的加权最小二乘过滤器 (WLS),这些是最初的不良结果:

右上视差图、左上 WLS 滤波视差图、右下置信度图

右上视差图,左上 WLS 滤波视差图,右下置信度图。如您所见,过滤后的 WLS 图中的结果很糟糕,实际上置信图大部分是黑色的(深度值完全错误)。

通过使用 SGBM 参数,我得到:

左上色图(更容易看到深度透视图),右上WLS disp,左下置信度图,右下未过滤的disp图

左上颜色图(更容易看到深度透视图),右上 WLS disp,左下置信度图,右下未过滤 disp 图。

置信度图为白色的高置信度区域被正确过滤(您可以从颜色图和 WLS 过滤图像中看到),并且它们的深度信息与未过滤的显示图相当。

我的问题是,无论我尝试什么,我都无法对更近的物体抱有很高的信心,就像我在上图中的形象一样。我什么都试过了。

所以总而言之,我的问题是:有没有办法为整个视野获得一个平滑、干净和暂时稳定的视差图(类似于我在我身后的墙壁和走廊上得到的视差图)?我应该坚持 WLS 过滤还是使用其他过滤器?在这种情况下,你有什么建议?

我正在使用 OpenCV 和 Visual Studio。任何意见是极大的赞赏。

谢谢!!

标签: c++opencvcamera-calibrationdisparity-mappingstereoscopy

解决方案


对于那些有类似问题的人:在我的情况下,我意识到我将错误的图像传递给过滤器函数。

wls_filter->filter(dispL, recl, dispFiltered, dispR, Rect(), recr);

其中 dispL 和 dispR 是标准化后的左右视差图:

double minValL, maxValL;
minMaxLoc(disp16sL, &minValL, &maxValL);
disp16sL.convertTo(dispL, CV_8UC1, 255 / (maxValL - minValL));

(右显示图相同)

相反,通过:

    wls_filter->filter(disp16sL, recl, dispFiltered, disp16sR, Rect(), recr);

其中 disp16sL 和 disp16sR 是归一化之前的视差图,然后对获得的过滤视差图进行归一化,给了我更好的结果,置信度图几乎完全是白色的。


推荐阅读