![1a232e251a0fd143ac1482e3c5aedf12.png](https://i-blog.csdnimg.cn/blog_migrate/93ad65c116ef3d85b9c33ce5f6072d35.jpeg)
“读一份好源码,就是和许多智慧的人谈话“。
本文记录了笔者学习 openMVG 开源软件的一些初步经验和心得。如果你对计算机视觉和摄影测量有兴趣,需要用到相关技术,这篇文章正好就是你的菜。
全文约4500字,含11副图,阅读时间大约13分钟。
觉得有用可以转发给身边同学、朋友,如有不同意见欢迎在后台留言与我探讨。
整理/撰写: calman
校稿/排版: 迷途兄
测试环境 : Windows 7 64位 + Visual Studio 2015
1 简要介绍
openMVG (open Multiple View Geometry):是一个计算机视觉领域处理多视角立体几何的著名开源库 [1,2],信奉“简单,可维护”,提供了一套强大的接口,每个模块都被测试过,尽力提供一致可靠的体验。软件所针对的基于影像的三维重建任务,在摄影测量、计算机视觉、机器人等领域都有着重要的应用,是近年来热门的无人机、自动驾驶、SLAM等技术的重要组成部分[3,4]。
![f14c1066a5b4815d5fca670eaa444f81.png](https://i-blog.csdnimg.cn/blog_migrate/a954a2c2c7f54d931730040bde4088e2.png)
openMVG能够:
- 准确计算多视角立体几何模型;
- 提供SfM(Structure from Motion)重建需要的特征提取和匹配方法;
- 完整的SfM工具链;
openMVG尽力提供可读性强的代码,方便二次开发,核心库尽可能精简,分成了几个大的模块:
- 核心库:各个功能的核心算法实现;
- 样例:教你怎么用核心库实现高级算法;
- 工具链:也就是连起来用咯(无序影像特征匹配,完整SfM,影像色彩处理);
openMVG由Pierre Moulon 在2010年读博时开始设计,并于2013年在http://github.com网站发布v0.1版本,目前已改进到v1.5版本。GitHub统计数据有60多位contributors,处理252个requests、1184个issues,已成为Structure from Motion、Photogrammetry、3D reconstruction的活跃社区。源码由CMakeList工具组织,支持Windows和Linux系统,主要分为5个部分:
- /src/openMVG 是多视图几何(MVG)和SfM的核心库;
- /src/openMVG_Samples 展示如何使用核心库实现高级算法,主要涉及相对定向、特征匹配的鲁棒策略等;
- /src/software 提供用户使用的软件接口,主要实现了SfM及可视化,视觉里程计(Visual Odometry),地理坐标系转换,UI便于输入控制点数据;
- /src/dependencies 依赖库,包括GLFW, OPENEXIF, OSI CLP;
- /src/third_party 是底层第三方库,主要有ceres-solver,eigen,fast,stlplus3,jpeg等;
经过简单编译,无论是专业或非专业人员均可利用openMVG重建出一组无序影像的稀疏三维场景或模型。其三维重建的能力已应用于考古软件(Arc-Team [5]),医疗影像服务(Ebrafol [6]),地理信息系统的相关实验室(DHLAB [7])
2 代码分析
核心库的各个模块名称、功能、包含的文件数如下表所示:
![1329f32e1d971f3217964315b00b5062.png](https://i-blog.csdnimg.cn/blog_migrate/7753b27941ad59aaff4ef9a52580623d.jpeg)
2.1 外部第三方库
openMVG不鼓励重复造轮子,部分功能使用了已存在、设计良好的第三方软件库,并附带在openMVG的目录中方便编译和使用。这些库的名称及具体功能如下:
ceres-solver:一个便携式C++库,可用于建模和解决大型复杂的非线性最小二乘问题。 cxsparse