对于SGBM算法原理不多介绍啦,这里只是结合KITTI标准数据集以及opencv环境下,介绍SGBM参数的含义以及设置。
(感谢开放的学术环境,这里也只是对王泽远硕士的论文进行学习和总结,若有侵权部分,请联系作者删除。)
opencv中对于SGBM算法需要设置很多参数,这些参数都会或多或少的影响到最终匹配结果。概括来说,把这些参数分为三类:
1.预处理滤波参数
这部分参数对输入图像进行预处理,来消减光照不均匀、噪声等因素的影响。
preFilterType:预处理滤波器类型。有两种可选类型:CV_STEREO_BM_NORMALIZED_RESPONSE(归一化响应) 或者 CV_STEREO_BM_XSOBEL(水平方向Sobel算子,默认类型), 该参数为 int 型;
preFilterSize:预处理滤波器窗口大小。
preFilterCap:预处理滤波器的截断值。预处理的输出值仅保留[-preFilterCap, preFilterCap]范围内的值,参数范围:1 - 31。
2.SGBM状态参数
SADWindowSize:SAD窗口大小,容许范围是[1,11],一般应该在 3x3 至 11x11 之间,参数必须是奇数,int 型;
minDispariy:最小视差;
numberofDisparities:最大视差值与最小视差值之差;
PI,P2:控制视差变化平滑性的参数:根据半全局立体匹配优化函数的定义,选取较大的P1、P2值会较平滑的视差结果。P1是用来惩罚相邻像素点视差增减变化;P2是用来约束视差连续性的惩罚系数;
fullDP:决定是否使用双通道动态编程算法提高运算效率的布尔值参数。
3.处理参数
textureTheshold:低纹理区域的判断阈值。
uniquenessRatio:视差唯一性百分比。
speckleWindowSize:检查视差连通区域变化度的窗口大小。
speckeRange:视差变化阈值,当窗口内视差变化大于阈值时,该窗口内的视差清零
对与KITTI数据集,采用下表参数设置可以得到个较好的效果。
设置 | KITTI数据集 |
---|---|
图像分辨率 | 1241*376 |
preFilterType | 63 |
SADWindowSize | 11 |
P1 | SADWindowSizeSADWindowSize4 |
P2 | SADWindowSizeSADWindowSize32 |
minDispariy | 0 |
numberofDisparities | 64 |
uniquenessRatio | 10 |
speckleWindowSize | 100 |
spckleRange | 32 |
FullDP | 1 |
效果图如下: