RealCat

· 5 min read

项目:Omni-SfM,用相机 rig 约束重建全景视频

全景相机是采集场景最省事的设备:举着走一圈,360° 全部拍下,不用操心取景。但等距柱状(equirectangular)投影的图像并不适合直接做 SfM:畸变随纬度剧烈变化,大多数局部特征和匹配器都是在针孔图像上训练或设计的,而且 COLMAP 对球面相机的支持也是最近才加入的。

Omni-SfM 走的是另一条路:把每一帧全景图重投影成若干张虚拟针孔图像,这些虚拟相机之间的相对位姿是精确已知的(由 yaw、pitch 直接给出),正好构成一个 rig。然后用 COLMAP 的 rig SfM 来重建,既能用上所有成熟的针孔特征匹配方法,又能借助 rig 约束让位姿估计更稳。

带 rig 约束的稀疏重建 局部放大,可以看到每一帧的 8 个虚拟相机严格对齐

原理

核心代码在 src/omni_processor.py,流程分三步。

抽帧。从全景视频按间隔抽取等距柱状帧。

切分针孔视图。对每一帧,用 py360convert 的 e2p 做等距柱状到透视的重投影。默认生成 8 个视图:俯仰角 ±35°,各配 4 个朝向,水平和垂直视场都是 90°。虚拟相机的焦距由视场角推出:

俯仰 ±35° 的设计是为了避开全景图的天顶和地面,那里通常是天空或者拍摄者自己,对重建没有贡献;两层视图上下各覆盖 90°,加起来基本把有用的区域盖住了。

导出 rig 配置。每个视图的内参写入 camera_params.json;以其中一个视图为参考相机,其余视图相对参考相机的旋转由 yaw、pitch 构造(按 COLMAP 的 X 右、Y 下、Z 前坐标系),写入 rig_config.json。平移为零,因为所有虚拟相机共享同一个光心。

输出目录长这样:

outputs/20250602xxxxxx/pinhole_images
├── images
│   ├── pitch_-35_yaw_-90
│   ├── pitch_-35_yaw_0
│   ├── pitch_-35_yaw_180
│   ├── pitch_-35_yaw_90
│   ├── pitch_35_yaw_-90
│   ├── pitch_35_yaw_0
│   ├── pitch_35_yaw_180
│   └── pitch_35_yaw_90
├── camera_params.json
└── rig_config.json

接下来交给 COLMAP。rig SfM 会把同一帧的 8 张图当作一个整体来注册,相对位姿固定,只优化 rig 的 6 自由度位姿,所以即使某几个视图纹理很差(比如正对一面白墙),也能靠其他视图把这一帧定住。

使用

Gradio 界面

git clone https://github.com/Vincentqyw/omni-sfm.git
cd omni-sfm
pip install -r requirements.txt
python app.py
Gradio 界面

上传全景视频,设置抽帧间隔和视图参数,点击运行就会得到上面的目录结构。也可以直接在 Hugging Face Space 上试。

脚本

scripts/ 下有两个重建脚本,分别对应命令行版 COLMAP 和 pycolmap:

python scripts/run_cmd_colmap_rig_sfm.py \
    --image_path outputs/20250602xxxxxx/pinhole_images/images \
    --rig_config outputs/20250602xxxxxx/pinhole_images/rig_config.json \
    --camera_config outputs/20250602xxxxxx/pinhole_images/camera_params.json \
    --output_path outputs/20250602xxxxxx/sfm \
    --visualize

--camera_model 可选 PINHOLE、SIMPLE_PINHOLE、SIMPLE_RADIAL,默认 PINHOLE,因为虚拟针孔图像本身没有畸变。

ComfyUI 节点

项目还提供了一组 ComfyUI 自定义节点,把 src/ 拷到 ComfyUI 的 custom_nodes/omni-sfm/ 下即可。节点包括:

  • OmniVideoLoader:加载等距柱状或立方体贴图格式的全景视频。
  • OmniParameterControls:设置视场、俯仰、朝向等参数。
  • OmniVideoProcessor:生成虚拟针孔图像。
  • OmniReconstruction:运行重建。
  • OmniPreview:交互式 360° 预览。
ComfyUI 工作流

现状与计划

项目仍处于 WIP 状态,目前可用的部分是切图、rig 配置生成和两条 COLMAP 重建脚本。几件想做的事:

  • 把抽帧和动态物体掩膜交给 COLMAP Forge,避免两边各写一套。
  • 支持 COLMAP 新加入的 EQUIRECTANGULAR 相机模型,和虚拟针孔方案做个对比。
  • 在 COLMAP Sparse Viewer 里直接查看 rig 重建结果。

MIT 许可,欢迎在 GitHub 上提 issue。