· 5 min read
项目:Omni-SfM,用相机 rig 约束重建全景视频
全景相机是采集场景最省事的设备:举着走一圈,360° 全部拍下,不用操心取景。但等距柱状(equirectangular)投影的图像并不适合直接做 SfM:畸变随纬度剧烈变化,大多数局部特征和匹配器都是在针孔图像上训练或设计的,而且 COLMAP 对球面相机的支持也是最近才加入的。
Omni-SfM 走的是另一条路:把每一帧全景图重投影成若干张虚拟针孔图像,这些虚拟相机之间的相对位姿是精确已知的(由 yaw、pitch 直接给出),正好构成一个 rig。然后用 COLMAP 的 rig SfM 来重建,既能用上所有成熟的针孔特征匹配方法,又能借助 rig 约束让位姿估计更稳。
原理
核心代码在 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
上传全景视频,设置抽帧间隔和视图参数,点击运行就会得到上面的目录结构。也可以直接在 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° 预览。
现状与计划
项目仍处于 WIP 状态,目前可用的部分是切图、rig 配置生成和两条 COLMAP 重建脚本。几件想做的事:
- 把抽帧和动态物体掩膜交给 COLMAP Forge,避免两边各写一套。
- 支持 COLMAP 新加入的 EQUIRECTANGULAR 相机模型,和虚拟针孔方案做个对比。
- 在 COLMAP Sparse Viewer 里直接查看 rig 重建结果。
MIT 许可,欢迎在 GitHub 上提 issue。