码上实战立体匹配系列经典AD-Census: 框架

Posted 李迎松~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了码上实战立体匹配系列经典AD-Census: 框架相关的知识,希望对你有一定的参考价值。

下载AD-Census完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census
欢迎同学们在Github项目里讨论,如果觉得博主代码质量不错,右上角点颗星!感谢!

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

仓库地址:https://github.com/ethan-li-coding/AD-Census

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

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

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

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

我们来看本篇的内容:

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

算法框架

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

【理论恒叨】【立体匹配系列】经典AD-Census:(1)代价计算
【理论恒叨】【立体匹配系列】经典AD-Census: (2)十字交叉域代价聚合(Cross-based Cost Aggregation)
【理论恒叨】【立体匹配系列】经典AD-Census: (3)扫描线优化(Scanline Optimization)
【理论恒叨】【立体匹配系列】经典AD-Census: (4)多步骤视差优化

总的来说,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)

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

代码框架

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

我们先看看代码文件:

代码结构还是比较清晰的,一个独立的功能模块我都会写成一对cpp/h,从文件名就可以大概知道模块的含义。基于上面的算法架构,我绘制了一个代码框架图:

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

(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开源仓库及博客里热烈讨论,博主也会参与进来,和大家一起交流。

下载AD-Census完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census
欢迎同学们在Github项目里讨论,如果觉得博主代码质量不错,右上角点颗星!感谢!

博主简介:
Ethan Li 李迎松(知乎:李迎松)
武汉大学 摄影测量与遥感专业博士
主方向立体匹配、三维重建
2019年获测绘科技进步一等奖(省部级)

爱三维,爱分享,爱开源
GitHub: https://github.com/ethan-li-coding (欢迎follow和star)

个人微信:

欢迎交流!

关注博主不迷路,感谢!
博客主页:https://ethanli.blog.csdn.net

以上是关于码上实战立体匹配系列经典AD-Census: 框架的主要内容,如果未能解决你的问题,请参考以下文章

码上实战立体匹配系列经典AD-Census: 多步骤视差优化

码上实战立体匹配系列经典AD-Census: 代价计算

码上实战立体匹配系列经典AD-Census: 扫描线优化

码上实战立体匹配系列经典AD-Census: 十字交叉域代价聚合

码上实战立体匹配系列经典SGM:代价计算

码上实战立体匹配系列经典PatchMatch: 框架