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 沒有重複造輪子,直接集成了許多好用的第三方庫,如下:

     – Eigen:線性代數,矩陣、向量運算

     – Ceres Solver:非線性最小二乘問題

     – Lemon:圖和圖運算    

 

3  編譯配置

3.1  環境和工具

      – Win10  64bit

      – VS 2019 社區版 (地址: //www.visualstudio.com/downloads/)

      – CMake 解壓版 (地址: //cmake.org/download/)

3.2  文件準備

      – OpenMVG,地址://github.com/openMVG/openMVG/releases

         注意:上述地址下載的壓縮包,最終編譯有時會報錯,不如在 PowerShell 中 Git 下載的穩定                         

                   $  git clone –recursive //github.com/openMVG/openMVG.git

      – 依賴項,下載 glw,osi_clp 和 cereal,解壓後放在 openMVG\src\dependencies 中,此目錄內已有對應文件夾,但裡面的內容是空的

          glw,地址://github.com/elmindreda/glfw/releases 

          osi_clp,地址://github.com/openMVG-thirdparty/osi_clp/releases

          cereal,地址://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  準備

     –  城堡圖片集,地址://github.com/openMVG/ImageDataset_SceauxCastle

     –  Python 安裝,地址://www.python.org/downloads/

     –  Meshlab 安裝,地址://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 源碼閱讀小記