什么是摄影测量?运动恢复结构(SfM)通俗讲解
什么是摄影测量?本文用平实的语言讲清运动恢复结构(SfM)、稠密重建、网格与贴图的流程,介绍免费和付费的摄影测量软件、它的局限,以及高斯泼溅如何沿用同一步相机求解。
什么是摄影测量?
摄影测量(photogrammetry)是从照片中推算形状和位置的方法。美国农业部的农业叙词表用一句话定义它:从照片中推导出精确测量结果的科学。在今天的日常用法里,这个词通常指更具体的一件事:给一个物体或一处地方拍很多互相重叠的照片,再让软件把它们变成 3D 模型。
背后的原理和你的两只眼睛一样。同一个点从两个位置看,会落在略有不同的地方,这个差别就透露了它的远近。摄影测量软件对几十上百张照片、成千上万个点同时做这件事。
让普通的、无序的照片也能这样处理的核心技术,叫运动恢复结构(structure from motion,简称 SfM)。下面依次讲它做什么、后面还有哪些步骤、有哪些摄影测量软件,以及这种方法的边界在哪里。
运动恢复结构:先找出相机在哪里
运动恢复结构同时回答两个问题:每张照片拍摄时相机在哪里?它看到的点又在哪里?开源流程 COLMAP 的文档把这个过程分成三个阶段。
- 特征检测与提取。软件在每张图里寻找有辨识度的小位置,比如角点和纹理斑点,并为每一个存下一段数值描述。这类特征的经典例子是 SIFT,出自 David Lowe 2004 年的论文《Distinctive image features from scale-invariant keypoints》。
- 特征匹配与几何验证。在图片之间比较这些描述,找出不同照片里的同一个位置。不符合一致相机几何关系的匹配会被剔除。
- 结构与运动重建。逐步注册新的图片、三角化新的点,把场景一点点扩展开。
结果是一组相机位姿(每张照片的位置和朝向)、焦距等相机内部参数,以及一份稀疏点云:一层稀疏的、匹配可靠的 3D 点。它看上去像场景的一个朦胧轮廓,还算不上模型,但后面的一切都建立在它之上。这一步失败或跑偏,后面都补救不了。
从稀疏点到模型:稠密重建、网格、贴图
相机位置确定之后,软件就能做精细得多的工作,因为它已经确切知道每张照片之间的关系。
- 稠密重建。名为多视图立体(multi-view stereo)的步骤以 SfM 的结果为输入,为每张图的每个像素计算深度,而不只是那些有辨识度的位置。把这些深度图融合起来,就得到比稀疏点云细致得多的稠密点云。
- 网格化。根据稠密点云估计出表面,把它连成三角面。例如 COLMAP 提供 Poisson 和 Delaunay 两种网格化方法。
- 贴图。把原始照片投影回三角面,并拼成一张贴图,让网格带上对象的真实颜色。
最后得到的是带贴图的网格,也就是 3D 编辑软件、游戏引擎、AR 查看器以及(稍加清理后)3D 打印机使用的那类文件。面向测绘的工具还能用同一份数据生成平面成果,比如带地理参照的地图和高程模型。
摄影测量用在哪里
只需要一台相机,所以摄影测量出现在很多领域。下面是这些工具自己列出的例子:
- 无人机测绘。WebODM 说明可从航拍图像生成带地理参照的地图、点云、高程模型和带贴图的 3D 模型。
- 文化遗产与考古。Agisoft 把考古遗址、文物和建筑列为 Metashape 生成 3D 模型的对象。
- 测量。Metashape 专业版带有测量距离、面积和体积的工具。
- 游戏、影视和 AR。Apple 把 Object Capture 介绍为给真实物体创建逼真 3D 模型并可在 AR 中查看的方式,Epic 把 RealityScan 介绍为把周围环境变成数字资产的方式。
对爱好者来说,常见用途更简单:扫描一件东西再打印一份、给自己做的作品留一份 3D 记录,或者给个人项目做素材。
入门需要什么
门槛不高。
- 一台相机。起步用手机就够。照片清晰、曝光正常,比像素高低更重要。
- 合适的对象。表面要有看得见的纹理,而且要保持不动。
- 足够多、重叠足够的照片。COLMAP 的建议是每个部分至少出现在三张照片里,并且从不同位置拍,而不是站在原地转动。Apple 建议单个物体拍 20 到 200 张近距离照片。
- 稳定的光线。整组照片光照条件相近,没有强烈反差和眩光。
- 一台显卡够用的电脑。重活都是 GPU 在干,有些工具还绑定特定硬件。COLMAP 文档写明:没有支持 CUDA 的显卡时,除稠密重建外的功能都可使用;Apple 的 API 则运行在 macOS 上。
- 耐心。处理时间从几分钟到几小时不等,取决于照片数量和设置。
摄影测量软件:免费与付费的选择
摄影测量软件大致分几类。以下内容来自各项目自己的页面;条款会变,决定之前请再核对一次。
免费开源:
- COLMAP。通用的 SfM 与多视图立体流程,有图形界面和命令行,采用 new BSD 许可证。
- Meshroom。基于 AliceVision 框架的免费开源 3D 重建软件,以 MPLv2 发布。它的流程以节点图的形式呈现。
- WebODM。开源软件(AGPL v3),面向无人机图像和测绘成果。
多数个人免费、较大企业付费:
- Epic Games 的 RealityScan。其许可页面写明:过去 12 个月收入低于 100 万美元的个人和小型企业,以及学生和教育机构可免费使用;更大的公司按席位付费。另有免费的手机应用 RealityScan Mobile。
商业软件:
- Agisoft Metashape。分标准版和专业版,提供演示模式和 30 天试用。专业版增加了高程模型、正射影像、地面控制点和测量等测绘功能。
平台内置:
- Apple Object Capture。macOS 上的摄影测量 API,输出带材质贴图的网格,通常是 USDZ 文件。它是供应用使用的基础组件,本身不是一个应用。
所以,想找免费的摄影测量软件,确实有可用的选择。代价通常在便利性上:开源工具在安装和学习上要你多花些功夫。
摄影测量的局限
摄影测量依赖于在多张照片里找到同一个点。凡是破坏这个前提的情况,都会出问题。
- 没有纹理的表面。白墙或空桌面让软件无从匹配。
- 反光和透明材质。高光和倒影会随相机移动而移动,表现得不像固定的点。COLMAP 的建议就是避免光滑表面上的高光反射。
- 运动。人、宠物、风里的树叶和变化的影子都会让照片前后不一致。
- 细薄和毛茸茸的东西。头发、毛皮、枝叶和铁丝很难变成干净的三角面。
- 缺口。没拍到的地方就是缺失的,或者变成已知区域之间一段粗糙的连接。
- 真实尺寸。只靠照片建出的模型没有自带的尺度。用于测量的工具提供比例尺或地面控制点来设定它。
这些都不是软件缺陷,而是方法本身带来的结果。认真拍摄是绕开它们的主要办法。
高斯泼溅如何沿用同一步相机求解
高斯泼溅是用照片建立 3D 场景的较新方法,它并不取代运动恢复结构,而是从它开始。2023 年的原始论文《3D Gaussian Splatting for Real-Time Radiance Field Rendering》写明,它从相机标定过程中得到的稀疏点出发。实际操作中,这就是上面讲的特征匹配和相机求解。开源的泼溅引擎 Brush 也说明它以 COLMAP 数据作为输入。
两条路在这之后分开。摄影测量继续做稠密点云、网格和贴图。高斯泼溅则用大量彩色的小 3D 高斯来表示场景,不断调整它们,直到渲染出的画面与照片一致。这里没有表面,所以高斯场景能较好地呈现柔软和细碎的细节,也所以不能直接用在需要网格的地方。
两者继承了同一个弱点:如果因为重叠不足或照片缺少特征导致相机求解失败,两种方法都无从下手。
SplatLoom 适合哪里
SplatLoom 不是做网格的那种摄影测量软件,它不导出网格,也不做测量。需要可打印的模型或测绘成果,请用上面那些工具。
它用同样的第一步,得到不同的结果。SplatLoom 内置 COLMAP 负责相机求解、Brush 负责高斯泼溅训练,在你自己的 Mac(Apple Silicon,macOS 15 及以上)或 Windows 10/11 电脑上运行,不需要 Python 和命令行,不上传,不需要账号。选好互相重叠的照片或一段视频,点「生成」,整理场景,然后导出高斯 PLY、PNG 静帧、MP4 环绕视频或离线 HTML 查看器。价格为一次性 19.90 美元。如果你想从照片里得到的是一个可以环顾、便于分享的逼真画面,而不是网格,这就是它适合的地方。
常见问题
摄影测量和运动恢复结构是一回事吗?
不完全是。运动恢复结构是从重叠照片中算出相机位置和一组稀疏 3D 点的那一步。通常所说的摄影测量是整条流程:先做运动恢复结构,再做稠密重建、网格化和贴图。
有免费的摄影测量软件吗?
有。COLMAP、Meshroom 和 WebODM 都是开源的。按 Epic 的许可页面,RealityScan 对年收入低于 100 万美元的个人和小型企业免费。Agisoft Metashape 是商业软件,但有 30 天试用。
用手机能做摄影测量吗?
拍摄可以。只要照片清晰、光线好、互相重叠,手机摄像头就够用。处理通常在电脑上进行。也有用于扫描的手机应用,比如 Epic 免费的 RealityScan Mobile。
为什么我的扫描失败了,或者有破洞?
多半是照片的问题。重叠太少、表面太素或反光、场景里有东西在动、有些地方根本没拍到,都会让软件匹配不上点。从更多位置、以更多重叠重拍,能解决大多数情况。
高斯泼溅算摄影测量的一种吗?
前半段是共用的。两者都用运动恢复结构找出相机位置。之后摄影测量建出网格,高斯泼溅则用许多彩色小高斯搭出一个用于逼真观看的场景。
参考资料:https://lod.nal.usda.gov/nalt/57942 · https://colmap.github.io/ · https://colmap.github.io/tutorial.html · https://colmap.github.io/faq.html · https://colmap.github.io/license.html · https://www.cs.ubc.ca/~lowe/keypoints/ · https://github.com/alicevision/Meshroom · https://meshroom-manual.readthedocs.io/en/latest/ · https://github.com/OpenDroneMap/WebODM · https://www.realityscan.com/en-US · https://www.realityscan.com/en-US/license · https://www.agisoft.com/features/standard-edition/ · https://www.agisoft.com/features/professional-edition/ · https://developer.apple.com/videos/play/wwdc2021/10076/ · https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/ · https://github.com/ArthurBrussee/brush
在 SplatLoom 中试试