让大家久等了,一来最近博主工作比较忙;二来PatchMatchSteteo的代码博主是第一次写,并不像SGM写起来迅疾如飞,而是不断的斟酌代码、调试结果,直到结果达到预期才敢上传到博主的Github开源仓库,不敢马虎。
和之前SGM的代码教学不一样,这次博主准备换一种教学方式,因为PatchMatchSteteo的代码博主已经全部写完且上传到Github了,所以像SGM一样一步步教学显得有点奇怪,这次我们就以代码讲解的方式进行,同学们下载代码后,边看代码边看博主的博客,理解的会更快!
好了,废话不多说,先从博主的GIthub仓库里下载代码吧?
点击进入: Github - PatchMatchStereo
欢迎同学们在Github项目里讨论,如果觉得博主代码质量不错,给颗小星星,以及Follow Me!感激不尽!
【码上实战】【立体匹配系列】经典PatchMatch: (1)框架
- 算法框架
- 代码框架
算法框架
首先,介绍下PatchMatchStereo(后面简称PMS)算法的框架,详细理论博主不再详说,请参考前几篇博客:
【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型
【理论恒叨】【立体匹配系列】经典PatchMatch: (2)基于PatchMatch的视差估计
【理论恒叨】【立体匹配系列】经典PatchMatch: (3)后处理(一致性检查与视差填充)
PMS的实现就是依次执行三大步:
- (1)随机初始化
- (2)迭代传播
- (3)后处理
第(1)步随机初始化的操作是为每个像素随机一个视差和法线,并计算出视差平面。
而第(2)步迭代传播又包括依次执行的四小步:
- 空间传播(Spatial Propagation)
- 视图传播(View Propagation)
- 时序传播(Temporal Propagation)
- 平面优化(Plane Refinement)
第(3)步后处理包括依次执行的三小步:
- 一致性检查(Left-Right Consistency Check)
- 视差填充(Fill)
- 加权中值滤波(Weighted Median Filter)
所以框架这样画:
博主的代码也是遵循这样的框架编写,唯一区别在于博主并未实现时序传播,原因有三:首先这样的场景太特殊,难找到测试数据;其次PatchMatchStereo的效率实在是支撑不了视频立体;第三点是即使不做时序传播,结果也已经非常出色。
代码框架
先看看工程里的代码文件:
大家可以看到代码量并不多,工程里和PMS有关的文件也不到十个(打钩的文件),博主画了一个图来说明代码结构,描述每个代码文件所代表的功能模块:
(1)主体实现类
PMS的主体实现代码,包含唯一的类:PatchMatchStereo。头文件PatchMatchStereo.h里是类的定义,源文件PatchMatchStereo.cpp里是类的实现。
(2)代价计算器
cost_computer.hpp文件中,实现了PMS的代价计算器,以基类-派生类的方式编写,基类CostComputer是空基类,不包含具体的代价计算实现;CostComputerPMS是CostComputer的派生类,实现了PMS论文中的代价计算方式。设计基类-派生类架构的目的是为了让使用者可以以派生类的方式自己实现想要实现的代价计算器。
(3)迭代传播类
PMS的迭代传播实现类PMSPropagation在头文件pms_propagation.h及源文件pms_propagation.cpp中实现,包含PMS的迭代传播所有步骤。
(4)类型定义
在pms_types.h文件中,代码实现了PMS的
- 基础类型别名定义 sint32/float32…
- 参数结构体定义:PMSOption
- 颜色梯度结构体定义:PColor/PGradient
- 2/3维矢量定义:PVector2f/PVector3f
- 视差平面结构体定义:DisparityPlane
这样大家就差不多对代码的框架有个较为清晰的认识了。再结合代码里的注释,相信大家心中有谱了。
注释这块博主很重视,尽量让大家能快速看懂代码,代码风格也遵循google规范,希望带给大家的是一份高质量代码。
当然,博主能力有限,不免会有错误纰漏,欢迎大家在博主的Github开源仓库及博客里热烈讨论,博主也会参与进来,和大家一起交流。
博主简介:
Ethan Li 李迎松
武汉大学 摄影测量与遥感专业博士
主方向立体匹配、三维重建
2019年获测绘科技进步一等奖(省部级)
爱三维,爱分享,爱开源
GitHub: https://github.com/ethan-li-coding
邮箱:ethan.li.whu@gmail.com
个人微信:
欢迎交流!
喜欢博主的文章不妨关注一下博主的博客,感谢!
博客主页:https://blog.csdn.net/rs_lys