转载请说明出处:http://blog.csdn.net/zhubaohua_bupt/article/details/51866567算法
这段时间对opencvSGBM半全局立体匹配算法进行了比较细致的研究,现总结一下。函数
本文先描述一下opencvSGBM算法流程,接着给出调用opencvSGBM须要设置参数的含义、数值选取以及运行效果,最后贴出opencvSGBM源码。测试
第一部分:SGBM算法研究总结:ui
整个算法实现分为spa
1预处理.net
2代价计算blog
3动态规划(默认4条路径)源码
4后处理it
这四个步骤。下面分别说明一下各个步骤:io
预处理
Step1:SGBM采用水平Sobel算子,把图像作处理,公式为:
Sobel(x,y)=2[P(x+1,y)-P(x-1,y)]+ P(x+1,y-1)-P(x-1,y-1)+ P(x+1,y+1)-P(x-1,y+1)
Step2:用一个函数将通过水平Sobel算子处理后的图像上每一个像素点(P表示其像素值
)映射成一个新的图像:PNEW表示新图像上的像素值。
映射函数:
preFilterCap 为一个常数参数,opencv缺省状况下取15,例程中取63。
预处理其实是获得图像的梯度信息。
经预处理的图像保存起来,将会用于计算代价
代价计算
代价有两部分组成:
1通过预处理获得的图像的梯度信息通过基于采样的方法获得的梯度代价
2原图像通过基于采样的方法获得的SAD代价
上述两个代价都会在SAD窗口内进行计算。
关于什么是基于采样的方法,参考论文:DepthDiscontinuities by Pixel-to-Pixel Stereo 在计算代价的时候,用基于采样的方法效果会好一些。
动态规划
规划公式: