离AD-Census的理论教学结束两周有余,博主并没有闲着,一直在耕耘AD-Census的源码,此篇的开始意味着源码工作已经完成,完整代码已开源在我的Github仓库,供大家下载。

本次系列我们依旧采取代码教学的方式,大家下载代码后,可以把我的博客当做一本工具书,有不懂的部分就来这里找找答案。即使代码里已经加了丰富的注释,但是难免也会遇到晦涩难懂之处,博主的注释有肯定有所纰漏和错误,此博客系列也正好做一个补充。单独读完本系列也是完全可以的,心中会对代码有个整体的理解,再去看代码就会更加通透。

本篇的内容是系列的第一篇,我们按照惯例,介绍AD-Census的算法框架和代码框架。

先贴一下AD-Census的效果图:

【码上实战】【立体匹配系列】经典AD-Census: (1)框架-LMLPHP 【码上实战】【立体匹配系列】经典AD-Census: (1)框架-LMLPHP 【码上实战】【立体匹配系列】经典AD-Census: (1)框架-LMLPHP 【码上实战】【立体匹配系列】经典AD-Census: (1)框架-LMLPHP

熟悉我博客的同学可能想看看AD-Census和前两个算法SGM和PatchMatch算法的效果有啥差别,从该实例数据来看,效果上PatchMatch>AD-Census>SGM,而效率上则是SGM>AD-Census>PatchMatch。AD-Census更像是不偏科的全能型选手,在效率和效果上做了一个平衡。

我们来看本篇的内容:

【码上实战】【立体匹配系列】经典AD-Census: (1)框架

算法框架

算法理论部分博主就不再赘述细节,请参看系列文章:

总的来说,AD-Census依次包括4个步骤:

  • (1)代价计算(Cost Compution)
  • (2)十字交叉域代价聚合(Cross-based Cost Aggregation)
  • (3)扫描线优化(Scanline Optimization)
  • (4)多步骤视差优化(MultiStep Refinement)

第一步代价计算需要计算AD代价和Census代价,最终融合成AD-Census代价。

第二步十字交叉域代价聚合分为两小步,第一小步是计算每个像素的十字交叉臂,第二步是对所有像素进行十字交叉臂聚合。

第三步扫描线优化和SGM的代价聚合步骤一样,从四个方向进行优化。

第四步多步骤视差优化共有六个小步骤,分别是:

  1. 离群点检测(Outlier Detection)
  2. 迭代局部投票法填充(Iterative Region Voting)
  3. 内插填充(Proper Interpolation)
  4. 非连续区视差调整(Depth Discontinuity Adjustment)
  5. 子像素优化(Sub-pixel Enhancement)
  6. 中值滤波(Median Filter)

通过以上的梳理,框架图可以如下方式绘制:

【码上实战】【立体匹配系列】经典AD-Census: (1)框架-LMLPHP

代码框架

我们之所以绘制算法框架,就是为代码框架做指导,所以代码框架整体上会跟随算法框架的思路,在局部做一些细微的调整。

我们先看看代码文件:
【码上实战】【立体匹配系列】经典AD-Census: (1)框架-LMLPHP
代码结构还是比较清晰的,一个独立的功能模块我都会写成一对cpp/h,从文件名就可以大概知道模块的含义。基于上面的算法架构,我绘制了一个代码框架图:

【码上实战】【立体匹配系列】经典AD-Census: (1)框架-LMLPHP

下面我们具体对代码文件进行解读。

(1)主体实现类
AD-Census的算法主体类,包含唯一的类ADCensusStereo。头文件ADCensusStereo.h里是类的接口定义,源文件ADCensusStereo.cpp里是类的功能实现。主体类是算法使用者直接调用的类,通过主体类成员函数即可完成AD-Census匹配得到视差图。

(2)代价计算器类
实现AD-Census的代价计算模块所有功能函数,代价计算相关的所有实现都集成在代价计算器类CostComputor中,例如灰度图计算、Census变换、AD以及Census代价计算等。主体类通过实例化代价计算器类完成代价计算。

(3)代价聚合器类
实现AD-Census的代价聚合模块所有功能函数,代价聚合相关的所有实现都集成在代价聚合器类CosAggregator中,例如十字交叉域的构建、代价沿十字交叉域的聚合等。主体类通过实例化代价聚合器类完成代价聚合。

(4)扫描线优化器类
实现AD-Census的扫描线优化模块所有功能函数,扫描线优化相关的所有实现都集成在扫描线优化器类ScanlineOptimizer中,例如水平、竖直方向的扫描线优化等。主体类通过实例化扫描线优化器类完成扫描线优化。

(5)多步优化器类
实现AD-Census的多步视差优化模块所有功能函数,多步视差优化相关的所有实现都集成在多步优化器类MultiStepRefiner中,例如离群点检测、视差填充、非连续区视差调整等。主体类通过实例化多步视差优化器类完成多步视差优化。

(6)工具包
工具包内实现一些通用的工具,如census变换、汉明距离计算、中值滤波。以命名空间adcensus_util组织。

(7)基础类型定义
包含一些基础类型的定义,包括:

  1. 基础类型别名定义 sint32/float32…
  2. 参数结构体定义:ADCensusOption
  3. 颜色梯度结构体定义:ADColor

以上就是整个代码结构的描述,看完大家应该对整个代码有个整体了解,后面的博文将给大家讲解每一个模块每一个类具体的实现细节。

代码注释这块博主很重视,尽量让大家能快速看懂代码,代码风格也遵循google规范,希望带给大家的是一份高质量代码。

当然,博主能力有限,不免会有错误纰漏,欢迎大家在博主的Github开源仓库及博客里热烈讨论,博主也会参与进来,和大家一起交流。

08-30 15:44