选择 openMVG
openMVG(open Multiple View Geometry) 专注于多视图几何(Multiple View Geometry)与Structure from Motion (SfM)领域。为计算机视觉研究者和开发者提供了一个端到端、模块化、可复现的 3D 重建框架。
●Mission:通过开发 C++ 框架,推广图像/摄影测量 3D 重建的力量。
●Vision:用易读、准确的 state-of-the-art 与经典算法实现,简化可复现研究。
●Credo:“Keep it simple, keep it maintainable”。代码设计易读、易学、易修改、易用;严格测试驱动开发(TDD)+ 大量 samples,让构建可信大型系统成为可能。
与许多“黑盒”工具不同,openMVG 强调源码可读性和算法透明度,非常适合想深入理解 SfM 原理、进行二次开发或构建专业 pipeline 的开发者。不仅提供库和可执行二进制,还提供 Python 脚本将它们串联成完整 pipeline,并支持导出到 openMVS 等工具进行稠密重建。
一、核心功能
openMVG 采用三层架构(Libraries + Binaries + Pipelines),外加丰富辅助工具。
1. Libraries(核心库模块)
提供底层可复用组件(位于 src/openMVG/):
●图像操作:加载、处理(libpng/jpeg/tiff 支持)。
●特征描述与匹配:SIFT 等描述子提取、匹配。
●特征跟踪(Feature Tracking):支持无序图像集的高效跟踪(对应论文 “Unordered feature tracking made fast and easy”)。
●相机模型(Camera Models):Pinhole、Pinhole Radial(带畸变)、Fisheye 等多种模型,支持内参标定与去畸变。
●多视图几何(Multiple-View-Geometry):基础矩阵(Fundamental)、本质矩阵(Essential)、单应性(Homography)、PnP 解算(Resection)、三角化(Triangulation)等求解器。
●鲁棒估计(Robust Estimation):a contrario 框架(参数-free 的 RANSAC-like 方法,基于统计模型自动拒绝外点,对应多篇论文)。
●Structure-from-Motion 算法:增量式(Incremental)与全局式(Global)重建引擎。
2. Binaries(核心可执行工具,openMVG_main_* 前缀)
这些是构建 pipeline 的“积木”(位于 src/software/):
●openMVG_main_SfMInit_ImageListing:场景初始化,创建 sfm_data文件,引用每张图像为 View,关联 Intrinsic ID 和 Pose ID,支持相机模型选择。
●openMVG_main_ComputeFeatures:为所有 View 计算描述子(Regions),支持多线程(-n参数)、缓存(-c大数据集优化)。
●openMVG_main_ComputeMatches:计算图像对匹配(PairWiseMatches),支持 exhaustive、cascade hashing 等策略 + a contrario 鲁棒过滤,可选 guided matching。
●openMVG_main_SfM:核心 SfM 引擎,支持 --sfm_engine INCREMENTAL(顺序添加视图)、INCREMENTALV2(更快版本)、GLOBAL(全局运动平均)。
●openMVG_main_ComputeStructureFromKnownPoses:已知相机位姿下生成 3D 点云(三角化或对极线搜索),支持短轨迹(2-view)。
●openMVG_main_SfM_Localization:在已有重建场景中定位新图像的相机位姿。
●openMVG_main_ConvertSfM_DataFormat:格式转换(sfm_data.bin ↔ JSON/XML/PLY 等)。
●其他重要工具(从 releases 与源码结构):
○openMVG_main_SfMInit_ImageListingFromKnownPoses(已知 GT 位姿初始化)。
○openMVG_main_ChangeLocalOrigin(归一化 GPS 场景原点,适配 MVS)。
○colorHarmonize(颜色一致性校正,便于纹理映射)。
○Geodesy 模块(GCP 地面控制点注册支持)。
○VO(Visual Odometry)相关工具。
○SfMViewer / SfMWebGLViewer(可视化与 WebGL 查看器)。
3. Pipelines
项目提供 Python 脚本(位于 software/SfM/):
●SfM_SequentialPipeline.py:增量式(Incremental)pipeline。
●SfM_GlobalPipeline.py:全局式(Global)pipeline。
两者均自动链式调用上述 binaries,处理从图像集到 sfm_data.bin+ PLY 输出的全流程。

4. 其他功能与扩展
●跨平台:Linux、macOS、Windows、Android、iOS。
●与第三方集成:导出到 openMVS(稠密点云/纹理网格)、OpenCV 支持(CMake -DOpenMVG_USE_OPENCV=ON)。
●测试驱动 + Samples:大量 unit tests 和示例代码,展示如何使用库构建高层算法。
●图可视化:支持 Graphviz .dot导出匹配/轨迹图(需安装 graphviz)。
●缓存与大规模支持:-c参数启用缓存,适合大图像集在小内存机器上运行。
总结功能矩阵:
●稀疏 SfM(增量/全局)
●特征提取/匹配/跟踪
●多相机模型 + 鲁棒估计(a contrario)
●位姿估计、三角化、BA(Ceres 优化)
●场景序列化(cereal)
●导出与可视化
●定位、颜色校正、测地/GCP 支持
●作为库嵌入第三方 CMake 项目
二、详细安装方法
项目构建系统为 CMake,依赖管理清晰(子模块 + 可选系统库/VCPKG/Pixi/Docker)。
推荐获取方式(递归克隆子模块)
●●●bash git clone --recursive https://github.com/openMVG/openMVG.git
# 或
git clone https://github.com/openMVG/openMVG.git
cd openMVG
git submodule init && git submodule update
1. Linux(Ubuntu 示例)
●●●bash sudo apt-get install libpng-dev libjpeg-dev libtiff-dev libxxf86vm-dev libxi-dev libxrandr-dev graphviz # 可选 graphviz 用于可视化
mkdir openMVG_Build && cd openMVG_Build
cmake -DCMAKE_BUILD_TYPE=RELEASE ../openMVG/src/
cmake --build . --target install -j$(nproc)
# 启用测试/示例
cmake -DOpenMVG_BUILD_TESTS=ON -DOpenMVG_BUILD_EXAMPLES=ON ../openMVG/src/
2. macOS
类似 Linux,或用 Xcode:
●●●bash cmake -DCMAKE_BUILD_TYPE=RELEASE -G "Xcode" ../openMVG/src/
xcodebuild -configuration Release
3. Windows
用 cmake-gui 或 VS Native Tools Command Prompt:
●Source: openMVG/src/
●Build: 新建目录
●Configure → Generate → 打开 .sln → Release 编译
4. VCPKG(推荐跨平台依赖管理)
●●●bash vcpkg install openmvg[core,openmp] # 或手动安装 cereal ceres eigen3 libjpeg-turbo libpng tiff
# 构建时
cmake -DCMAKE_TOOLCHAIN_FILE=<vcpkg>/scripts/buildsystems/vcpkg.cmake ../openMVG/src/
5. Docker(最干净可复现)
●●●bash docker build . -t openmvg
docker run -it --rm -v /path/to/dataset:/dataset:ro openmvg
6. Pixi(现代 Python/环境管理,Linux/macOS)
●●●bash curl -fsSL https://pixi.sh/install.sh | bash
pixi run build
pixi shell
# 之后可直接运行 binaries 或 python 脚本
7. CMake 关键选项(深度定制)
●OpenMVG_BUILD_SOFTWARES=ON(默认构建 binaries)
●OpenMVG_BUILD_TESTS=ON
●OpenMVG_BUILD_EXAMPLES=ON
●OpenMVG_USE_OPENCV=ON+ OpenCV_DIR=...
●CMAKE_INSTALL_PREFIX:本地安装避免系统污染(推荐与 Ceres 冲突隔离)
作为第三方库使用:
安装后用 find_package(OpenMVG ...),链接 openMVG::openMVG_*目标。推荐本地 install prefix。
依赖核心(从 VCPKG/BUILD 推断 + 项目实践):Eigen(线性代数)、Ceres(非线性优化/BA)、cereal(序列化 sfm_data.bin)、图像库(libpng/jpeg/tiff)。
三、高效使用方法
输入要求:图像文件夹(JPEG/PNG/TIFF 等,支持 EXIF 焦距)。若无 EXIF,用 -f X*1.2(X = max(width,height))在初始化阶段提供近似焦距。
推荐 workflow
●●●bash cd openMVG_Build/software/SfM/
# 增量式(适合有序/小规模,逐步添加视图)
python SfM_SequentialPipeline.py /path/to/images /path/to/output_incremental
# 全局式(适合无序/大规模,鲁棒性与可扩展性更好)
python SfM_GlobalPipeline.py /path/to/images /path/to/output_global
手动精细控制
1.场景初始化
●●●bash openMVG_main_SfMInit_ImageListing -i images/ -o output/ -f 3000 # 或让 EXIF 自动读取
2.特征提取(多线程 + 缓存优化大图集)
●●●bash openMVG_main_ComputeFeatures -i output/sfm_data.bin -o output/ -n 8 -c 1
3.匹配(a contrario 自动参数-free 外点剔除)
●●●bash openMVG_main_ComputeMatches -i output/sfm_data.bin -o output/ -f 1 # -f 启用 guided matching
4.SfM 重建
●●●bash openMVG_main_SfM -i output/sfm_data.bin -m output/matches/ -o output/ --sfm_engine INCREMENTAL
# 或 GLOBAL(推荐大规模无序场景)
5.结构计算 + 导出
●●●bash openMVG_main_ComputeStructureFromKnownPoses ...
openMVG_main_ConvertSfM_DataFormat -i output/sfm_data.bin -o output/ --output_file_format PLY
输出:
●sfm_data.bin(核心二进制场景文件:Views + Intrinsics + Poses + Landmarks + Tracks)
●cloud_and_poses.ply(绿色相机轨迹 + 白色/彩色 3D 点,用 Meshlab/CloudCompare 查看)
●colorized.ply
高效技巧:
●大数据集用 -c缓存 + Global engine + 多线程。
●Incremental 适合顺序拍摄(但可能累积漂移);Global 更鲁棒、可扩展(旋转平均 + 平移平均)。
●良好图像重叠(>60%)+ 纹理丰富场景是成功关键。
●可视化匹配图/轨迹用 Graphviz。
●后续接 openMVS 做稠密 + 纹理(项目明确支持导出)。

四、技术原理与架构
1. 核心数据结构(SfM_Data 为中心)
项目以 sfm_data.bin(cereal 序列化)为核心场景表示:
●Views:每张图像 + 关联 Intrinsic ID + Pose ID。
●Intrinsics:相机模型参数(Pinhole 焦距/主点 + 径向畸变系数等)。
●Poses:相机外参(旋转 + 平移,SE(3))。
●Landmarks:3D 点 + 多视图观测(Observations)。
●Tracks:跨视图特征轨迹(从匹配构建)。
●PairWiseMatches / Regions:匹配关系与描述子集合。
让“运动”(相机位姿)与“结构”(3D 点)解耦,便于增量/全局优化。
2. 算法流程原理
标准 SfM Pipeline 实现:
1.特征提取→ 描述子(SIFT 等)。
2.匹配 + 鲁棒估计:a contrario 框架(无需手动阈值,基于随机模型自动控制假阳性率,对应 Moulon 等 ACCV/IPOL 论文)。
3.相对运动估计:2-view(F/E 矩阵)或多 view。
4.增量式 SfM:选初始对 → resection(PnP)添加新视图 → 三角化新点 → 局部/全局 Bundle Adjustment(Ceres 优化重投影误差)。
5.全局式 SfM:先计算所有相对旋转/平移 → 旋转平均(SO(3))→ 平移平均 → 最终 BA(对应 ICCV 2013 Global Fusion 论文)。
6.三角化与结构精化。
架构亮点(“Keep it simple”):
●模块化:features、matching、multiview、sfm、robust_estimation 独立,易替换/扩展。
●泛型设计:多视图求解器框架可嵌入任意鲁棒估计器。
●测试驱动:每个算法有严格 unit test + samples。
●依赖精简:Eigen(数学)、Ceres(BA)、cereal(I/O)。
●可扩展性:支持自定义 SfM engine(继承 ReconstructionEngine)。
项目实现了多篇高影响力论文的核心算法(a contrario SfM、Global SfM、Tracks 等),代码可读性极高,适合学习 MVG 经典与现代方法。
openMVG 是稀疏 SfM 领域最干净、文档相对完善、源码最易读的 C++ 框架之一。可学习、可修改、可生产的科研/工程基石。结合 openMVS 可完成从稀疏到稠密纹理的全流程。
适用场景:学术研究、3D 建模、SLAM 前端、摄影测量、机器人视觉 mapping。
掌握 openMVG 后,将真正理解“图像 → 特征 → 匹配 → 运动与结构恢复”的完整链路,并能高效构建自定义 3D 重建系统。
夜雨聆风