从摄影测量学到高斯渲染:顶级三维成像系统 DIY 踩坑记
在查一些关于实时 NeRF(神经辐射场)和 NeRF 模型合并方面的最新研究进展时,看到了一个已经做了接近十年的项目最新宣传视频。
对于一个建筑摄影师而言,这种项目的魅力根本无法拒绝。这也是我一年多前开始踩入三维重建这个深坑时看到的第一个项目,那是 2009 年的一篇论文,标题翻译过来大概的意思是:“一天重建罗马”。
通过那篇论文,我开始进入了摄影测量学的学习,开始接触了第一个开源程序 Colmap,理解了 SIFT 和 SFM 模型。至于,一会儿要说的算法,例如各种 NeRF,各种 Gaussian Splatting,各种商业软件和开源程序,手机 APP:Metashape,RealityCapture,MeshRoom,Pix4D,MeshLab,NeRF Studio,PolyCam,Kiri Engine,则都是后话了。
也是通过那篇论文,我开始看到了摄影的另一种可能性:数字化我们周遭的世界,可以叫元宇宙,可以叫数字孪生,无所谓。于是,在过去一年多的时间,踩了很多的坑,未来也必将要踩更多的坑。但,很多路径,无论是硬件的,算法的,还是流程的,都逐渐清楚了,于是正值苹果 Vision Pro 带来的空间计算的新热潮,希望通过这篇文章,能够把各方面结合自己的实践教训,系统性的讲述一遍。
三维重建最初的样子:摄影测量学
大概自从照相机被发明出来,一些摄影师和工程师就在思考一个问题:能否通过一张照片,测量物体的尺寸。比如,能否通过对建筑拍摄照片,知道建筑物的外观尺寸。但是这里面有非常多的问题需要克服,比如尺寸、参照物、透视、形变等等。当然,这毕竟提供了一种前所未有的新方法:我们可以通过镜头焦距、像距(镜头焦点到胶片的距离)、胶片尺寸,用几何方法对物体的尺寸进行计算,虽然这种方法在如今看来,精度一定是很低的,但是相信在那个时代,相对精度一定是有大幅提升的。
所以,最早的摄影测量学(Photogrammetry)这个词汇,就是出现在普鲁士建筑师 Albrecht Meydenbauer 一篇名为《Die Photometrographie》的文章里。而他在 1868 年也做了一件事:登上了柏林 Rotes Rathaus 的山顶,拍摄了柏林城的 360 度照片,当然是胶片的,大概是最早的全景照片。感谢数码技术的进步,放到如今,手机都能很轻易的生成全景照片。
然而,如果要进一步提高测量精度,还是需要建立被拍摄物体的三维模型。这点对于学过机械制图的工科学生而言并不陌生,最简单的方式就是三视图,通过正面、顶面、侧面三张平面图可以知道物体的三维模型。这也是早期最容易想到的方式。记得家中书架上还有本画册,应该是德国的摄影师兼建筑师的手稿,都是建筑照片和对应的非常详细结构图。这些应该都是胶片时代的产物,要做到书中的精度,背后的工作量难以估算。
到了数码时代,这件事情就变得容易了许多。当然,背后也是因为算法的进步,略过算法进化史不说,直接进入摄影测量学两大基石算法:
- SfM (Structure from Motion) 模型:基本原理是,如果有对同一物体不同角度的两张及以上照片,就可以通过线性变化,得到物体的三维空间结构。
- SIFT (Scale-Invariant Feature Transform):尺度不变特征转换算法。意思是,无论照片是放大、缩小还是旋转,提取的特征都是不变的。
如果尝试把两个算法结合起来看:先用 SIFT 进行特征提取与匹配,再用 SfM 生成三维结构。这里有两个关键点:如何确定同一个物体?不同角度的照片如何表示?
SIFT 的作用就在这里:首先通过寻找不同照片里相同或类似的特征来进行物体匹配。因为照片是从不同角度、甚至不同设备拍摄的,所以 Scale-Invariant 不仅指特征匹配对尺度变化不敏感,对于角度变化(俯仰、旋转等)也是稳定的。即使两张照片是不同位置、不同角度拍摄的,通过 SIFT 算法也可以将同样的特征点匹配起来。
一组照片在经过 SIFT 后,每两张照片都能得到特征的匹配对。下一步就是通过 SfM 算法确定每个特征的空间结构与位置。简单而言,照片里的特征是从空间到相机成像平面(图像传感器)的一个映射。当两张照片间匹配的特征对数超过一定数量(通常至少三个),就能求得两张照片成像平面的相对空间位置(称为相机姿态,Camera Pose)。如果一组照片里的每两张都能计算出空间相对位置,最终就可以得到整组照片的相对空间位置。
很多软件都具备这种获得相机姿态的功能,包括开源的 Colmap 以及 Metashape、RealityCapture、Pix4D 等商业软件。获取相机姿态数据是几乎所有三维重建算法(包括 NeRF 和 Gaussian Splatting)的前提。虽然最近有一些论文尝试直接通过神经网络预测相机姿态,但实际测试下来,精确度尚无法超越 Colmap 或商业软件。
从实际使用层面讲,除拍摄技巧外,有两个参数对质量和计算时间影响巨大:每张照片提取的特征数量和照片质量(分辨率)。特征数越多、质量越高,对算力的消耗也越恐怖。在三维时代,唯算力与存储才是永恒的真理。
点云图(Point Cloud / 稀疏模型)
当照片(相机)的位置都计算出后,就开始重建整个三维空间。既然 SfM 算法中实际物体的特征是成像平面上的映射,那么反函数就是:空间里的一个特征也是照片上对应区域在空间上的映射。如果我们设定一个特征必须在至少三张照片里出现才映射到三维空间中,遍历所有特征后,就可以勾勒出一个物体在空间中的三维结构。这些特征在空间里的分布非常离散,因此被称为“稀疏模型”(Sparse Model)或“点云图”(Point Cloud)。
点云图是三维重建最关键的节点,其质量受到采集设备、流程、算法和参数的影响。建议使用 35-50mm 焦段的镜头以平衡形变与信息量。采集时的注意点包括:使用三脚架确保清晰度、保证照片间 60% 以上的重叠、移动相机位置而非仅变换角度、以及避免使用画质较差或有“果冻效应”的视频提取帧。
三维重建与网格渲染
生成点云图后,设定合适的坐标系即可完成测量。但为了生成“以假乱真”的连续三维空间,我们需要进一步处理。主流算法包括 MVS(多视角立体生成)、NeRF 和 3DGS(三维高斯飞溅)。
在 MVS 框架下,第一步是计算深度图(Depth Map)。每一张照片都对应唯一的深度图,用灰度表示距离,反映了从该视角看出去的物体空间位置。深度图提供了场景的位置信息,通过多张深度图的融合,能得到更高质量的三维连续空间。
下一步是表面纹理(Texture)。将输入照片作为素材,贴回到生成的结构体表面。然而,即使是像素级比对,生成的三维空间严格来说也不是连续的,仍存在缝隙。目前通行的方法是 Mesh(网格渲染),将点(Vertices)连接成无数个三角形平面填满空间。而去年的新算法 3DGS 则是在每个顶点生成一个高斯平面,类似泼墨作画,从而实现极佳的渲染效果。
补充:激光雷达、IMU 与融合方案
对于需要高实时性的场景(如智能驾驶、机器人),传统的摄影测量流程由于计算量过大而不适用。因此引入了激光雷达(LiDAR),它可以直接产生距离信息并快速生成点云和深度图。但激光雷达缺少图像信息,因此目前的趋势是“融合方案”:利用固定位置并经过矫正的相机,配合 IMU(惯性测量单元)捕捉体态变化,将图像流与激光雷达数据实时融合。
Apple Vision Pro 的火爆开启了“空间计算”热潮。它本质上是一个高度集成的三维采集与计算设备。苹果通过 TrueDepth 相机(ToF 镜头)和激光雷达,配合 ARKit 软件包,极大地降低了空间建模的门槛。无论是智驾车还是 MR 眼镜,核心都在于如何高效地通过视觉与传感器数据重建我们周遭的世界。