【colmap】已知相机位姿情况下进行三维重建
如果在已知相机位姿情况进行场景的稀疏/稠密重建,需要手动创建稀疏模型。即在一个新文件夹中创建cameras.txt
, points3D.txt
和 images.txt
。
COLMAP已知相机位姿情况进行场景的稀疏/稠密重建
+── path/to/manually/created/sparse/model
│ +── cameras.txt
│ +── images.txt
│ +── points3D.txt
其中 points3D.txt
文件应该为空,images.txt
文件中每隔一行为空,用于后续存放提取的特征点。有关稀疏模型结构的更多信息,可以参考这篇文章。
images.txt
文件示例
1 0.695104 0.718385 -0.024566 0.012285 -0.046895 0.005253 -0.199664 1 image0001.png
# Make sure every other line is left empty
2 0.696445 0.717090 -0.023185 0.014441 -0.041213 0.001928 -0.134851 2 image0002.png
3 0.697457 0.715925 -0.025383 0.018967 -0.054056 0.008579 -0.378221 1 image0003.png
4 0.698777 0.714625 -0.023996 0.021129 -0.048184 0.004529 -0.313427 2 image0004.png
上述每幅图像必须具有和数据库中相同的image_id
(每一行的第一列),数据库的数据可以通过GUI查看Database management > Processing
或者将重建的模型导出为文本格式进行查看。
为了进行稀疏模型重建,需要对已知相机参数的图像重新进行特征点计算:
colmap feature_extractor \
--database_path $PROJECT_PATH/database.db \
--image_path $PROJECT_PATH/images
如果相机内参存在较大的畸变系数,那么应该将cameras.txt
中的参数复制到数据库中(用已知的相机内参替换colmap默认赋予的内参, feature_extractor会为每幅图分配相机内参)。这样的话,后续的特征点匹配可以利用提供的相机内参。如何修改数据库中的参数,最简单的方法是利用scripts/python/database.py
脚本文件。
colmap exhaustive_matcher \ # or alternatively any other matcher
--database_path $PROJECT_PATH/database.db
colmap point_triangulator \
--database_path $PROJECT_PATH/database.db \
--image_path $PROJECT_PATH/images
--input_path path/to/manually/created/sparse/model \
--output_path path/to/triangulated/sparse/model
值得注意的是,如果最终为了得到场景的稠密三维点云模型,那么稀疏重建并不是必须的。如果已经基于已知相机参数计算得到了稀疏模型,可通过如下步骤进行稠密重建:
colmap image_undistorter \
--image_path $PROJECT_PATH/images \
--input_path path/to/triangulated/sparse/model \
--output_path path/to/dense/workspace
colmap patch_match_stereo \
--workspace_path path/to/dense/workspace
colmap stereo_fusion \
--workspace_path path/to/dense/workspace \
--output_path path/to/dense/workspace/fused.ply
COLMAP稀疏重建文本格式
colmap为每个重建的模型导出三个文件:cameras.txt
, images.txt
和points3D.txt
cameras.txt
每一行:相机ID,相机模型,宽,高和相机参数
images.txt
第一行:相机外参及对应的相机ID和filename(四元数表示旋转+平移向量)
第二行:图像中提取的keypoints (SIFT特征点是亚像素级别的精度)
points3D.txt
记录重建的3D点