视差图后处理滤波

3
在校准和矫正之后,我能够从我的立体相机的摄像头中提取出一个相当精确的视差图。该图包含正确的视差值,因为当我将它们转换为度量距离时,它们非常准确。 现在,如果不进行任何处理,我的视差图看起来就像这样:

Rectified Image on the left, disparity Map on the right, Below the correct estimation of my forehead (~0.5 meters, white dot on the disparity map)

左侧为校正后的图像,右侧为视差图,下方为我的额头正确估计值(约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),我应用了它,这些是初始的不良结果:

Upper right disparity map, Upper left WLS filtered disp map, bottom right confidence map

上右视差图,上左WLS滤波的视差图,下右置信度图。可以看到,WLS滤波后的结果很差,实际上置信度图大部分是黑色的(深度值完全错误)。
通过调整SGBM参数,我得到了:

Upper left color map (easier to see the depth perspective), upper right WLS disp, lower left confidence map, lower right unfiltered disp map

左上角是颜色图(更容易看出深度透视),右上角是WLS位移,左下角是置信度图,右下角是未经过滤的位移图。

当置信度图为白色时,高置信度区域已正确过滤(可以从颜色图和WLS过滤图中看到),它们的深度信息与未经过滤的位移图相当。

我的问题是,无论我尝试什么,都无法获得更近物体的高置信度,比如上面图像中的人物。我尝试了一切。

总之,我的问题是: 是否有一种方法可以获得整个视野的平滑、清晰和时间稳定的视差图(类似于我在墙壁和走廊后面所得到的)?我应该坚持使用WLS过滤还是使用其他过滤器?如果是这样,你有什么建议?

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

谢谢!


很抱歉,这个问题不适合在SO上讨论。 - Slava
这怎么是离题的? - Marco Beccarini
SO是关于特定的编程问题,尤其是当你使用C++标签时。这只是我的观点,不过那个踩的不是我。 - Slava
1个回答

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是规范化之前的视差图,然后对获得的滤波视差图进行规范化处理,可以得到更好的结果,置信度图几乎完全为白色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接