跳到主要内容
  1. Posts/

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_prefixstring✅ 是相机图像文件名前缀,用于区分不同相机。
cam_from_rig_rotationarray of 4 doubles (w, x, y, z)❌ 否四元数表示的 rig 到相机的旋转。
cam_from_rig_translationarray of 3 doubles (x, y, z)❌ 否rig 到相机的平移向量。
ref_sensorboolean❌ 否是否是参考传感器(必须有且仅有一个)。
camera_model_namestring❌ 否相机模型名称,如 "PINHOLE", "FISHEYE" 等。
camera_paramsarray of doubles❌ 否相机内参列表(顺序依赖于具体模型)。

需要注意:

  1. 每个 rig 必须包含至少一个相机。
  2. 每个 rig 必须有且仅有一个参考传感器(ref_sensor == true) 。
  3. 参考传感器不能设置 cam_from_rig_rotationcam_from_rig_translation,因为它是整个 rig 的原点。
  4. 注意四元数的顺序:[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_rotationcam_from_rig_translation 字段即可。

然后可以选择进行 bundle adjustment 或重新从头开始带 rig 约束的重建。

具体方法请参考官方文档:https://colmap.github.io/rigs.html,文档中还给出了一个使用ETH3D rig 数据集进行重建的完整示例,以及用360°全景图进行重建的方法。


总结 #

COLMAP 的 rig 支持使得多相机系统的三维重建变得更加灵活和高效。无论是已知还是未知 rig 传感器位姿的情况,都可以通过合理的工作流程实现高质量的重建。对于需要处理多视角、立体相机或全景设备的应用来说,掌握 COLMAP 的 rig 功能是非常有价值的技能。