

minDisparity:最小视差,默认为0。此参数决定左图中的像素点在右图匹配搜索的起点,int 类型;
numDisparities:视差搜索范围长度,其值必须为16的整数倍。最大视差 maxDisparity = minDisparity + numDisparities -1;
blockSize:SAD代价计算窗口大小,默认为5。窗口大小为奇数,一般在33 到2121之间;
P1、P2:能量函数参数,P1是相邻像素点视差增/减 1 时的惩罚系数;P2是相邻像素点视差变化值大于1时的惩罚系数。P2必须大于P1。需要指出,在动态规划时,P1和P2都是常数。
一般建议:P1 = 8cnsgbm.SADWindowSizesgbm.SADWindowSize;P2 = 32cnsgbm.SADWindowSizesgbm.SADWindowSize;
总结:
- blockSize(SADWindowSize) 越小,也就是匹配代价计算的窗口越小,视差图噪声越大;blockSize越大,视差图越平滑;太大的size容易导致过平滑,并且误匹配增多,体现在视差图中空洞增多;
- 惩罚系数控制视差图的平滑度,P2>P1,P2越大则视差图越平滑;
- 八方向动态规划较五方向改善效果不明显,主要在图像边缘能够找到正确的匹配;
第二部分:opencvSGBM算法的参数含义及数值选取
一 预处理参数
1:preFilterCap:水平sobel预处理后,映射滤波器大小。默认为15
int ftzero =max(params.preFilterCap, 15) | 1;
opencv测试例程test_stereomatching.cpp中取63。
二 代价参数
2:SADWindowSize:计算代价步骤中SAD窗口的大小。由源码得,此窗口默认大小为5。
SADWindowSize.width= SADWindowSize.height = params.SADWindowSize > 0 ?params.SADWindowSize : 5;
注:窗口大小应为奇数,一般应在3x3到21x21之间。
3:minDisparity:最小视差,默认为0。此参数决定左图中的像素点在右图匹配搜索的起点。int 类型
4:numberOfDisparities:视差搜索范围,其值必须为16的整数倍(CV_Assert( D % 16 == 0 );)。最大搜索边界= numberOfDisparities+ minDisparity。int 类型
三 动态规划参数
动态规划有两个参数,分别是P1、P2,它们控制视差变化平滑性的参数。P1、P2的值越大,视差越平滑。P1是相邻像素点视差增/减 1 时的惩罚系数;P2是相邻像素点视差变化值大于1时的惩罚系数。P2必须大于P1。需要指出,在动态规划时,P1和P2都是常数。
5:opencv测试例程test_stereomatching.cpp中,P1 = 8cnsgbm.SADWindowSize*sgbm.SADWindowSize;
6:opencv测试例程test_stereomatching.cpp中,P2 = 32cnsgbm.SADWindowSize*sgbm.SADWindowSize;
四:后处理参数
7:uniquenessRatio:唯一性检测参数。对于左图匹配像素点来说,先定义在numberOfDisparities搜索区间内的最低代价为mincost,次低代价为secdmincost。如果满足
即说明最低代价和次第代价相差太小,也就是匹配的区分度不够,就认为当前匹配像素点是误匹配的。
opencv测试例程test_stereomatching.cpp中,uniquenessRatio=10。int 类型
8:disp12MaxDiff:左右一致性检测最大容许误差阈值。int 类型
opencv测试例程test_stereomatching.cpp中,disp12MaxDiff =1。
9:speckleWindowSize:视差连通区域像素点个数的大小。对于每一个视差点,当其连通区域的像素点个数小于speckleWindowSize时,认为该视差值无效,是噪点。
opencv测试例程test_stereomatching.cpp中,speckleWindowSize=100。
10:speckleRange:视差连通条件,在计算一个视差点的连通区域时,当下一个像素点视差变化绝对值大于speckleRange就认为下一个视差像素点和当前视差像素点是不连通的。
opencv测试例程test_stereomatching.cpp中,speckleWindowSize=10。
















