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