一个照片文件夹里存着从各个角度拍下的建筑,却通常没有精确记录拍摄者当时站在哪里。COLMAP 的重建流程要恢复的,正是这部分缺失的几何信息。在标准流程中,软件先估计相机的位置、朝向,以及散布在场景中的一组稀疏三维点,随后才能生成稠密表面。顺着各阶段之间的数据交接往下看,既能理解这套软件的用处,也能发现成品模型中隐藏的问题。[1]
以项目提供的 South Building 示例为例:这组数据由 Christopher Zach 提供,包含北卡罗来纳大学教堂山分校一座建筑的 128 张照片。[8] 人一眼就能认出各张照片拍的是同一座楼,软件则需要找到可供检验的对应关系。
匹配先提出候选关系
COLMAP 把提取出的特征及其关系保存在 SQLite 数据库中。关键点记录图像中的位置,描述子表征该处的局部外观。匹配步骤据此提出一种候选关系:两张照片中的某些特征,对应着场景里的同一处细节。数据库明确区分了候选关系与验证结果:候选匹配保存在 matches 中,经过几何验证的关系保存在 two_view_geometries 中,重建使用后者。[2]
设想建筑立面上有两扇相似的窗户。仅凭外观相近,还不足以认定两个图像局部拍到的是同一扇窗。几何验证会检查这些对应关系,判断它们能否符合视图之间合理的几何关系。COLMAP 的原始论文介绍了其中的鲁棒估计方法:容忍部分错误匹配,同时寻找一致的几何解释。[3]
数据库还区分相机模型与图像。多张图像可以共用一组相机内参,例如焦距和镜头畸变参数;每张图像又各自对应一个相机位置和朝向。[2] 因此,“一台相机”可以对应多个拍摄视点。
建筑与视点在同一过程中逐步确定
在 Schönberger 和 Frahm 描述的增量式方法中,重建从选定的一对图像开始。后续图像依靠与已有三维点的对应关系加入重建,三角测量则利用不同视图中的观测增加场景点。随后,光束法平差(bundle adjustment)联合优化相机参数和点的位置,缩小图像中实际观测到的特征位置与估计几何投影位置之间的差异。[3]
看着点云逐渐浮现时,一个事实很容易被忽略:相机本身也是持续修正的求解结果。随着重建中的物体逐步完整,相机的位置和朝向也在更新。一个特征能帮助确定相机的位置,而这台相机又能为更多特征的位置增加约束。
因此,拍摄质量从流程的起点就影响着重建。COLMAP 教程建议选择纹理丰富的对象,让照片之间保留充分重叠,并从不同位置拍摄。拍摄时需要移动位置,仅在原地转动相机仍缺少这种位置变化。教程也提醒使用者留意反射和不一致的光照。[1] 重建结果中的一块空白,有时在拍摄时就已埋下原因:所需的信息从未进入相机。
保存的模型带有坐标约定
稀疏重建由一组相互关联的记录组成。文档列出的输出包括 cameras、images 和 points3D,较新的模型还包含 rigs 和 frames。这些记录可保存为二进制或文本格式。在 images.txt 中,位姿描述的是从世界坐标到相机坐标的变换。因此,其中的平移向量与相机在世界坐标系中的位置有区别;相机中心应按 -Rᵀt 计算。[4]
导出运动轨迹或放置虚拟相机时,这一区别会直接影响结果。如果接收数据的程序采用另一套解释方式,同一组数值就会还原出错误的场景。
Nerfstudio 从独立的集成实践角度说明了这个问题。它的数据约定指南明确比较了自身采用的 OpenGL 风格相机坐标轴与 COLMAP 的差异:两者的 X 轴都向右,Y 轴和 Z 轴的方向则各自相反。[7] 据此,我在工程上的推论是,交接重建数据时,应同时注明变换方向和坐标轴约定。文件能够成功解析,只代表通过了第一项检查。
稠密重建开启另一轮计算
命令行流程中的 image_undistorter 展示了下一次数据交接:它准备好图像和稀疏模型,供后续稠密处理使用。patch_match_stereo 估计深度与表面法线,stereo_fusion 再把彼此相容的估计融合成点云,例如 fused.ply。生成网格是之后的步骤。[1][5]
操作人员可以在这些阶段停下来检查:准备稠密工作目录之前,查看已配准的视图;评价网格之前,查看融合后的点云。这些检查点是我的建议,便于逐段定位不同类型的偏差,让中间结果与最终表面一样接受检查。
计算资源的需求也随之变化。COLMAP 内置的稠密重建需要 CUDA。其常见问题文档建议,在立体匹配耗尽 GPU 显存时,减小 PatchMatchStereo.max_image_size,或减少源图像数量。稀疏重建顺利完成,仍不足以判断显存能否容纳稠密阶段的计算。[6]
处理顺序还有一项约束。常见问题文档提醒,运行 mapper 或光束法平差后,必须重新计算稠密重建,因为模型的坐标系有时会随之改变。[6] 相机参数已修正却仍沿用旧的深度结果,会破坏这些结果与其计算依据之间的对应关系。
细节本身给不出尺度
常规的单目运动恢复结构(structure from motion)若缺少真实尺度的参考信息,重建的整体尺度就无法唯一确定。Ceres Solver 文档把更广泛的这种不确定性描述为相似变换歧义。[9] 从几何上看,放大建筑,同时让相机按比例远离建筑,图像上的投影位置仍可保持不变。即使砖墙细节更加清晰,这一自由度依然存在。
COLMAP 的 model_aligner 可将模型对齐到外部坐标系。文档中的地理配准流程,利用至少三张已配准图像所对应的已知相机中心位置来估计变换。[6] 这些参考测量补充了照片本身缺少的信息。
对于小型研究或可视化团队,这套流程的实际价值在于让重建结果有据可查:把源图像、数据库、稀疏模型、软件版本和处理设置保存在一起。结果出现异常时,可以沿着软件的处理步骤逐项查找原因,包括特征对应关系、相机几何、坐标转换、稠密深度和外部尺度。建筑模型的可信度随着证据积累而提高,保存下来的每一个阶段,也让其他人能够检视它是如何得到的。
参考资料
- COLMAP,“Tutorial”——拍摄建议及从稀疏到稠密的重建顺序;在线文档查阅于 2026 年 10 月 12 日。
- COLMAP,“Database Format”——SQLite 表、相机与图像的关系,以及经过几何验证的匹配。
- Johannes L. Schönberger 和 Jan-Michael Frahm,“Structure-from-Motion Revisited”,CVPR 2016,第 2、4 节——增量式重建与光束法平差。
- COLMAP,“Output Format”——稀疏模型文件、从世界坐标到相机坐标的位姿,以及相机中心公式。
- COLMAP,“Command-line Interface”——去畸变、立体匹配、融合与网格生成的具体命令。
- COLMAP,“Frequently Asked Questions”——CUDA 要求、稠密重建的显存控制、位姿变化后的重新计算,以及地理配准。
- Nerfstudio,“Data conventions”——独立的集成文档,说明其相机坐标轴与 COLMAP 的差异。
- COLMAP,“Datasets”——北卡罗来纳大学教堂山分校的 South Building,由 Christopher Zach 提供的 128 张照片,附图像集下载链接。
- Ceres Solver,“Covariance Estimation”中的“Gauge Invariance”小节——运动恢复结构中的相似变换歧义。