书接上回,前文尝试视频裁切帧的方式来进行3D高斯场景重建。
但视频切帧缺乏位置信息,运镜的速度、角度不均匀,会导致很多图片没法准确关联。
因此,想到另一种只需一次运镜就能完成场景重建的方案,那就是全景相机。
以Insta360 X系列的全景相机为例,它允许一前一后两台相机同时进行录制,通过视角合成,实现约等于360°的全景效果。

我手上正好有一台两年前购置的Insta360 X3,于是参考了Pixel Reconstruct的教程[1],尝试了一下通过全景相机来进行3D高斯场景重建。
前期拍摄
拍摄场景必须满足的一点是:拍摄过程中,没有行人经过。
因为后面要利用所有帧的图像来还原场景,如果一个角度有人,一个角度没人,可能就会造成画面不一致无法匹配,甚至场景的崩坏。
我选择了学校图书馆前一处行人较少的场景,等到行人走干净时,采用4K 30fps的规格进行录制。

拍摄方式是通过拍摄杆,将相机举到头顶,这样的好处是可以利用全景相机存在的视角差,让后面在裁剪画面时,可以不把自己的影响裁进去。

举着相机绕着这个场景走了两圈,一圈外圈,一圈内圈,耗时4分钟。
后期编辑
拍摄完成后,将视频导入insta360 studio里面进行编辑。
由于我拍摄的时间偏黄昏,画面亮度较低,因此我进行了简单的画面处理,主要调整三个值:
- 调高亮度:让画面看起来更亮,提升观感
- 调高曝光:在调高画面亮度的同时,减少画面中的噪点
- 调高清晰度:提升锐度,让场景边缘更加锐利,方便后面特征点匹配

调整完之后,导出.mp4格式的视频,直接用普通播放器打开,看到的是这样的画面,一个画面中,记录了两颗摄像头拍摄的信息。

视频切帧
下一步,就是将视频切成图像,采用ffmpeg进行处理,命令如下:
ffmpeg -i path/to/360_video.mp4 -vf fps=2 -qscale:v 1 (output_folder)/ image_%04d.jpg
其中,fps=2表示每2帧切一帧,如果步频较慢,可以间隔更多帧进行切帧。
切完帧后,共得到479张图片。

全景图片裁切
下一步,需要将这些全景图像裁切成正方形的图像块。
具体用到的是 meshroom[2],它仅支持windows和linux两个系统,需要下载2021.1这个版本。
因为后面的版本,命令有很大变化,只有该版本能使用下面的命令。

下面进入bin路径,用以下命令进行图像裁切:
aliceVision_utils_split360Images.exe -i (input 360 image folder) -o (output 2D image folder) --equirectangularNbSplits 8 --equirectangularSplitResolution 1200
裁切完之后,得到了3k多张1200x1200分辨率的图像块。

进行高斯重建
有了图像块之后,高斯重建就相对简单了。
下面采用colmap-gradio来计算colmap(花费了两个半小时),再用brush训练了三万步。

这两个工具前文已详细介绍过,这里不做赘述。
下图是重建完的效果:

编辑后预览
下面再使用SuperSplat对结果进行编辑,导入图像,会有很多冗余的散点。

编辑后,得到需要保留的区域。

下面基于GaussianSplats3D进行了模型可视化。

模型粗看还可以,但拉近细看还是有些"毛糙"的。
总结
本文打通了从全景相机到构建3DGS的流程路径,不过仍有两点可以优化:
- 选择在白天光线充足的时候进行拍摄,同时场景中避免水面/玻璃等反射物体干扰,理论效果会更好;
- 在计算colmap时,可以采用
RealityScan的方案,理论效果会比当前计算的效果更好。
后面抽时间再尝试一下新方案。
参考
1\] https://www.youtube.com/watch?v=LQNBTvgljAw \[2\] https://github.com/alicevision/meshroom/releases