【三维重建】运动恢复结构SfM理解记录:初始化与参数估计

目录

  • 一、SfM的认识
  • 二、SfM的初始化
  • 三、SfM的实现
    • 1、投影变换矩阵
    • 2、投影过程
    • 3、参数初始估计
    • 4、最小化重投影误差
  • 注意
  • 参考文献

一、SfM的认识

  1. 三维重建=图像序列+SfM+MVS+…
    图像序列:拍摄多视图照片集
    SfM:能求出每个图像的参数(包括内参和外参),还有稀疏三维结构
    MVS:是基于SfM的输出下,进行稠密化。
    还有后续的曲面重建等等。
    三维重建:综述 链接1,链接2;项目链接
    开源的sfm可以参考colmap,mvs可以参考openmvs,3D模型可视化可以用meshlab。
    整体论文阅读入门综述:《Multi-View Stereo: A Tutorial》
    三维重建,sfm、mvs等之间的关系图:
    【三维重建】运动恢复结构SfM理解记录:初始化与参数估计_第1张图片

  2. SfM,全称:structure from motion
    意思就是运动能够恢复结构,1985年由Hartley等人提出,能够从图像序列中恢复场景或对象的结构信息。以下针对可见光RGB相机。

  3. 两种情况
    主要分为两种情况:a)相机运动、场景(物体)不动,b)相机不动、场景(物体)运动。前者效果会更好些,因为如果场景或物体是非刚性的情况下,自身运动会带来扭曲偏移等。例如,重建植物时,植物的叶子可能会抖动,非常不利于三维重建。

  4. 现状
    目前,SfM已经应用很多,重建结果也不错。也有难点:细节(硬件是个主要因素;也看过一些关于细长枝条的重建,很强)、非刚性、运动状态、大场景。还有万物皆可深度学习的情况下,三维重建也可以用深度学习来实现。

  5. 分类
    SfM的 分类:增量式(incremental/sequential),全局式(global),混合式(hybrid),层次式(hierarchical),基于语义的SfM(Semantic SfM)。

以下都是增量式SfM

二、SfM的初始化

  1. 图像特征点的提取与匹配
    一般就是sift

  2. 初始化图像对的选择
    一般选择具有最多匹配数目的图像对,而且这些匹配不能由单个单应矩阵很好地建模(主要是避免两张图像接近重合的情况,因为这样基线会很短,不利于三角化)。
    使用RANSAC以max(w, h) * 0.4%的离群值阈值找到每对匹配图像之间的单应性,存储与估计的单应性更接近的特征匹配的百分比。选择初始图像对作为对恢复的单应性具有最低百分比的图像对,但是具有至少100个匹配项。此钳位函数的效果是,重投影误差大于16.0像素的所有点将被作为异常值拒绝,而重投影误差小于4.0的所有点将被保留为内值,确切的阈值位于这两个值之间。

  3. 使用五点法来估计这对相机的参数(外参)
    (为什么可以用五点法呢,不是还需要内参K吗?),这里所需要的内参K由图像自带的EXIF提供(包括焦距、像素、镜头型号等),这些作为K的初始值。用五点法,可以估计出R和t。

  4. 三角测量
    有了内参、外参,就可以将两幅图像中可见的轨迹(也就是匹配点)进行。

  5. 捆绑调整
    内参是粗糙,五点法的结果也不一定好。就需要进行两帧捆绑调整。在每次运行优化后,会检测包含至少一个具有较高重投影误差的关键点的离群点轨迹,并将这些轨迹从优化中删除。其中,离群点阈值:计算该图像的重投影误差的第80个百分位数,并使用 m i n ( m a x ( ( 2.4 D 80 , 4.0 ) , 16.0 ) min(max((2.4D_{80},4.0),16.0) min(max((2.4D80,4.0),16.0) 作为离群值阈值。在拒绝异常值之后,重新运行优化,直到没有检测到更多的异常值。

  6. (优化中还有很多细节,可以参见文献[2])

三、SfM的实现

上述中,没提到图像的畸变;这里会引入。文献[3]提到,有相关商用软件(PTLens)可以去畸变,利用EXIF的相机和镜头信息,如果有图像是无效去畸变,则提剔除该图像。也有文献写到,把畸变纳入SfM中,如文献[2]。
以下内容参见[2][4]。

1、投影变换矩阵

【三维重建】运动恢复结构SfM理解记录:初始化与参数估计_第2张图片
K里面5个参数,R里面3个,T也是3个。所以一共需要估计11个参数。其中, s s s是skew的意思,一般为0;并且假设 f x = f y f_x=f_y fx=fy(因为像素物理尺寸一般是正方形的,例如 3.0 μ m × 3.0 μ m 3.0\mu m × 3.0\mu m 3.0μm×3.0μm), ( c x , c y ) (c_x,c_y) (cx,cy)是图像中心(根据像素个数就能算出来),所以需要估计的参数变为了7个。当把径向畸变考虑进来时,引入2个系数 κ 1 , κ 2 \kappa_1,\kappa_2 κ1,κ2。最终,需要估计的参数是9个。
旋转矩阵,可以用旋转向量表示。由旋转向量变换到旋转矩阵R,可由罗德里格斯公式表示
罗德里格斯公式
向量的反对称形式:
【三维重建】运动恢复结构SfM理解记录:初始化与参数估计_第3张图片
Θ = [ ω , c , f , κ 1 , κ 2 ] \Theta=[\omega,c,f,\kappa_1,\kappa_2] Θ=[ω,c,f,κ1,κ2],其中 c c c就是平移向量,只不过不同文献有不同写法,这里面把它看作了相机光心在世界坐标系的坐标(coordinate),就简写为了 c c c

需要估计的参数,都已经列出来了。

2、投影过程

  1. track说明
    在这里插入图片描述
    这是论文中对tracks的说明:就是tracks是个集合;track是其中一个元素,里面放着一个三维点与不同图像上对应的2D投影点的关系。
    关于轨迹(迹)track的个人理解,一个三维点,可能会同时被多张图像所拍到。下面是一条track的示意图,可以理解为一个二维数组。track就是一个3D点在不同图像中对应的特征点所连成的一条链子吧。
    【三维重建】运动恢复结构SfM理解记录:初始化与参数估计_第4张图片
  2. 参数说明
    Θ i \Theta_i Θi表示某张图像(相机)的参数(包含内外参);
    X j X_j Xj表示m条tracks中第j条track在 Θ i \Theta_i Θi下的3D点坐标;
    P ( Θ , X ) P(\Theta,X) P(Θ,X)表示一个投影过程;
    q i j q_{ij} qij表示3D点 X j X_j Xj在图像 Θ i \Theta_i Θi中的像素点;理论上3D点会完美投影到像素点,但是噪声、误差等因素导致不可能出现。
  3. 公式推导
    懒得打公式了,直接截图了,公式推导可以参见文献Modeling the World from Internet Photo Collections。不排除有一些细节,我没展示出来(狗头)
    【三维重建】运动恢复结构SfM理解记录:初始化与参数估计_第5张图片
    第三条公式的 g r d ( P 0 ) g_{rd}(P_0) grd(P0)表示畸变方程。由下面公式描述该过程:
    To map a projected 2D point p = ( p x , p y ) p = (p_x,p_y ) p=(px,py) to a distorted point p ′ = ( x ′ , y ′ ) p^{'} = (x^{'} , y^{'}) p=(x,y), we use the formula: (把一个图像的点投影到畸变点,用下面的公式)
    【三维重建】运动恢复结构SfM理解记录:初始化与参数估计_第6张图片
    一般 κ 1 , κ 2 \kappa_1,\kappa_2 κ1,κ2会初始化为0,为防止过大,还会在优化函数(后面会讲到)中加入一项 λ ( κ 1 2 + κ 2 2 ) \lambda(\kappa_1^2+\kappa_2^2) λ(κ12+κ22) λ \lambda λ取10.0。
    至此,就能把3D点与图像上的2D联系起来。

3、参数初始估计

  1. 直接线性变换DLT
    是利用3D-2D点(至少6组),可以估计外部参数以及一个上三角矩阵K,这些参数用于最小化重投影误差的优化函数中的初始值。
  2. 问题:此时K有两个初始值?
    该怎么抉择?内参主要是 f f f
    对于直接线性变换DLT返回的内参 K 1 K_1 K1 f 1 = ( K 11 + K 22 ) / 2 f_1=(K_{11}+K_{22})/2 f1=(K11+K22)/2
    对于图像自带EXIF的 f 2 f_2 f2,当满足 0.7 f 1 < f 2 < 1.4 f 1 0.7f_10.7f1<f2<1.4f1时,就用 f 2 f_2 f2,否则就用 f 1 f_1 f1
    当使用 f 2 f_2 f2时,需要在优化函数中添加一项 γ ( f − f 2 ) 2 \gamma(f-f_2)^2 γ(ff2)2 γ \gamma γ取0.001,目的是让结果接近 f 2 f_2 f2

4、最小化重投影误差

【三维重建】运动恢复结构SfM理解记录:初始化与参数估计_第7张图片
就是要最小化上面的函数,其中 ω i j \omega_{ij} ωij表示有这个三维点和该帧图像二维点对应时(也就是说这帧图像看到了这个3D点),它就是1,否则就为0。
具体的最小化投影误差过程,网上有一些介绍,就不展开了。
至此,完结!

注意

该博文,并没有详尽描述每一个实现步骤的细节,因为在具体实现中,还有很多考虑的因素,上述的过程是在理想化前提下进行的。有兴趣深入了解的,一定要去看原文献,收益良多。而且,下面的文献都比较老了,现在已经很多优化了,要紧跟潮流呀。

参考文献

[1] Noah, Snavely, Steven, et al. Photo tourism: exploring photo collections in 3D[J]. Acm Transactions on Graphics, 2006.
[2] Snavely N , Seitz S M , Szeliski R . Modeling the World from Internet Photo Collections[J]. International Journal of Computer Vision, 2008, 80(2):189-210.
[3] Goesele M , Snavely N , Curless B , et al. Multi-View Stereo for Community Photo Collections[C]// Computer Vision, 2007. ICCV 2007. IEEE 11th International Conference on. IEEE, 2007.
[4] Furukawa Y , C Hernández. Multi-View Stereo: A Tutorial[M]. Now Publishers Inc. 2015.

你可能感兴趣的:(三维重建)