最近总有一个困惑,论文或者说研究中的立体匹配算法和OpenCV中实现的立体匹配算法有什么对应关系,特别是经常看到资料中一谈到OpenCV立体匹配函数,就是BM、SGBM和GC成套的出现,那么这三个算法的理论来源是什么,它们三个是什么样的“江湖地位”,OpenCV还有没有实现其他算法没有被介绍,在这里,对这些问题做个小总结。遗漏的地方欢迎大家批评补充。
1.立体匹配算法分类:从算法本身的角度来说,立体匹配从大的方面分为两种,全局匹配和局部匹配。全局匹配比较经典的有动态规划、图割和置信度传播等,全局匹配算法优点是精度高,缺点是计算速度慢,实时性差;而局部匹配又分为基于区域的匹配,基于特征的匹配等。局部匹配优点是速度快,可以满足实时的要求,但是精度不如前者,基于区域的匹配精度尚可以接受,基于特征的匹配则只能得到稀疏的视差,需要靠插值完成视差图重建,如果要考察整个图的视差精度,则基于特征法不可靠。
2.OpenCV实现的算法:
2.1基于特征提取+匹配:OpenCV实现了十种特征检测方法,包括SURF、SIFT、ORB、FAST特征等,提取到特征以后使用BruteForceMatcher或FlannBasedMatcher匹配器进行匹配, 一个小例子可参见blog.csdn.net/zilanpotou182/article/details/68061929;
2.2基于区域的匹配,最具代表性的就是BM法了,关于BM法的理论来源提到的很少,偶然看见有人说是《Small Vision Systems: Hardware and Implementation》(http://blog.csdn.net/wangyaninglm/article/details/45287027),读完后觉得比较可靠,文章介绍了一种适合微处理器和FPGA使用的立体视觉算法,并且提出区域立体匹配算法典型的五步(直译&烂译):
(1)极线校正;
(2)图像转换,由考察单像素间的匹配性变为考察像素点局部区域的同一匹配性;
(3)求区域的匹配度,对参考图中的某区域,考察目标图的特定区域与之的匹配度;
(4)得到视差图,视差图每个点代表参考图和目标图中以此点为中心的区域的匹配度的值;
(5)后置滤波:筛除误匹配点,文中比较了几种视差图后处理方法;
而作者提出的一种具体的实施方案是极线校正+LOG滤波+SAD+弱纹理区域处理+左右一致性校验。所以我认为来源问题是可能是作者首先提出这种大体上的思路,但是OpenCV在此基础上进行了优化或者拓展。OpenCV具体怎么实现的BM算法,可以看《学习OpenCV》第十二章的内容。另外,维基上也列举了几种具体的算法实现https://en.wikipedia.org/wiki/Block-matching_algorithm#External_links。
2.3全局匹配:主要是SGBM和GC算法,这两种的理论来源很清楚,分别是《 Stereo Processing by Semiglobal Matching and Mutual Information》和《Realistic CG Stereo Image Dataset with Ground Truth Disparity Maps》,里面对于算法的执行比较清楚。
3.GC、SGBM、BM算法的比较和“江湖地位”
最后一个问题,为什么提到立体匹配算法,都会同时提这三种方法呢,答案是:本来就没几种,而且这三种性能相对比较好。OpenCV立体匹配算法结构图可以看出,OpenCV3.2版本里面只有StereoBM和StereoSGBM(OpenCV3.2里面没有找到GC算法,不知道是不是因为太慢了)。
以上便是对立体匹配算法暂时的整理,当你对一个问题没有十分透彻的了解时,想写一个全面的总结简直就是胡扯,所以我把题目加上了更新中,边学边整理吧。