1 OpenMVG 簡介
全稱 Open Multiple View Geometry,是法國人 Pierre Moulon 讀博期間開源的一個 C++ 庫
最早版本 OpenMVG 0.1 是 2013年 2月 發布的,目前最新版本是 2021年 10月 發布的 OpenMVG 2.0
LinkedIn 顯示,此前一直在 Zillow Group 的 Pierre,於 2020年 11月 跳槽到 Facebook Reality Labs 擔任 Research Scientist
Reality Labs 聚焦的是 AR/VR 技術,和 Pierre 的研究方向契合,希望 Pierre 工作順利,閑暇時繼續完善 OpenMVG
2 功能模塊
OpenMVG 奉行“簡單、易維護”的原則,代碼具有很強的可讀性,非常方便二次開發
整個功能模塊由若干核心庫組成,主要圍繞兩大類問題:1) 多視圖幾何的基本問題;2) 運動恢復結構
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
- 依賴項,下載 glfw,osi_clp 和 cereal,解壓后放在 openMVG\src\dependencies 中,此目錄內已有對應文件夾,但里面的內容是空的
osi_clp,可直接下載 OpenMVG 提供的地址:https://github.com/openMVG-thirdparty/osi_clp/tags
或者利用上述鏈接下載的 CMakeLists.txt 文件,再單獨下載文件 Osi/Clp/CoinUtils,放在 osi_clp 文件夾中
https://github.com/coin-or/Osi/tags;https://github.com/coin-or/Clp/tags; https://github.com/coin-or/CoinUtils/tags
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 打開其中一個稀疏點雲 colorized.ply,顯示如下:
4.3 RMSE
在 reconstruction_global 文件夾下,還有 SfMReconstruction_Report.html 的重建精度報告
參考資料
openMVG: "open Multiple View Geometry"
后記
2021年10月21日,OpenMVG 2.0 發布