OpenMVG 系列 (1):入门简介
1 OpenMVG 简介
全称 Open Multiple View Geometry,是法国人 Pierre Moulon 读博期间开源的一个 C++ 库
最早版本 OpenMVG 0.1 是 2013年 2月 发布的,目前最新版本是 2020年 5月 发布的 OpenMVG 1.6
LinkedIn 显示,此前一直在 Zillow Group 的 Pierre,于 2020年 11月 跳槽到 Facebook Reality Labs 担任 Research Scientist
Reality Labs 聚焦的是 AR/VR 技术,和 Pierre 的研究方向契合,希望 Pierre 大神工作顺利,闲暇时继续完善 OpenMVG

2 功能模块
OpenMVG 奉行“简单、易维护”的原则,代码具有很强的可读性,非常方便二次开发
整个功能模块由若干核心库组成,主要围绕两大类问题:1是多视图几何的基本问题;2是运动结构恢复 sfm
2.1 多视图几何
Multiple View Geometry 简称 MVG,包含三个关键矩阵:一个是单应矩阵 $x_{i}^{'}=Hx_{i} $,参见博文 OpenCV 之 平面单应性

另两个是基础矩阵 $x_{i}^{'T}F x_{i}=0$,本质矩阵 $E=R[t]x=K^{'T}FK$

例如,已知四组对应特征点坐标,用 DLT 算法求解单应矩阵 H,代码如下:
// Setup left, right corresponding points and solve for H
openMVG::Mat xLeft(2, 4), xRight(2, 4); // Instantiation of homography solver
using H_Solver = openMVG::homography::kernel::FourPointSolver; // Perform model solving
std::vector<openMVG::Mat3> Hs;
H_Solver::Solve(xLeft, xRight, &Hs);
2.2 运动结构恢复
Structure From Motion 简称 SFM,是从一系列图像序列中恢复相机位姿,构建三维场景 (稀疏点云) 的过程

图像序列 Structure from motion 三维场景 (稀疏点云)
OpenMVG 中实现了 SFM 的两种算法:增量式和全局式。一次完整的 SFM 实现流程,如下所示:

2.3 第三方库
对于一些基础功能,OpenMVG 没有重复造轮子,直接集成了许多好用的第三方库,如下:
3 编译配置
3.1 环境和工具
- Win10 64bit
- VS 2019 社区版 (地址: https://www.visualstudio.com/downloads/)
- CMake 解压版 (地址: https://cmake.org/download/)
3.2 文件准备
- OpenMVG,地址:https://github.com/openMVG/openMVG/releases
注意:上述地址下载的压缩包,最终编译有时会报错,不如在 PowerShell 中 Git 下载的稳定
$ git clone --recursive https://github.com/openMVG/openMVG.git
- 依赖项,下载 glw,osi_clp 和 cereal,解压后放在 openMVG\src\dependencies 中,此目录内已有对应文件夹,但里面的内容是空的
glw,地址:https://github.com/elmindreda/glfw/releases
osi_clp,地址:https://github.com/openMVG-thirdparty/osi_clp/releases
cereal,地址:https://github.com/USCiLab/cereal/releases
3.3 CMake 配置
使用 cmake-gui,source 选择解压后的 src,build 选择自建的文件夹
先 Configure 再 Generate,然后点击 "Open Project” 在 VS 中打开工程
注:第一次 Configure 可能有红色报错,找到原因后更改 CMake 配置,再点击 Configure 即可

3.4 编译
打开 openMVG.sln 后,在 VS 2019 中分别编译 Debug 和 Release 模式,生成相应的 lib 文件
4 SFM 例程
下面以 Sceaux 城堡图片集为例,执行 OpenMVG 中的 SFM 算法,输出重建的稀疏点云

4.1 准备
- 城堡图片集,地址:https://github.com/openMVG/ImageDataset_SceauxCastle
- Python 安装,地址:https://www.python.org/downloads/
- Meshlab 安装,地址:https://www.meshlab.net/
4.2 执行脚本
将下载的 Sceaux 城堡图片集 images,放置于编译后的 openMVG_Build/software/SfM 路径下,在 powershell 中分别执行如下脚本:
增量式 SFM:
$ py ./SfM_SequentialPipeline.py images matches_sequential
全局式 SFM:
$ py ./SfM_GlobalPipeline.py images matches_global
以后者为例,可看到在 matches_global 中生成了两个文件夹:matches 存储的是特征点和匹配信息;reconstruction_global 保存的是重建后的点云 (后缀为 .ply)

用 Meshlab 打开其中一个稀疏点云 robust_colorized.ply,显示如下:

4.3 RMSE
在 reconstruction_global 文件夹下,还有 SfMReconstruction_Report.html 的重建精度报告

参考资料
openMVG: "open Multiple View Geometry"
OpenMVG 系列 (1):入门简介的更多相关文章
- Spring 系列: Spring 框架简介 -7个部分
Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...
- 掌握 Ajax,第 1 部分: Ajax 入门简介
转:http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html 掌握 Ajax,第 1 部分: Ajax 入门简介 理解 Ajax 及其工作 ...
- Spring 系列: Spring 框架简介(转载)
Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...
- Pandas系列之入门篇
Pandas系列之入门篇 简介 pandas 是 python用来数据清洗.分析的包,可以使用类sql的语法方便的进行数据关联.查询,属于内存计算范畴, 效率远远高于硬盘计算的数据库存储.另外pand ...
- Pandas系列之入门篇——HDF5
Pandas系列之入门篇--HDF5 简介 HDF5(层次性数据格式)作用于大数据存储,其高效的压缩方式节约了不少硬盘空间,同时也给查询效率带来了一定的影响, 压缩效率越高,查询效率越低.pandas ...
- Python系列之入门篇——HDFS
Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...
- Python系列之入门篇——MYSQL
Python系列之入门篇--MYSQL 简介 python提供了两种mysql api, 一是MySQL-python(不支持python3),二是PyMYSQL(支持python2和python3) ...
- Python 入门简介(一)
Why Python? 我个人认为去学习一门新的语言其实是不需要理由的,当然如果你硬要我编个理由的话还是很容易的. 容易学 容易用 有人真的在用Python么? 这个问题谁用谁知道. 选择什么开发工具 ...
- MongoDB入门简介
MongoDB入门简介 http://blog.csdn.net/lolinzhang/article/details/4353699 有关于MongoDB的资料现在较少,且大多为英文网站,以上内容大 ...
- (转)Web Service入门简介(一个简单的WebService示例)
Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...
随机推荐
- centos7下cups + samba共打印服务
centos7下cups + samba共打印服务 2015年8月21日admin发表评论阅读评论 这个算是rhce课程的篇外篇,Samba除了提供文件共享外,也可以像windows下的共享一样提 ...
- 2.9. 管道和重定向ls /proc && echo suss! || echo failed. 能够提示命名是否执行成功or失败; 与上述相同效果的是: if ls /proc; then echo suss; else echo fail; fi
2.9. 管道和重定向 批处理命令连接执行,使用 | 串联: 使用分号 ; 前面成功,则执行后面一条,否则,不执行:&& 前面失败,则后一条执行: || ls /proc && ...
- Linux_网络基础管理
一.网卡的命名 1.传统网卡命名 eth0.eth1.eth2.eth3......... wlan0.wlan1.waln2.wlan3......... 2.RHEL7命名机制 systemd对网 ...
- Cron 定时任务命令-配置文件详解
定时任务 定时任务的作用 1.系统级别的定时任务 临时文件清理 系统信息采集 日志文件切割 2.用户级别的定时任务 定时向互联网同步时间 定时备份系统配置文件 定时备份数据库的 ...
- 记一次zabbix-server故障恢复导致的事故 zabbix-server.log -- One child process died
前言 zabbix-server昨天出了个问题,不停的重启.昨天摆弄到晚上也不搞清楚原因,按照网上说的各种操作,各种CacheSize.TimeOut.StartPollers都改了,还有什么Incl ...
- 如何查看Oracle SID即instance_name 和 dbname区别
SID 和 instance_name是一个实例名字db_name 是数据库名字搞清两个概念,数据库和实例 实例:实例是数据库启动时初始化的一组进程和内存结构 数据库:数据库则指的是用户存储数据的一 ...
- js动态加载HTML元素时出现的无效的点击事件
项目中列表数据中隐藏着详情数据, 图一: 详情数据是:根据当前行的数据作为参数,通过ajax请求到后台返回的数据,再根据返回的结果动态生成HTML页面 图二: js文件中的这些js的点击事件无效: j ...
- TVM性能评估分析(五)
TVM性能评估分析(五) Figure 3. A futher speed up with operator fusion Table 1. Performance issue of cuBLAS ...
- TTC测距算法
TTC测距算法 输入输出接口 Input:(1)人与车(或车与车)的距离 (2)人与车(或车与车)的相对速度 Output:TTC collision time 算法介绍和设计方案 TTC是Time- ...
- Wide & Deep的OneFlow网络训练
Wide & Deep的OneFlow网络训练 HugeCTR是英伟达提供的一种高效的GPU框架,专为点击率(CTR)估计训练而设计. OneFlow对标HugeCTR搭建了Wide & ...