我是一名拥有十年企业软件工程经验的开发人员,我的业余爱好将我带入了计算机视觉(CV)这个广阔而可怕的领域。
我不太清楚的一件事是Structure from Motion (SFM)工具和Multi View Stereo (MVS)工具之间的分工。
具体来说,CMVS似乎是最好的MVS工具,而Bundler似乎是更好的开源SFM工具之一。
摘自CMVS自己的主页:
你应该总是在Bundler之后和PMVS2之前使用CMVS
我想知道:为什么?!?我对SFM工具的理解是它们为您执行3D重建,那么为什么我们首先需要MVS工具?它们添加了哪些像Bundler这样的SFM工具无法解决的价值/处理/特性?为什么建议的管道:
Bundler -> CMVS -> PMVS2
?
快速地说,运动结构(SfM)和多视图立体(MVS)技术是互补的,因为它们不处理相同的假设。它们的输入也略有不同,MVS需要相机参数才能运行,这是由SfM估计(输出)的。SfM只能给出粗糙的3D输出,而PMVS2给出更密集的输出,最后CMVS可以规避PMVS2的一些限制。
答案的其余部分提供了每个方法如何工作的高层次概述,解释了为什么是这样的。
from Motion
您强调的3D重建管道的第一步是SfM算法,可以使用Bundler, VisualSFM, OpenMVG或类似的方法完成。该算法输入一些图像,输出每张图像的相机参数(稍后详细介绍)以及场景的粗 3D形状,通常称为稀疏重建。
为什么SfM只输出一个粗糙的3D形状?基本上,SfM技术首先检测每个输入图像中的2D特征,并在图像对之间匹配这些特征。例如,目标是告诉"这个桌子角位于那些图像中的那些像素位置"。这些特性由我们所说的描述符(如SIFT或ORB)来描述。这些描述符是用来表示一个小区域的。(图像中的一堆相邻像素)。它们可以可靠地表示高度纹理或粗糙的几何形状(例如,边缘),但这些场景特征需要在整个场景中是唯一的(在区分的意义上)才有用。例如(可能过于简单),具有重复图案的墙壁对于重建来说不是很有用,因为即使它具有高度纹理,墙壁的每个区域也可能与墙壁上的其他地方非常匹配。由于SfM正在使用这些特征执行3D重建,因此3D场景重建的顶点将位于这些独特的纹理或边缘上,从而给出粗网格作为输出。SfM通常不会在没有精确和区分纹理的表面中间产生顶点。但是,当在图像之间找到许多匹配时,可以计算图像之间的3D变换矩阵,有效地给出两个相机姿势之间的相对3D位置。
多视图立体
之后,使用MVS算法对SfM技术得到的网格进行细化,得到所谓的密集重构。该算法需要每张图像的相机参数才能工作,这些参数由SfM算法输出。因为它在一个更有约束的问题上工作(因为他们已经有了每个图像的相机参数,如位置,旋转,焦点等),MVS将计算没有(或不能)被描述符正确检测或匹配的区域的3D顶点。这就是PMVS2做的。
PMVS如何在2D特征描述符难以匹配的区域上工作?既然知道了相机参数,就知道图像中的给定像素是另一图像中直线的投影。这种方法被称为极外几何。SfM必须在整个2D图像中为每个描述符查找潜在的匹配,而MVS将在单个1D行上查找匹配,从而大大简化了问题。因此,MVS通常在优化时考虑光照和物体材料,而SfM则没有。
但是,有一个问题:PMVS2执行非常复杂的优化,可能非常慢,或者在大图像序列上占用天文数字的内存。这就是CMVS发挥作用的地方,将粗糙的3D SfM输出聚类到区域。然后将在每个集群上调用PMVS2(可能是并行的),从而简化其执行。然后CMVS将每个PMVS2输出合并到一个统一的详细模型中。 结论这个答案中提供的大部分信息以及更多信息可以在CMVS和PMVS2的作者Yasutaka Furukawa的教程中找到:http://www.cse.wustl.edu/~古/论文/fnt_mvs.pdf
本质上,这两种技术都来自两种不同的方法:SfM旨在使用结构化(但未知)图像序列执行3D重建,而MVS是基于人类立体视觉的双视图立体视觉的概括。