嘿,咱们来聊聊SGM立体匹配吧。虽然我第一次接触它是在2014年,当时觉得它特别高冷,不太好懂。但最近我重新读了2008年CVPR那篇论文,感觉它比我想象的亲切多了。SGM的核心在于三个假设,它们就像三把钥匙,把弱纹理、视差优化和平面近似这三个难题一个个解开。 这篇文章给你拆解一下SGM的六大步骤:框架、代价、聚合、视差、优化和填充。一开始作者就提出了三大假设,这些假设虽然不是绝对真理,但在大多数情况下成立,给后续的优化铺平了道路。第一个假设是弱纹理区域不存在视差,意味着没有显著亮度差异的区域。第二个假设是弱纹理区内部存在可见纹理,纯色区域无法提供线索。第三个假设是表面可以用平面近似,虽然有些表面可能不规则,但很多情况下足够平坦。 为了给弱纹理区域贴上标签,SGM用Mean-Shift算法把图像分割成颜色相近的小块。比如在OpenCV的示例中,红点聚集的地方就是颜色同质区。面积小的碎块会被舍弃,只有大块才会被标记为待优化目标。然后对每个大块继续切分视差连通块。如果块内找不到连通块,就说明没有可见纹理。 接下来就是对每个Si块内的视差连通块Sik进行平面拟合。SGM用平面方程外推整块无效像素的视差。能量函数Eik设计成平滑与忠诚度之间的平衡项,论文默认λ值为0.5。 最后一步就是把计算好的视差值写回原图了。遮挡区域需要特别处理标记出来,非遮挡的弱纹理块直接用平面外推值填充。边缘与纹理交界处保留原始SGM结果,避免过度平滑。 从假设到分割、从拟合到填充,SGM用一套简单流程解决了立体匹配中最棘手的问题之一——弱纹理。虽然它并不完美,但给出了一条可行思路:先降维再升维。用平面近似替换三维非线性优化,既能保证速度又能保持精度。读懂这套打法后,遇到灰白墙、镜面或者玻璃这种情况时你也能从容应对了。