OpenMVG 系列 (1):入门简介
阅读原文时间:2021年07月09日阅读: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 Hs;
H_Solver::Solve(xLeft, xRight, &Hs);

2.2  运动结构恢复

    Structure From Motion 简称 SFM,是从一系列图像序列中恢复相机位姿,构建三维场景 (稀疏点云) 的过程

                                            

                 图像序列                                                Structure from motion                                              三维场景 (稀疏点云)

    OpenMVG 中实现了 SFM 的两种算法:增量式和全局式。一次完整的 SFM 实现流程,如下所示:

        

2.3  第三方库

    对于一些基础功能,OpenMVG 没有重复造轮子,直接集成了许多好用的第三方库,如下:

     - Eigen:线性代数,矩阵、向量运算

     - Ceres Solver:非线性最小二乘问题

     - Lemon:图和图运算    

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 编译安装指南

    OpenMVG libraries

    openMVG: "open Multiple View Geometry"

    OpenMVG 源码阅读小记