快速地说,运动结构 (SfM) 和多视图立体 (MVS) 技术是互补的,因为它们不处理相同的假设。它们的输入也略有不同,MVS 需要相机参数才能运行,这是由 SfM 估计(输出)的。SfM 只提供粗略的 3D 输出,而 PMVS2 提供更密集的输出,最后 CMVS 可以规避 PMVS2 的一些限制。
答案的其余部分提供了每种方法如何工作的高级概述,并解释了为什么会这样。
运动结构
您强调的 3D 重建管道的第一步是 SfM 算法,可以使用Bundler、VisualSFM、OpenMVG等来完成。该算法输入一些图像并输出每个图像的相机参数(稍后会详细介绍)以及场景的粗略3D 形状,通常称为稀疏重建。
为什么 SfM 只输出粗略的 3D 形状?基本上,SfM 技术首先检测每个输入图像中的 2D 特征,并在成对的图像之间匹配这些特征。例如,目标是告诉“这个桌角位于那些图像中的那些像素位置”。这些特征由我们所谓的描述符(如 SIFT 或 ORB)来描述。这些描述符用于表示图像中的一个小区域(即一堆相邻像素)。它们可以可靠地表示高度纹理化或粗糙的几何形状(例如,边缘),但这些场景特征需要在整个场景中是唯一的(在区分的意义上)才能有用。例如(可能过于简单),具有重复图案的墙壁对于重建不会很有用,因为即使它具有高度纹理,墙上的每个区域都可能与墙上的其他任何地方相匹配。由于 SfM 正在使用这些特征执行 3D 重建,因此 3D 场景重建的顶点将位于那些独特的纹理或边缘上,从而提供粗网格作为输出。SfM 通常不会在没有精确和可区分纹理的表面中间产生顶点。但是,当在图像之间找到许多匹配时,可以计算图像之间的 3D 变换矩阵,从而有效地给出两个相机姿势之间的相对 3D 位置。t 通常在表面中间产生一个顶点,没有精确和可区分的纹理。但是,当在图像之间找到许多匹配时,可以计算图像之间的 3D 变换矩阵,从而有效地给出两个相机姿势之间的相对 3D 位置。t 通常在表面中间产生一个顶点,没有精确和可区分的纹理。但是,当在图像之间找到许多匹配时,可以计算图像之间的 3D 变换矩阵,从而有效地给出两个相机姿势之间的相对 3D 位置。
多视图立体
之后,使用 MVS 算法对通过 SfM 技术获得的网格进行细化,从而产生所谓的密集重建。该算法需要每张图像的相机参数起作用,由SfM算法输出。由于它适用于更受约束的问题(因为它们已经具有每个图像的相机参数,如位置、旋转、焦点等),MVS 将计算描述符未(或无法)正确检测到的区域上的 3D 顶点或匹配。这就是PMVS2所做的。
PMVS 如何在二维特征描述符难以匹配的区域工作?由于您知道相机参数,因此您知道图像中的给定像素是另一张图像中一条线的投影。这种方法称为对极几何。SfM 必须在整个 2D 图像中寻找每个描述符以找到潜在的匹配项,而 MVS 将在单个 1D 行上工作以找到匹配项,从而大大简化了问题。因此,MVS 通常会在其优化中考虑照明和物体材料,而 SfM 没有。
但是有一个问题:PMVS2 执行了一项相当复杂的优化,它可能非常缓慢,或者在大型图像序列上占用大量内存。这就是CMVS发挥作用的地方,它将粗略的 3D SfM 输出聚类到区域中。然后将在每个集群上调用 PMVS2(可能是并行的),从而简化其执行。CMVS 然后将每个 PMVS2 输出合并到一个统一的详细模型中。
结论
此答案中提供的大部分信息以及更多信息可以在本教程中找到,来自CMVS 和 PMVS2 的作者Yasutaka Furukawa:
http ://www.cse.wustl.edu/~furukawa/papers/fnt_mvs.pdf
从本质上讲,这两种技术都来自两种不同的方法:SfM 旨在使用结构化(但未知)的图像序列执行 3D 重建,而 MVS 是基于人类立体视觉的双视图立体视觉的泛化。