视差图后过滤

Posted

技术标签:

【中文标题】视差图后过滤【英文标题】:Disparity map post-filtering 【发布时间】:2020-12-19 20:40:27 【问题描述】:

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

左边是校正后的图像,右边是视差图,低于我额头的正确估计(~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 图的结果很糟糕,实际上置信图大部分是黑色的(并且深度值完全错误)。

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

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

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

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

总之,我的问题是: 有没有办法为整个视野获得一个平滑、干净和暂时稳定的视差图(类似于我为我身后的墙壁和走廊获得的视差图)?我应该坚持 WLS 过滤还是使用其他过滤器?既然如此,你有什么建议?

我正在使用 OpenCV 和 Visual Studio。 非常感谢任何建议。

谢谢!!

【问题讨论】:

恐怕这对 SO 来说是题外话。 这怎么跑题了? SO 是关于特定编程问题的,尤其是当您使用 C++ 对其进行标记时。这只是我的看法,但反对票不是我的。 【参考方案1】:

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

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 是归一化之前的视差图,然后对获得的过滤视差图进行归一化,给了我更好的结果,置信度图几乎完全是白色的。

【讨论】:

以上是关于视差图后过滤的主要内容,如果未能解决你的问题,请参考以下文章

使用 Open CV Python 使用带有对角视差的 StereoBM 创建视差图

为啥不先移动鼠标就无法滚动视差?

使用ORB在OpenCV中生成密集视差图

翻译20 视差-Parallax

滚动视差?CSS 不在话下

背景图像与视差