目录
什么是SGBM
SGBM(Semi-Global Block Matching)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SGBM)。它是基于全局匹配算法和局部匹配算法的优缺点,提出了一种折中的方法,既能保证视差图的质量,又能降低计算复杂度。
SGBM的原理
SGBM的原理可以分为以下几个步骤:
-
预处理:使用水平Sobel算子对左右图像进行边缘检测,得到梯度图像。
-
匹配代价计算:对于每个像素,计算其在不同视差下与对应像素的匹配代价,通常使用绝对差或平方差作为代价函数。
-
能量函数最小化:对于每个像素,定义一个能量函数,包括数据项和平滑项。数据项表示匹配代价,平滑项表示相邻像素的视差连续性。使用动态规划的方法,沿着多个方向(通常为8个或16个)计算累积代价,并求取最小值作为最终代价。
-
视差图生成:对于每个像素,根据最终代价选择最佳视差,并生成视差图。
-
视差图后处理:对于视差图中的异常值或空洞,使用一些后处理方法进行修复或填充,例如中值滤波、WLS滤波等。
SGBM的参数
SGBM的参数有以下几个:
-
minDisparity:最小视差值,默认为0。
-
numDisparities:视差范围,默认为16。必须是16的整数倍。
-
blockSize:匹配块大小,默认为3。必须是奇数且大于1。
-
P1:控制视差平滑度的第一个参数,默认为8blockSizeblockSize。P1越大,越倾向于生成连续的视差图。
-
P2:控制视差平滑度的第二个参数,默认为32blockSizeblockSize。P2越大,越倾向于消除小的视差变化。P2必须大于P1。
-
disp12MaxDiff:左右一致性检查时允许的最大视差差异,默认为-1,表示不进行检查。
-
preFilterCap:预处理时截断梯度值的上限,默认为63。
-
uniquenessRatio:唯一性检查时的阈值,默认为10。表示最佳视差值与次佳视差值之间的比例要大于该阈值才被认为是有效的。
-
speckleWindowSize:消除噪声斑点时考虑的窗口大小,默认为0,表示不进行消除。
-
speckleRange:消除噪声斑点时考虑的最大视差变化,默认为0,表示不进行消除。
-
mode:SGBM算法选择模式,默认为StereoSGBM::MODE_SGBM。可选值有StereoSGBM::MODE_SGBM_3WAY(速度快)、StereoSGBM::MODE_HH4(速度慢)、StereoSGBM::MODE_SGBM(速度中等)、StereoSGBM::MODE_HH(速度慢)。
SGBM的参数变化
下面通过调整每个参数来观察其影响效果:初始值设置:
minDisparity = 0
numDisparities = 16
blockSize = 3
P1 = 8*blockSize*blockSize
P2 = 32*blockSize*blockSize
disp12MaxDiff = -1
preFilterCap = 63
uniquenessRatio = 10
speckleWindowSiz