COLMAP 中的 Rig 支持:多相机系统的三维重建
COLMAP 是一款强大的开源三维重建工具,广泛应用于计算机视觉和机器人领域。除了支持单相机的普通三维重建,最近更新的 COLMAP 还提供了对 rig(传感器阵列) 的原生支持。这对于处理多相机系统(如双目相机、全景相机或 360° 全景设备)非常有用。
在本文中,我们将介绍 COLMAP 中 rig 支持的基本概念、工作流程以及如何利用它进行多相机系统的三维重建。
至少需要3.12.0以上版本的 COLMAP 才支持 rig 重建。
什么是 Rig? #
在 COLMAP 中,一个 rig(传感器阵列) 是由多个固定相对姿态的传感器(即相机)组成的系统。其中一个传感器被指定为参考传感器(reference sensor),其位姿定义了整个 rig 的坐标系。每个帧(frame)表示 rig 的一次曝光实例,包含所有或部分传感器在同一时刻拍摄的图像。
例如,在一个双目相机 rig 中,一个相机作为参考传感器,其 sensor_from_rig 姿态为单位矩阵;另一个相机则以相对于参考相机的姿态进行建模。
使用 COLMAP 进行 Rig 三维重建的工作流程 #
1. 组织图像数据 #
为了正确地将图像组织为 rig 和 frame,建议使用以下目录结构:
rig1/
camera1/
image0001.jpg
image0002.jpg
...
camera2/
image0001.jpg # 与 camera1/image0001.jpg 同一帧
image0002.jpg # 与 camera1/image0002.jpg 同一帧
...
rig2/
camera1/
...
...
注意:同一帧中的图像必须具有相同的文件名。
2. 提取特征 #
使用以下命令提取特征,并确保每张图像都单独对应一个相机:
colmap feature_extractor \
--image_path $DATASET_PATH/images \
--database_path $DATASET_PATH/database.db \
--ImageReader.single_camera_per_folder 1
此时,数据库中默认每个相机都是一个独立的 rig,每张图像是一个独立的帧。
这一步也可以使用GUI界面,注意勾选每个子目录分别使用同一个相机。

3. 配置 Rig 关系 #
接下来,我们需要使用 rig_configurator 工具来配置 rig 和传感器之间的关系。首先创建一个 rig_config.json 文件,其中定义了每个 rig 的传感器及其相对位姿。
示例配置如下:
[
{
"cameras": [
{
"image_prefix": "rig1/camera1/",
"ref_sensor": true,
"camera_model_name": "PINHOLE",
"camera_params": [640.0, 480.0, 320.0, 240.0]
},
{
"image_prefix": "rig1/camera2/",
"cam_from_rig_rotation": [0.7071, 0.0, 0.7071, 0.0],
"cam_from_rig_translation": [0, 0, 0],
"camera_model_name": "PINHOLE",
"camera_params": [640.0, 480.0, 320.0, 240.0]
}
]
}
]
| 字段名 | 类型 | 必须 | 描述 |
|---|---|---|---|
image_prefix | string | ✅ 是 | 相机图像文件名前缀,用于区分不同相机。 |
cam_from_rig_rotation | array of 4 doubles (w, x, y, z) | ❌ 否 | 四元数表示的 rig 到相机的旋转。 |
cam_from_rig_translation | array of 3 doubles (x, y, z) | ❌ 否 | rig 到相机的平移向量。 |
ref_sensor | boolean | ❌ 否 | 是否是参考传感器(必须有且仅有一个)。 |
camera_model_name | string | ❌ 否 | 相机模型名称,如 "PINHOLE", "FISHEYE" 等。 |
camera_params | array of doubles | ❌ 否 | 相机内参列表(顺序依赖于具体模型)。 |
需要注意:
- 每个 rig 必须包含至少一个相机。
- 每个 rig 必须有且仅有一个参考传感器(
ref_sensor == true) 。 - 参考传感器不能设置
cam_from_rig_rotation和cam_from_rig_translation,因为它是整个 rig 的原点。 - 注意四元数的顺序:[w,x,y,z]
运行配置命令:
colmap rig_configurator \
--database_path $DATASET_PATH/database.db \
--rig_config_path $DATASET_PATH/rig_config.json
这一步将修改数据库中的 rig 和 frame 配置,为后续重建提供基础。
4. 特征匹配 #
完成 rig 配置后,进行特征匹配。如果是视频序列,可以使用顺序匹配器:
colmap sequential_matcher --database_path $DATASET_PATH/database.db

5. 三维重建 #
最后,使用标准的 mapper 命令进行重建。如果已知 rig 的传感器位姿,可以将其固定以提高重建稳定性:
colmap mapper \
--image_path $DATASET_PATH/images \
--database_path $DATASET_PATH/database.db \
--output_path $DATASET_PATH/sparse \
--Mapper.ba_refine_sensor_from_rig 0
以上步骤除了配置 Rig 关系这一步需要使用命令行外,其余步骤都可以使用 GUI 图形界面完成。
当 Rig 的传感器位姿未知时的处理方法 #
如果 rig 的传感器位姿未知,但知道它们是刚性连接并在同一时间曝光,可以采用两步重建法:
第一步:无 rig 约束的初步重建 #
首先,将每个相机视为独立的 rig,进行普通的三维重建。确保至少有一组图像与参考相机在同一帧中注册成功。
第二步:从重建结果中估计 rig 位姿 #
使用 rig_configurator 从已有重建中估计平均的 rig 位姿:
colmap rig_configurator \
--database_path $DATASET_PATH/database.db \
--input_path $DATASET_PATH/sparse-model-without-rigs-and-frames \
--rig_config_path $DATASET_PATH/rig_config.json \
--output_path $DATASET_PATH/sparse-model-with-rigs-and-frames
提供的 rig_config.json 只需省略相应的 cam_from_rig_rotation 和 cam_from_rig_translation 字段即可。
然后可以选择进行 bundle adjustment 或重新从头开始带 rig 约束的重建。
具体方法请参考官方文档:https://colmap.github.io/rigs.html,文档中还给出了一个使用ETH3D rig 数据集进行重建的完整示例,以及用360°全景图进行重建的方法。
总结 #
COLMAP 的 rig 支持使得多相机系统的三维重建变得更加灵活和高效。无论是已知还是未知 rig 传感器位姿的情况,都可以通过合理的工作流程实现高质量的重建。对于需要处理多视角、立体相机或全景设备的应用来说,掌握 COLMAP 的 rig 功能是非常有价值的技能。