多视图立体重建(SfM / MVS)流程详解
多视图三维重建(Multi-View 3D Reconstruction)是从多张不同视角拍摄的二维照片中,恢复三维场景几何结构与纹理的核心技术。它广泛应用于文物数字化、城市级三维建模、自动驾驶高精地图以及口腔/面部扫描等领域。
本篇将以 COLMAP 为主线,系统梳理从图像输入到三维模型输出的完整管线流程,并对比 OpenMVG + OpenMVS 组合方案的架构差异。
1. 标准管线概览
一个完整的多视图三维重建管线通常包含以下阶段:
2. COLMAP 核心模块详解
COLMAP 是目前学术界与工业界使用最广泛的开源多视图三维重建框架,集成了从特征提取到稠密重建的全部核心算法。以下是其管线中各关键模块的作用:
2.1 特征提取(feature_extractor)
从每张输入图像中提取局部不变特征点及其描述子(默认使用 SIFT 算法)。每个特征点记录了其在图像中的二维坐标、尺度、方向以及 128 维描述向量。
2.2 特征匹配(vocab_tree_matcher / exhaustive_matcher)
在大规模图像集中,对所有图像对进行穷举匹配(exhaustive_matcher)的计算开销是 ,不可接受。
vocab_tree_matcher(词汇树匹配器) 通过以下策略大幅提升匹配效率:
- 构建视觉词汇树:对大量局部特征描述子进行层次化 K-Means 聚类,构建一棵层级结构的视觉词汇树(Vocabulary Tree)。
- 图像检索:将每张图像的特征描述子量化到词汇树的叶节点上,生成 BoW(Bag of Words)直方图表示。
- 快速筛选候选对:通过比对 BoW 直方图的相似度,快速筛选出视觉内容相似的图像对,仅对这些候选对进行精确的特征点几何匹配与验证。
2.3 稀疏重建 / 增量式 SfM(mapper)
Mapper 是 COLMAP 实现 Structure-from-Motion(运动恢复结构)的核心组件,负责从匹配的二维特征点中恢复三维场景结构与相机姿态:
- 初始化:选择一对具有足够视差的图像对,通过基础矩阵 / 本质矩阵分解出初始的两个相机姿态,并三角化出初始的三维点。
- 增量式注册:依次将新图像加入已有模型。对每张新图像,利用 PnP(Perspective-n-Point)算法,从已有三维点与新图像的二维匹配点中求解该图像的相机外参(位姿)。
- 三角化扩展:利用新注册的相机视角与已有视角间的匹配,三角化出更多新的三维点,扩展稀疏点云。
- 光束法平差(Bundle Adjustment):定期对所有相机参数(内参与外参)和三维点坐标进行全局非线性优化,最小化重投影误差,确保全局几何一致性。
2.4 图像去畸变(image_undistorter)
镜头的径向畸变和切向畸变会导致图像中直线弯曲、物体形状失真,直接影响后续稠密匹配的像素级精度。
image_undistorter 的作用是根据 SfM 阶段标定出的相机内参和畸变系数,对所有输入图像执行去畸变校正,输出无畸变的理想图像,供稠密重建阶段使用。
2.5 稠密深度估计(patch_match_stereo)
PatchMatch Stereo 是 COLMAP 稠密重建(MVS)阶段的核心算法,用于从多视角无畸变图像中估计每个像素的深度值:
- 随机初始化:为每个像素随机初始化一个深度假设和法向量假设。
- 空间传播:将邻域像素的深度/法向量假设传播到当前像素,利用局部平面假设实现高效搜索。
- 多视角一致性验证:将当前像素按假设的深度投影到多个参考视角,比较图像块(Patch)的光度一致性(如 NCC 或 Bilateral NCC),筛选最优深度与法向量。
最终为每个视角输出一张稠密深度图和法向量图,可融合为全局稠密点云。
2.6 模型格式转换(model_converter)
model_converter 是 COLMAP 提供的模型文件格式互转工具:
- 支持 COLMAP 内部的
.bin二进制格式与.txt文本格式之间的互转。 - 支持导出为通用三维格式(如
.ply、.obj),方便在 MeshLab、Blender、CloudCompare 等第三方软件中进行可视化与后处理。
3. OpenMVG 与 OpenMVS:分离式管线架构
与 COLMAP 的一站式集成不同,OpenMVG 和 OpenMVS 是两个独立但互补的开源项目,通常组合使用:
3.1 OpenMVG(Open Multiple View Geometry)
OpenMVG 专注于 稀疏重建(SfM) 阶段:
- 提供特征提取、特征匹配、增量式/全局式 SfM 等模块。
- 输出稀疏三维点云以及所有相机的内参与外参。
- 不包含稠密重建和网格化功能。
3.2 OpenMVS(Open Multi-View Stereo)
OpenMVS 专注于 稠密重建(MVS) 及后续的网格化与纹理映射:
- 输入 OpenMVG(或其他 SfM 工具)输出的稀疏点云与相机参数。
- 执行稠密点云重建、网格表面重建(泊松重建 / Delaunay 重建)以及纹理映射,生成带有高质量纹理的三维模型。
3.3 对比总结
| 特性 | COLMAP | OpenMVG + OpenMVS |
|---|---|---|
| 架构 | 一站式集成(SfM + MVS) | 分离式组合(SfM + MVS 独立项目) |
| SfM 策略 | 增量式 SfM | 支持增量式与全局式 SfM |
| 稠密重建 | 内置 PatchMatch Stereo | OpenMVS 独立负责 |
| 纹理映射 | 需借助外部工具 | OpenMVS 内置纹理映射模块 |
| 易用性 | 提供 GUI + CLI,开箱即用 | 需分步串联,灵活性更高 |
| 适用场景 | 快速原型验证、中小规模重建 | 大规模定制化管线、工业级项目 |
4. 工程踩坑:照片建模姿态错位诊断
在实际照片建模中,常见的多姿态图像无法正确对齐的原因通常涉及内参与外参两方面:
4.1 内参问题
相机内参(Intrinsic Parameters)包括焦距 、主点 和畸变系数。如果内参标定不准确:
- 焦距错误会导致三角化出的三维点在深度方向上产生系统性尺度偏差。
- 主点偏移会使所有三维点产生整体平移。
- 畸变系数错误会使图像边缘区域的特征匹配产生系统性误差。
4.2 外参问题
相机外参(Extrinsic Parameters)描述每张图像的拍摄位姿(旋转矩阵 与平移向量 )。如果外参估计不准:
- PnP 求解失败或初始化图像对选择不当,会导致后续增量注册的累积漂移。
- 光束法平差未收敛或陷入局部最优,会导致多组图像的姿态分裂为不连通的子模型。
4.3 网格密度与纹理质量的平衡
在稠密重建后的网格化阶段,还需注意:
- 点云过于稀疏:构网前的统计滤波器会将密度不足的区域过滤掉,导致最终网格出现面的缺失(破洞)。
- 网格过于密集:纹理映射算法在高密度网格上进行纹理插值时,相邻三角面片之间的纹理过渡可能过于平滑,丢失细节对比度。此时应考虑网格简化(Decimation / 简面)操作,在保持几何精度的前提下降低面片数量。