(长文)基于图像的三维重建(SFM+MVS+MVSNET+点云重建)

目录

  • 1. 三维视觉的核心问题
  • 2. 三维视觉与视觉计算框架
  • 3. 三维视觉与类脑计算
  • 4. 三维几何视觉的核心问题
    • 4.1. SLAM
    • 4.2. SFM
    • 4.3 SLAM误差消除策略
    • 4.4 SFM误差消除策略
  • 5. 图像三维重建基本流程
    • 5.1. 稀疏重建(Structure from Motion)
      • 5.1.1. 基础:小孔相机模型
      • 5.1.2. 基础:重投影误差最小化
      • 5.1.3. 分层重建
      • 5.1.4. 基础:直接度量重建(K已知)
      • 5.1.5. 稀疏重建算法SFM
    • 5.2. 稠密点云重建MVS
      • 5.2.1. MVS的基本思路
      • 5.2.2. 图像一致性
      • 5.2.3. 对极线
      • 5.2.4. Search Space
      • 5.2.5. 聚合
      • 5.2.6. 单应变换
      • 5.2.7. PatchMatch
      • 5.2.8. 多斯图PatchMatch MVS
      • 5.2.9. 逐像素点选择邻域图像组
    • 5.3. MVSNET
    • 5.4. 网格建模
    • 5.5. 语义建模
    • 5.6. 矢量建模
    • 5.7. 总结

1. 三维视觉的核心问题

三维视觉的核心问题是通过海量的二维图像,还原现实场景的三维结构、场景的语义信息、相机的空间位姿(如下图)。同时,我们希望得到的信息具备几何精确性、场景完整性、语义准确性、高效矢量表达等特性。
在这里插入图片描述

2. 三维视觉与视觉计算框架

在这里插入图片描述
其中,2.5维深度图指以观察者为视点的深度图。不过它只能看到物体可见表面的深度。而三维模型指的是物体不变量,任何观察视角下,重建出来的物体形状都不会发生改变。

3. 三维视觉与类脑计算

在这里插入图片描述

4. 三维几何视觉的核心问题

三维几何视觉核心问题即场景结构+相机位姿+(相机参数)。

我们可以通过两种途径来求解这个核心问题:

4.1. SLAM

SLAM是实时来处理这个核心问题的。主要针对连续的图片或视频序列,重建场景稀疏/准稠密/稠密结构与相机位姿(on-line),再进而通过闭环检测+图优化(on-line),完成重建。

4.2. SFM

而SFM则主要是根据离散的多视角图像,离线地匹配各图像,重建场景稀疏结构与相机位姿。

SLAM和 Incremental SfM的误差都在于:错误匹配→误差累计→场景漂移。可以看出,SLAM和增量式SFM逻辑相关。

4.3 SLAM误差消除策略

Multi-sensor fusion(多传感器融合(融合Lidar,IMU等))

用***Loop closure & Pose-graph optimization & Bundle adjustment***来将误差在图像之间进行均分。

4.4 SFM误差消除策略

View graph filtering

Tracks selection:

在匹配的过程中,一个特征点会跨越多幅图像,最终优化过程中,每个特征点都需要参与到最后的BA优化过程中,三维点越多,优化精度越高。如果能选择一些又长又好又稳定的匹配点序列,那么可能会提高优化的鲁棒性和稳定性。(前提是能离线地进行选择)。

Next best view:

对于SFM来说,增量式过程中,下一幅图像的添加可以不来自当前图像的相邻帧,可以选择更合理、能看到当前图像场景最多、视角最好最稳定的帧。这样可以避免错误累计的影响。

Global bundle adjustment:

最后,SFM可以频繁地调用全局捆绑调整,使得每次增量过程,都可以进行全局的优化,减少错误累计的影响。

5. 图像三维重建基本流程

在这里插入图片描述

5.1. 稀疏重建(Structure from Motion)

在这里插入图片描述
输入:多视角图像、输出:相机位姿、稀疏点云。即:
在这里插入图片描述
图片来源:N. Snavely, et. al. IJCV 2008.

那么,是如何通过多视角图像来获取相机位姿和场景结构的呢?

5.1.1. 基础:小孔相机模型

在这里插入图片描述
所谓小孔相机模型,即在相机坐标系下,三维点与图像点的对应关系。

其中,把三维空间点定义在相机坐标系下,二维图像点和三维空间点在相差一个尺度因子下相等。满足如下关系:
在这里插入图片描述
内参矩阵:把世界坐标系中,实际度量,以米/厘米为度量单位的三维点转换到图像坐标系中以像素为度量单位的二维图像点。这种转换关系与内参矩阵有关。

但把三维空间点(物体)定义在相机坐标系下,相机一动,三维点坐标也变,故不合适。

我们更常用的方式是将世界坐标定义在物体上,如果将世界坐标定义在物体上,则在该坐标系下每个三维点如果要代入上述方程中,则需先转换到相机坐标系下。

在这里插入图片描述
其中,世界坐标系和相机坐标系只相差一个旋转、一个平移。

定义在相机坐标系下的三维点坐标与定义在世界坐标系下三维点的坐标的数学关系如下:
在这里插入图片描述
则在世界坐标系被定义到物体上时,二维图像点与三维空间点满足以下关系:
在这里插入图片描述
补充完小孔相机模型的知识点后,我们不要忘记这么做的目的是干嘛。

三维视觉的核心任务是还原相机位姿、场景结构、场景参数。而三维几何的任务则是通过二维图像点来推导上图等号右边式子中的未知量,进而转化为优化问题。

5.1.2. 基础:重投影误差最小化

假设我们已知相机内外参数K、R、t、三维点坐标,则可根据小孔成像模型投影到二维图像中,若投影点和实际图像上的二维点的像素距离尽可能的小,则之前得到的K、R、t、三维点坐标是比较好的重建结果。(如下图)。

这个过程即重投影误差最小化。即:我们已知多幅图像上的二维点,要求解相机内外参、畸变参数、三维点坐标。

在这里插入图片描述
在这里插入图片描述
上图即最小重投影误差的原理。至此,我们即把相机K、R、t、三维点坐标问题转化成重投影误差最小化的优化问题。

重投影误差最小化问题的求解公式:在这里插入图片描述
重投影误差最小化是一个高维非线性最小二乘问题。
在这里插入图片描述
上图K指相机内参:焦距、主点。畸变:未知量是2是因为相机至少含二阶镜像畸变(镜头复杂的还含有切向畸变)。M指稀疏点数量(每个三维点都有三个未知量)。

由于是高维非线性问题,我们使用BA去求解。

BA是一种启发式的阻尼高斯牛顿法,在几何视觉中广泛使用。但BA是迭代优化法,属于数值解法 。故求得的是局部极值。这种算法的有效性的前提是得提供一个理想的初始值,故绝大多数几何视觉任务的核心在于如何为最后这个整体的BA提供合理可靠的初始值。

以下是一些经典方案:

5.1.3. 分层重建

在这里插入图片描述

按上述,我们的任务在于:从两幅图像中,构建两个相机的内外参以及对应的三维点坐标,为最后的BA提供初始值。而分层重建将我们从图像点到三维重建分成三个层次来完成。

绝大多数几何视觉,最后都会转化为非线性优化的问题(需要优化未知量,而分层重建将问题肢解,每个子问题拥有的未知量不多,因此可提升几何重建算法的鲁棒性和稳定性)

5.1.4. 基础:直接度量重建(K已知)

我们当想相机内参数是已知的,这样我们就能直接完成从二维图像点到三维空间模型的度量重建,为BA提供初始值。

相机内参数可以简化为只有焦距这一个未知量(主点认为是图像的中心),而焦距在数字图像中可以通过EXIF头文件读取出来(即使没有,也可以给一个合理的假设)。同时目前的BA对相机初始的焦距比较鲁棒,即使相差上百个像素,也是可以通过BA优化回来,故在焦距已知的情况下,可用直接法求得相机位姿。
在这里插入图片描述
我们可以采用五点法。当相机内参已知时,两幅图像五个对应点可求解出两个相机的R、t,从而使得两相机内参、位姿已知。然后通过两视图三角化,把所有的三维点重建出来(这时的三维点坐标只是粗略值,需要把它当做初始值丢进BA里面不断迭代优化),则这样,所有的三维点坐标、所有的相机的K、R、t都已知,即初始值已经已知,将其输入到BA中,从而完成两视图重建。五点法如下图:
在这里插入图片描述
但如果不只是根据两幅图进行重建呢?该如何提供初值?

5.1.5. 稀疏重建算法SFM

这里就涉及到稀疏重建算法了。首先来看看稀疏重建的流程图,其中,标红的相机位姿初始化部分,正是我们前面在讲的:
在这里插入图片描述
事实上,无论是什么样的稀疏重建算法,都是在完成所有相机位姿初始化的问题。只要相机位姿有了,内参有了,则相应的三维点就可以通过三角化出来了。

对于SFM算法,由于离线特性,实际输入的不是原始图像,而是图像之间的匹配关系。具体说来,输入的是称为View graph的外机几何图的图。图中每个顶点(节点)都表示一副图像,每条边连接有公共可见区域的两幅图像。如下图所示:
在这里插入图片描述
由上图可知,每一条边上表达了对应图像对之间的极几何关系(每条边包含两幅图像的特征点以及在内参已知时,通过五点法分解出的两个相机之间的相对旋转R和相对平移t),其中:在这里插入图片描述
由于多视几何中的尺度齐一性,只能得到平移的朝向,而得不到绝对的尺度,故上图中,每个相机的绝对位姿R,绝对位置c。。。。。

SFM主要分为三类:增量式(Incremental)、全局式(Global)、混合式(Hybrid)。这里不详细展开他们的原理阐述。
在这里插入图片描述
两视图增量式SfM(K已知,5点法求取两视图相对位姿),相机摆放的姿态即相机位姿。
在这里插入图片描述
两视图SfM(两视图三角化)在这里插入图片描述

在这里插入图片描述
以上,通过五点法可以算出第一、第二相机的相对位姿,从而求出K、R、t,将三维点三角化出来,通过BA,求解两视图重投影误差最小化函数,最终完成两视图的重建。

再选择一副能够看到之前两视图重建出来的三维点最多的图像(所有图像事先匹配完了(之前特征点匹配时匹配过了),我们很容易知道每幅图像的点和已重建的三维点之间的对应关系),找出最合适的一幅图像,得到二维图像点和三维空间点之间的匹配关系。有了这样的二维、三维匹配,可以使用多视图几何中的PNP算法去求解。如下图所示:
在这里插入图片描述
一般使用P3P算法来计算相机位姿,即相机定位过程。当计算出第三个相机位姿之后,就有了第三个相位,我们可以继续引入新的匹配点(之前两视图时为匹配出的点),三视图三角化,把新的匹配点重新三角化出来,以此得到更多的匹配点,然后调用BA,把三个相机都优化,进而得到更稳定的三维点。之后不断添加相机、不断三角化、BA,直到把所有相机添加完毕,此时所有相机初始值都已知,通过BA,即可完成场景重建。这便是增量式SFM。

其优点:对匹配外点比较鲁棒,标定过程中通过RANSAC不断地过滤外点、重建场景精度高,捆绑调整不断地优化场景结构。

其缺点:对初始图像对选择及相机的添加顺序敏感、大场景重建时的累积误差可能导致场景漂移、反复的捆绑调整需要大量的计算时间。

在这里插入图片描述
而全局式SFM,是通过对应图像对之间的极几何关系一次性估计所有摄像机的旋转矩阵R,估计所有摄像机的位置C(或相机位姿),再三角化初始场景点,再BA,完成重建。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其优点:将误差均匀分布在外极几何图上,无误差累积、不需要考虑初始图像和图像添加顺序的问题、仅执行一次捆绑调整,重建效率高。

其缺点:鲁棒性不足:旋转矩阵求解时L1范数对外点相对鲁棒;而摄像机位置求、解时相对平移关系对匹配外点比较敏感、场景完整性:过滤外极几何边可能会丢失部分图像。

综上,我们知道全局式SFM在求解旋转矩阵R时可靠,平移求解不可靠。何不扬长避短呢?我们可以通过全局式估计摄像机旋转矩阵、增量式估计摄像机位置(相机位置是通过相机位姿求得的)(增量过程不考虑旋转矩阵R,因为全局式SFM求出了)。由此即可引出混合式SFM。
在这里插入图片描述
混合式SFM通过全局式估计摄像机旋转矩阵、增量式估计摄像机位置、局部捆绑调整,完成重建。

混合式SFM的增量过程和增量式SFM区别在于添加新图像时,旋转矩阵R已知,只需估计相机平移向量/相机光心。故最少只需两点,即可估计出平移向量t(不需要最少3个点,使用的点越少,RANSAC更鲁棒、可靠)。
在这里插入图片描述
其优点:解旋转矩阵误差均匀分布在外极几何图中(全局、一步求取)、全局旋转矩阵的求解缓解了后续增量式的误差累积问题(无需考虑计算旋转矩阵,未知量更少)、求解摄像机位置时,两点法求取更加鲁棒,捆绑调整次数更少。

其缺点:对旋转矩阵的精度依赖较高(因为假设了旋转矩阵已知)、计算相机位置后仍需要重复迭代的捆绑调整(还是增量式SFM的方法)。

以下附上SFM的经典文献:

增量式SfM:

1. N. Snavely, et al. Modeling the World from Internet Photo Collections. IJCV 2007.
2. P. Moulon, et al. Adaptive Structure from Motion with a contrario model estimation. ACCV 2012.
3. C. Wu. Towards linear-time incremental structure from motion. 3DV 2013.
4. J. Schonberger, et al. Structure-from-Motion Revisited. CVPR 2016.
5. H. Cui, et al. Progressive Large-Scale Structure-from-Motion with Orthogonal MSTs. 3DV 2018.
6. H. Cui, et al. Efficient and Robust Large-Scale Structure-from-Motion via Track Selection and Camera Prioritization. ISPRS
Journal of Photogrammetry and Remote Sensing, 2019.

全局式SfM:

1. N. Jiang, et al. A Global Linear Method for Camera Pose Registration. ICCV 2013.
2. M. Moulon, et al. Global Fusion of Relative Motions for Robust, Accurate and Scalable structure from motion. ICCV 2013.
3. K. Wilson, et al. Robust Global Translations with 1DSfM. ECCV 2014.
4. O. Ozyesil, et al. Robust Camera Location Estimation by Convex Programming. CVPR 2015 .
5. C. Sweeney, et al. Optimizing the Viewing Graph for Structure-from-Motion. ICCV 2015.
6. T. Goldstein, et al. Shapefit and Shapekick for Robust, Scalable Structure from Motion. ECCV 2016.
7. S. Zhu, et al. Very Large-Scale Global SfM by Distributed Motion Averaging. CVPR 2018.

混合式SfM:

1. H. Cui, et al. HSfM: Hybrid Structure-from-Motion. CVPR 2017.
2. S. Zhu, et al. Parallel Structure from Motion from Local Increment to Global Averaging. arXiv:1702.08601

5.2. 稠密点云重建MVS

在这里插入图片描述
稀疏点云重建(SFM)反映了场景的基本几何结构,但不能反映场景的完整几何结构。由此引入稠密点云重建(MVS)。

MVS即在相机位姿已知(SFM求得的)的情况下,逐像素地计算图像上每个像素点所对应的三维点,得到场景物体表面密集的三维点云,从而达到稠密重建的目的。

常见的MVS方法:在这里插入图片描述
其中第三个适合大规模重建。

5.2.1. MVS的基本思路

MVS的基本思路是:在相机位姿、内参已知的情况下,寻找空间中具有图像一致性(Photo-consistency)的点。
在这里插入图片描述

5.2.2. 图像一致性

图像一致性:选择的三维点位于物体表面,该三维点根据相对内外参,投影到图像上,以投影点为中心,取出两个方形小patch,图像中这两个patch包含的场景应比较类似。如下图:
在这里插入图片描述
反之,若该点(下图的小红点)投影到两幅图像上,则取出以该点为中心的两个小patch相差较大。如下图:
在这里插入图片描述
若能度量两个patch之间的一致性,则可衡量这个三维点是否位于物体表面。

而两视图图像的patch一致性(Photo-consistency)度量方法主要如下:在这里插入图片描述
在这里插入图片描述
我们来具体说说上述的Census:它计算快速,对光照整体变化比较鲁棒。

其思路:度量patch中每一个点和中心点(三维点投影到图像上的那个点)亮度的高低。若相对于中心点亮度高,则“ξ”设为1,相对于中心点亮度低,则ξ为0,则这两个patch即转换成0,1组成的二值向量。直接度量二值向量,也可以衡量他们在patch上统计的一致性作为度量。

在有了一致性度量,我们在MVS过程相当于:对于左图像中的每一个像素点,在右图像中寻找其对应点。若找到对应点,三角化之后得到三维点,把左图像上的像素点全遍历,即可得到左图像密集的深度图。

5.2.3. 对极线

当然,对于左图像中任何一点,在右图像中并不需要在所有图像点搜索,因为从相机光心连线到左图像黄点,会反向发出一条射线,而黄点对应的空间三维点一定位于该射线上。该线在右图上会有一条投影直线,称为对极线。故在右图搜索左图所对应的点时,只需在右图对极线上逐像素搜索即可。
在这里插入图片描述
如果通过图像一致性度量,把对极线上所有点的一致性都度量一遍,显然,在搜索过程中,一致性最高(或者说匹配代价最低的那个点就是我们要找的最有匹配点),把它当成真实匹配点,接着进行三角化,即可得到左右图像中的点所对应的空间三维点。
在这里插入图片描述

5.2.4. Search Space

该搜索过程,也可以等价转化为在左图像中的像素点对应深度方向上寻找深度范围的过程。因为在对极线中逐像素地搜索,等价于在那条射线上离散深度距离进行搜索。故可对左图像中每一个像素点,在沿光轴方向上设置一个Search Space(离散深度图),对于每一个深度值,都可得到它对应的二维点(这些二维点,不一定是图像上那个红点),可以投影到右图图像上来度量我们的一致性。如果把离散的Search Space上的每一个点在左右图像上的一致性都度量一遍,同样可和刚才一样,找到最优的匹配点。
在这里插入图片描述
这里涉及一个问题,若只衡量单个像素点的左右图像一致性,且把Search Space一致性最高的点作为深度点,会得到上图左下那个深度图(噪声大,因为只度量了单点的一致性,容易受到噪声成像影响)。故在立体视觉领域,更常用的方法是聚合

以下有空再写

5.2.5. 聚合

聚合(Cost aggregation):衡量一个点的一致性时,不使用单点在左右图像上的差异,而是使用以图像为中心的一个窗口的整体度量来完成左右图像的整体的一致性度量。事实上,SAD、SSD、NCC等都是常用的聚合方法。那么使用聚合也可以等价于在整个三维空间中,把窗口的所有像素点都在他们Search Space上离散成成一个个不同的深度。度量一致性时,三维空间某个深度上聚合周边所有深度点来度量左右两幅图像之间的一致性。

这里涉及到一个问题,若在左图像中选择一个方形窗口,则窗口每个点在右图像中对应点在哪?

5.2.6. 单应变换

这时我们需要使用多视几何基本概念——单应变换

通常在聚合时,首先要在Search Space上选择一个空间平面的方向,通常会假设空间平面是一个平行于相机平面的方向(Fronto-Parallel Plane, 前平行平面),FPP给定了空间的一个平面方程,根据多视图几何原理,若我们已知左右相机K、R、t,且已知空间的一个平面,那么位于这个平面上的所有点,它们在左右图像上的投影点都会满足一个称为单应的变换关系,这个单应矩阵是可以解析地给出的,由左右相机的内外参数以及这个空间平面的方程,解析得出。

若得到单应变换矩阵,对于左图像方框中每一个点,我们都可以通过单应矩阵,在右图像找到其对应点,此时我们就有了左右两幅图像的窗口,即可以使用SSD、SAD、NCC来计算聚合值。这里边我们假设了空间平面是平行于相机平面。故空间平面的方程容易求解(空间平面方程只需空间上一个点以及这个平面的的法向量即可)。

这个点呢?因为我们深度已知,我们知道空间点的位置,因为它平行于相机平面,故他们法向量为(0,0,-1)^T,代入平面方程,即可得到单应矩阵,完成左右图像点的对应来完成聚合计算。

那么在聚合计算过程中,最简单的一类方式是聚合窗口中每一个点对中心点的贡献都一致。如使用SAD,则在这窗口的每一个点对中心点聚合的一致性的贡献都一样。

但这结果会有问题。刚才假设如果左右两幅图像中这两个窗口满足单应变换的前提是两窗口中的所有点都位于空间中的同一平面上,但事实上左图窗口既包含桌子上的点,也包含背景点。即窗口中并不是所有点都位于同一空间平面上,这时不同位置的点对应的单应矩阵不同,若使用同一单应变换计算时,背景处的像素点计算肯定是错误的,即意味着实质上,我们在计算聚合时,窗口中每一个点对中心点的贡献有差异,和中心点位于同一平面上的点,它贡献比较高,不位于同一平面,则贡献低。但事实上,我们没有求解出它的深度,故不知哪些点和它位于同一平面上,故可使用一些启发式的方式——自适应权值(Adaptive weight)。

这里边聚合时,每一个窗口的点并不是同等的。对中心点匹配是有同样的贡献,而是有差异的。该差异通过两个值来衡量(衡量颜色的一致性,若窗口中的点和中心点的颜色比较一致,则它和中心点位于同一平面的概率比较高;同时还衡量距离,若窗口中的点距离中心点的距离越近,则它的贡献也比较高,距离越远,则权值越小)。

结果好一些,但背景区域呈现出比较明显的阶梯状(刚才假设中FPP平面,假设计算聚合时,所有的平面都是平行于相机平面的,但事实上不太实际。实际中,存在很多空间平面和相机平面不平行,故那么和相机平面法向量差异比较大的空间平面,计算出来会呈现比较强的阶梯状。显然合理的方式为在聚合时,不同空间平面的像素点使用不同法向量的空间平面进行聚合,最好这个空间平面和真实空间法向一致。但此时我们没有计算出深度图,我们并不知道每个点的实际空间法向是多少,故需要使用启发式方式。

如对于每一个像素点,在三维空间中除了度量平行相机平面那个聚合外,还可以离散地找几个特定方向(30度,60度。。。),在不同平面上分别聚合,把聚合后一致性最高的值当作最后值,最终得到更准确的重建结果。

在空间聚合时,空间平面的法向对于我们的计算非常重要,为啥不度量更多的法向,更多情况?(极端情况是我们把空间所有法向全度量一遍,找到一个非常和空间法向适合的空间平面方向进行聚合)

既然我们找到空间平面所在法向对于聚合非常重要,那么干脆为每一个像素点寻找一个最优的空间法向,但不可能把它全遍历,因为对每个点来说,它的三维点一定沿视线方向的射线上所对应的某个空间平面上,沿视线方向移动,只有深度这个自由度,那么空间法向是有两个自由度,且是在连续空间,而在连续空间中,3个自由度不可能全遍历。故PatchMatch采用随机初始化和邻域传播。

既然对于每一个像素点,它的深度和法向对聚合都非常有影响,则干脆对每一个像素点都首先完全随初始化。

5.2.7. PatchMatch

5.2.8. 多斯图PatchMatch MVS

5.2.9. 逐像素点选择邻域图像组

5.3. MVSNET

5.4. 网格建模

5.5. 语义建模

5.6. 矢量建模

5.7. 总结

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cashapxxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值