Contents — find the section you need
运动结构重建(SfM)恢复的是一个稀疏的三维点云,其中只连接了特征点。你可以辨认出建筑物的轮廓或纹理的棱角,但墙壁和曲面几乎没有任何点,因此无法直接用作“形状”。多视图立体视觉(MVS)则以运动结构重建或相机标定已知的相机位姿为前提,估计图像中几乎每个像素的深度,从而将其填充为密集的点云或网格。分工明确——位姿估计是运动结构重建的任务,密集形状重建是多视图立体视觉的任务——这是理解这两种技术之间关系的起点。
0. 30 秒概要
-
多视图深度估计 (MVS) 技术利用已知姿态的多张图像估计密集的逐像素深度,并将其整合到点云或网格中。它是将 SfM 的稀疏点云填充为密集形状的下游过程。
-
其核心原理是照片一致性:假设一个 3D 点具有正确的深度,并且多张图像中对应点的像素应具有相似的颜色和亮度。
-
有两种经典的代表性方法:平面扫描 (Plane-Sweep),它通过扫描深度候选点(作为平面)来评估一致性;以及基于块的深度估计 (PMVS),它通过迭代扩展和过滤小块来评估一致性。
-
近年来,基于深度学习的方法(例如 MVSNet)通过卷积处理代价体,在精度和鲁棒性方面逐渐超越了传统方法。
-
生成的多视图深度图可以直接用作点云,也可以通过 TSDF 融合或泊松曲面重建转换为网格。使用立体相机或深度相机进行实时深度估计与使用照片一致性原理相同,但在视点数量、离线性和计算预算方面有所不同。
1. 输入是什么?它求解什么?
MVS 的输入是以下信息,这些信息已通过 SfM 或相机标定获得:
-
每张图像 i 的相机位姿和内参 P_i = K_i[R_i\mid\mathbf{t}_i](视为已知)
-
一组拍摄目标场景的图像 \{I_1,\dots,I_N\}
输出是每张图像(或一组选定的参考图像)的密集深度图 \{D_i\},或通过积分这些图像获得的点云/网格。如果说 SfM 的输出——稀疏点云和相机位姿——是“骨架”,那么 MVS 就是为其“填充血肉”。在位姿未知的情况下,无法恢复密集形状——MVS 始终位于 SfM 或校准之后,从一开始就应该牢记这个顺序。
2. 为什么稀疏点云不够用?
SfM 无法直接输出密集点云的原因在于其输入依赖于特征点匹配。正如我们在特征检测入门中看到的,只有“独特”的像素——角点、边缘——才能被稳定地检测和匹配。像光滑的墙壁这样纹理均匀的区域完全没有特征点,这会在 SfM 的 3D 点云中留下一个巨大的空白。
另一方面,MVS 可以利用位姿已知的强大约束,因此它完全不需要特征点。对于任何像素,它可以直接评估“这个深度候选点在其他图像中是否保持一致?”这使得即使对于纹理稀疏的墙面,只要存在一些图案或阴影可供参考,也能估算其深度(完全没有特征的表面仍然是一个弱点,如下所述)。
3. 核心原则:照片一致性
几乎所有多值视觉系统 (MVS) 方法都基于照片一致性的假设。假设参考图像中像素 \mathbf{u} 对应的三维点深度为 d;该三维点可以恢复为
而照片一致性假设是,将其重新投影到另一幅图像 k 中像素 \mathbf{u}' = \pi_k(\mathbf{X}(\mathbf{u},d)) 处,其颜色和亮度应接近 I_{\text{ref}}(\mathbf{u})。最容易理解的方式是将其概括为立体相机视差搜索的一般化过程,即从两个视点扩展到N个视点。该过程在深度相机的工作原理和立体相机的工作原理中有所介绍,其原理是通过匹配亮度来查找左右图像之间的对应像素。实际上,双眼立体相机的深度可以通过以下简单公式计算:
其中,焦距为f,基线长度为B,视差为d_{\text{disp}}。MVS正是将“搜索视差并转换为深度”这一操作扩展到任意数量、任意排列方式的相机。
典型的实现方式是在像素周围使用一个小窗口 W,并使用归一化互相关 (NCC) 来衡量一致性。
\mathbf{x}' 是通过将 \mathbf{x} 映射到图像 k 而获得的对应点,假设深度候选点 d 处存在局部平面。\mathrm{NCC} 对亮度尺度和偏移变化具有鲁棒性,因此即使图像之间存在一些曝光或光照差异,它也能正常工作。计算每对图像和每个深度候选点的一致性得分,并选择得分最高的深度,构成了 MVS 的计算框架。
4. 基本流程
经典的 MVS 基本形式是一个两阶段结构:首先选择平面扫描或基于块的方法找到每幅图像的密集深度图,然后在第二阶段将它们融合为一个一致的 3D 形状。现代基于深度学习的方法大多遵循相同的两阶段结构,同时用神经网络替换了深度估计的内部机制。
5. 平面扫描方法
平面扫描方法可以追溯到 Collins 在 1996 年 CVPR 会议上提出的空间扫描多图像匹配方法。它在参考相机的视野内,排列成与参考相机光轴垂直(或根据场景方向)的等距虚拟平面。视锥体,并在从浅到深扫描深度的过程中进行评估。
假设存在一个深度为d的平面,该平面上的点可以通过单应性变换从参考图像映射到另一幅图像。使用形式为H = K_k(R+\mathbf{t}\mathbf{n}^\mathsf{T}/d)K_{\text{ref}}^{-1}的变换(详见单应性入门),另一幅图像I_k被扭曲到参考视点。在扭曲后的图像和参考图像之间的每个像素上计算图像一致性(例如上一节中的NCC),并累加每个深度候选的代价。
一旦计算出每个深度候选的代价,就选择每个像素的最小代价深度。这是一个离散深度搜索,非常适合GPU并行化,可以同时评估多个深度假设。许多实现将其与半局部代价聚合(类似于正则化)相结合。半全局匹配(Semi-Global Matching)即使在纹理稀疏的区域也能平滑地从相邻信息插值深度。COLMAP 的密集重建模块也采用了一种接近平面扫描(Plane-Sweep)的方法,优化了逐像素视图选择(Pixelwise View Selection)——Schönberger 等人在 ECCV 2016 上发表的论文就是一个典型的例子。
6. 基于块的方法(PMVS)
基于块的方法不是逐像素扫描深度,而是直接生成并扩展一组覆盖场景表面的小矩形块。PMVS(基于块的多视图立体视觉)就是一个典型的例子,由 Furukawa 和 Ponce 于 2010 年在 IEEE TPAMI 上发表。
处理过程重复三个阶段:“匹配、扩展、滤波”。
-
匹配:首先从易于检测为特征点的对应点(例如 SIFT 或 Harris 角点)生成少量初始块。每个块包含中心位置、法线方向和集合。 1. 扩展:将新的图像块传播到初始图像块的邻域内,扩大覆盖范围至周围像素。每个传播图像块的位置和法线都经过局部优化,以最大程度地提高与周围图像的像差一致性。
-
过滤:移除可见性存在矛盾的图像块(例如,一个图像块明明位于另一个图像块的后面却仍然可见)或像差一致性较低的图像块。
与平面扫描(Plane-Sweep)独立确定每个像素的深度不同,PMVS 包含图像块法线的额外信息,因此对于倾斜表面,它往往具有更高的重建精度。另一方面,由于它基于迭代扩展和过滤,因此在初始图像块较少或纹理较差的区域,扩展过程进展缓慢,重建结果往往存在空洞。
7. 基于深度学习的方法:成本体积思想
近年来,出现了一些方法,它们表示每个深度候选点的一致性,而不是使用人工设计的度量(例如……)。 NCC)但结合卷积神经网络学习到的特征和代价体已成为主流。一个典型的例子是姚等人于2018年ECCV会议上发表的MVSNet。
MVSNet通过训练好的特征提取器从每幅图像中提取特征图,假设参考相机视锥体内存在离散的深度平面,并通过可微分的单应性变换将每幅图像的特征图与参考视点对齐。它将多幅图像特征图的方差组合成一个单一的代价体,用3D卷积对其进行正则化,然后沿深度方向通过softmax回归深度。它的基本框架遵循平面扫描的“扫描深度候选区域并进行评估”的思想,但与传统方法的区别在于,图像一致性的计算本身是可学习的。
只要训练数据包含类似情况,基于学习的方法在手工设计的图像一致性指标难以奏效的情况下(例如重复模式、纹理较弱)往往表现得更加稳健。另一方面,在与训练数据集分布相差甚远的场景(例如不熟悉的材质、极端光照)中,性能可能会下降。
8. 深度图融合与网格划分
由于多视角深度图是独立估计的,因此直接将它们作为 3D 点叠加会因噪声和遮挡而产生矛盾(例如,同一位置略微偏移的点堆积在多个图层中,或者不同视角之间的深度不一致)。融合是将这些深度图整合为一个单一、一致的表示的过程。
-
点云融合:仅采用不同视角深度一致的像素,舍弃置信度低的深度,然后进行融合。COLMAP 等算法就是通过这种方式输出密集点云。
-
截断符号距离函数 (TSDF) 融合:一种体素方法,由 Curless 和 Levoy 在 1996 年 SIGGRAPH 会议上提出,它将空间划分为体素,并在每个体素中累加一个符号距离。该方法广泛应用于实时计算。深度相机融合(例如 KinectFusion),也适用于融合 MVS 深度图。
-
网格划分:从点云或有符号距离场出发,诸如 Kazhdan 等人于 2006 年提出的泊松曲面重建等方法可以生成平滑的多边形网格。添加纹理映射即可完成一个可用于视觉的 3D 模型。
9. 代表性算法比较
| 方面 | 平面扫描 | 基于块的算法 (PMVS) | 基于学习的算法 (MVSNet 系列) |
|---|---|---|---|
| 原理 | 扫描深度平面,评估每个像素的光度一致性 | 迭代地扩展和过滤小块 | 使用 CNN 正则化代价体并回归深度 |
| 精度 | 取决于深度分辨率和代价聚合设计;中等到高 | 对于倾斜或复杂的局部形状往往比较准确 | 高精度在接近训练数据的条件下 |
| 计算成本 | 易于 GPU 并行化,速度快 | 由于迭代处理,速度往往比平面扫描慢 | 训练后推理速度快;训练成本另计 |
| 鲁棒性 | 在纹理稀疏区域较弱 | 在初始块较少的区域容易留下空洞 | 对纹理较弱或重复图案的鲁棒性相对较好 |
| 实现难度 | 中等(单应性变形和成本聚合) | 高(可见性管理和迭代扩展设计) | 高(需要训练数据和网络设计) |
| 代表性实现 | COLMAP 密集型,许多商业摄影测量工具 | PMVS/CMVS | MVSNet,以及后续基于学习的方法 |
10. 与立体相机和深度相机的关系
MVS 与立体相机和深度相机共享其基本原理——“从多个视点的对应关系中寻找深度”。相机(参见[/zh/blog/posts/sensor-depth-camera.html]),但它们的位置不同。
-
立体相机采用固定的双眼排列,将视差搜索限制在沿极线的一维范围内,并且基于实时处理而设计。MVS 的平面扫描方法可以理解为将这种视差搜索推广到任意数量、任意排列的相机。
-
深度相机(结构光、ToF、主动立体)主动投射光线,即使对于纹理稀疏的表面也能稳定地获取距离。由于 MVS 仅依赖于被动的光一致性,因此它在低纹理表面上天生处于劣势——这与主动深度相机有着明显的区别。
-
MVS 本质上是离线的,它从大量图像(数十到数百张)中构建高精度、高密度的形状,而立体相机和深度相机则经过优化,可以实时逐帧输出深度信息。
根据应用场景,例如机器人或增强现实(AR),MVS 可以应用于机器人或增强现实(AR)领域。需要实时性能的应用适合立体/深度相机,而离线高精度三维模型(例如用于文化遗产记录、建筑测绘或摄影测量)则适合多模态立体视觉(MVS)。
11. 困难条件和常见故障案例
-
纹理稀疏或均匀的表面:白色墙壁、普通地板和天空几乎无法提供照片一致性的线索,导致深度无法确定,或者被周围噪声拖拽至错误值。
-
镜面反射、透明或半透明物体:玻璃、水面和金属光泽会随视角变化而改变外观,这本身就破坏了照片一致性的假设。
-
重复图案:田野中的瓷砖、砖块和成排的庄稼会产生“幽灵解”,即错误的深度仍然显示出较高的局部照片一致性。
-
遮挡:如果可见性估计错误,仅从某些视角可见的区域最终可能会使用错误的图像来评估照片一致性,从而破坏深度估计。
-
视点不足或视差过大:如果覆盖视点的数量太少,或者视差过小,则一开始就无法获得深度方向上的分辨率。
12. 实用选择
-
如果姿态信息已通过 SfM 或标定获得,且目标是优先考虑精度的离线 3D 重建(例如文化遗产记录、建筑测量、视频制作的摄影测量),则平面扫描(Plane-Sweep)系列方法(例如 COLMAP 的密集流水线)是一个不错的起点。
-
如果对倾斜表面或复杂局部形状的精度要求较高,可以考虑 PMVS 系列中的基于块的方法,或者采用融合其思想的混合实现。
-
如果您事先知道场景纹理稀少或包含许多重复图案,则基于学习的方法(例如 MVSNet 系列)通常更稳健。由于在训练数据分布之外的场景上性能可能会下降,因此在采用任何方法之前,请先在接近目标域的数据上进行评估。
-
对于需要实时性能的应用— 机器人、AR/VR、自动驾驶中的障碍物检测 — 请考虑使用立体相机或深度相机代替多视图立体(MVS)。MVS 的主要应用领域是离线、高密度、高精度的深度重建。
-
如果最终交付物需要是网格或纹理化的 3D 模型,请在深度图融合阶段选择 TSDF 融合或泊松曲面重建;如果仅需点云即可,则可以到此为止。
13. 总结
多视图立体(MVS)以已知的相机位姿(通过 SfM 或标定获得)为给定条件,并利用照片一致性作为线索来恢复密集深度信息。两种经典方法——平面扫描法和基于块的方法——各有优缺点,而近年来,学习代价体积的 MVSNet 系列方法进一步提升了精度和鲁棒性。流程贯穿始终,直至融合和网格化生成的深度图。理解其中的区别——多视图立体视觉 (MVS) 牺牲实时性能以换取精度,而立体/深度相机则优先考虑实时性能——是做出正确实际选择的基础。
更密集的点云是否能保证更精确的几何形状?
更多不准确的深度并不能提高精度。请将多视图一致性、遮挡、反射和纹理与密度分开检查。
评论
请先登录。
暂无数据。