立体匹配算法推理笔记 - SGBM算法(一)一、SGBM与SGM的区别SGBM(Semi-Global Block Matching)算法的核心为非常经典的SGM(Semi-Global Matching)算法,并且SGBM算法自OpenCV2.4.6开始就已经被开源,方便且被广泛使用。SGM算法与SGBM算法的关系:SGM算法只是SGBM算法中的一个步骤。SGBM中的“Block”指的是将每一个代价(cost)值进行成块计算(领域求和运算)后用于SGM算法进行视差优化。SGBM算法流程示意图:二、代价计算SGBM算法的代价计算包含以下基本步骤:输入图像经过SobelX处理后,计算BT代价:SobelX是对原图进行水平方向的梯度滤波。得到的水平方向梯度并没有直接使用,而是进行了分段处理。BT代价值的计算公式可参考论文《Depth Discontinuities by Pixel-to-Pixel Stereo》。输入图像直接计算BT代价值:直接在原图上进行BT的计算。将上面两步的代价值进行融合:将两种代价值进行简单的相加。对上述步骤得到的代价值进行成块处理:对每个像素的代价值用周围邻域代价值的总和来代替(类似SAD算法),提高匹配的鲁棒性。两种代价计算的区别:SobelX + BT:保留了较多的边缘和细节信息。原图计算BT:保留了更多的原图信息。梯度与BT代码融合对比图:代价融合与成块处理:代价融合:将两种代价值进行相加。代价成块:对每个像素的代价值用周围邻域代价值的总和来代替。注意事项:在尝试自己编写代码时,可能在结果上会有细微的不同,这与原图计算BT的方式有关。成块计算时,随着成块尺寸的变大,整体效果越好,但边缘会变得越平滑。不同成块尺寸的结果图:总结:代价计算是SGBM算法的重要步骤之一,通过融合不同的代价计算方式,可以提高代价值的准确性。成块处理可以进一步提高匹配的鲁棒性,但需要注意成块尺寸的选择,以平衡整体效果和边缘细节。代价计算往往只能得到较好的初始视差图,想要得到更好的视差图还需要后面多个步骤的优化。接下来,我们将继续深入探讨SGBM算法的其他部分,包括代价聚合、视差计算和后处理等步骤,请期待本专栏《立体匹配算法推理笔记》下一期的文章:《SGBM算法详解(二)》。



































