在计算机视觉中,MVS相比SFM有哪些优势?

21

我是一名有着十年企业软件工程经验的开发人员,我的业余兴趣让我进入了广阔而可怕的计算机视觉(CV)领域。

有一件事情对我来说不是很清楚,那就是运动结构(Structure from Motion,简称SFM)工具和多视角立体成像(Multi View Stereo,简称MVS)工具之间的分工。

尤其是,CMVS似乎是最佳的MVS工具,Bundler则似乎是目前最好的开源SFM工具之一。

从CMVS的主页上摘取:

你应该始终在PMVS2之前使用Bundler和CMVS

我想知道:为什么?! 我对SFM工具的理解是它们可以为您执行3D重建,那么我们为什么需要MVS工具呢?它们添加了哪些价值/处理/特性,是Bundler等SFM工具无法解决的?为什么要采用前述的流程:

Bundler -> CMVS -> PMVS2

?

1个回答

37

简单来说,Structure from Motion (SfM)和MultiView Stereo (MVS)技术是互补的,因为它们处理的假设不同。它们的输入也略有不同,MVS需要相机参数才能运行,这些参数由SfM估计(输出)。SfM仅提供粗略的3D输出,而PMVS2提供更密集的输出,最后CMVS用于规避PMVS2的一些限制。

答案的其余部分提供了每种方法如何工作的高级概述,解释了为什么会这样。

Structure from Motion

你所强调的3D重建流程的第一步是使用BundlerVisualSFMOpenMVG等算法进行的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则是基于人类立体视觉的两视图立体视觉的泛化。


3
感谢 @Soravux (+1) - 我真的希望我能给这个答案更多的赞!如果您不介意,我有几个后续问题:**(1)** 稀疏重建(SFM的输出)本身有��吗?还是它们总是作为MVS的输入使用(我想知道它们是否单独解决任何有趣的问题)。 (2) 我一直听到“相机参数”这个术语...您能举出一两个这些参数的例子吗? - smeeb
2
最后,根据Bundler的开发者们所说:“在使用PMVS2之前,你应该始终在Bundler之后使用CMVS”(因此,Bundler >> CMVS >> PMVS2)...但是根据您的回答,正确的流程似乎是Bundler/SFM >> 制作聚类 >> 在每个聚类上运行PMVS2 >> 合并所有聚类 >> CMVS...这方面有什么想法吗?再次感谢您如此周到、详尽的回答! - smeeb
2
有趣的问题。1)SfM的关键要素是获取相机参数(参见2)。一旦你拥有了它们,你就可以开始使用MVS来理解场景。如果在SfM步骤后停止,我认为优势在于使用更少的计算能力(更快的输出/移动设备所需的较少能量),这在某些情况下可能会提供足够好的结果,例如粗略的体积估计或形状识别。我想这取决于需要执行的任务和要实现的目标。 - Soravux
3
相机参数包括内参矩阵和外参矩阵。两个矩阵中都包含数值(分别为3x3和3x4),用于解释相机(内参)或其姿态(外参)。内参参数包括焦距、相机中心点(中心像素)、传感器大小、错切量、径向畸变等。外参矩阵描述了相机的位置和旋转(相机在世界中的位置以及它所看的方向)。请查阅我提供的参考文献1.2节以获取更多信息。 - Soravux
2
摄像机参数的一个有趣细节:一旦你得到这两个矩阵,就可以取任何世界上的三维点[x,y,z],将其乘以这些矩阵,结果就是该三维点在图像中出现的位置。3)不用担心,CMVS已经处理了我所说的一切。PMVS2现在包含在CMVS代码和可执行文件中。您必须运行Bundler的导出器到CMVS / PMVS2(我相信是同一个可执行文件),然后只需使用正确的标志调用CMVS,我所说的一切都会被处理好。我只是想让您了解为什么会这样。 - Soravux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接