您当前的位置: 首页 >  矩阵
  • 2浏览

    0关注

    417博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

(01)ORB-SLAM2源码无死角解析-(21) 基本矩阵Fundamental→本质矩阵Essential 分解恢复 Rt

江南才尽,年少无知! 发布时间:2022-04-16 12:06:58 ,浏览量:2

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/123092196   文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证  

一、前言

通过前面的博客,我们可以知道如下两个公式(如果为同一相机,则其相机内参 K 1 = K 2 \mathbf K_1=\mathbf K_2 K1​=K2​): E = t ∧ R = t × R           p 0 T E p 1 = 0 (01) \tag{01} \color{blue} \mathbf E=\mathbf t ^{\wedge} \mathbf R=\mathbf t\times \mathbf R~~~~~~~~~\color{blue} p_0^T \mathbf Ep_1=0 E=t∧R=t×R         p0T​Ep1​=0(01) F = ( K 0 − T E K 1 − 1 )            v o T F v 1 = 0 (02) \tag{02} \color{blue} \mathbf F=(\mathbf K_0^{-T} \mathbf E\mathbf K_1^{-1}) ~~~~~~~~~~ \color{blue} v_o^T\mathbf Fv_1=0 F=(K0−T​EK1−1​)          voT​Fv1​=0(02)其上的 p 0 , p 1 p_0,p_1 p0​,p1​ 是图像坐标, v 0 , v 1 v_0,v_1 v0​,v1​ 是像素坐标; E \mathbf E E 表示本质矩阵 Essential, F \mathbf F F 表示基本矩阵 Fundamental。一般在程序的运行过程中,相机内参是移植的,另外在 ORB-SLAM2 源码中 K 1 = K 2 \mathbf K_1=\mathbf K_2 K1​=K2​,因为是同一相机。也就是已知相机内参的情况下,一般会先计算出本质矩阵,然后通过本质矩阵求解 R t \mathbf R\mathbf t Rt。求解本质矩阵的公式如下(同一相机): E = K T F K (03) \tag{03} \color{blue} \mathbf E= \mathbf K^T \mathbf F \mathbf K E=KTFK(03)   

二、反对称矩阵性质

再进行公式推导之前,我们需要了解一下反对称矩阵的一些性质(这里只列举部分→与后续公式推导相关的)。

性质 ( 1 ) : \color{red}{性质(1):} 性质(1): 当 A \mathbf A A为 n n n 实反对称矩阵时,那么存在 X T A X = 0 \mathbf{ X^TAX=0} XTAX=0, 其中 X \mathbf X X 为 n n n 阶矩阵( ∀ X ∈ R n \forall \mathbf X \in R^{n} ∀X∈Rn)。

性质 ( 2 ) : \color{red}{性质(2):} 性质(2): 实反对称矩阵的特征值为 0 或者虚数。

性质 ( 3 ) : \color{red}{性质(3):} 性质(3): 若 A \mathbf A A为 n n n 阶实反对称矩阵,则存在矩阵 n n n 阶正交矩阵 Γ \mathbf \Gamma Γ 使得: Γ T A Γ = [ 0 m 1 − m 1 0 ⋱ 0 m r − m r 0 ⋱ 0 m n − m n 0 ] , \mathbf \Gamma^T \mathbf A \mathbf \Gamma=\left[\begin{array}{cccccccc} 0 & m_{1} & & & & & & \\ -m_{1} & 0 & & & & & & \\ & & \ddots & & & & & \\ & & & 0 & m_{r} & & & \\ & & & -m_{r} & 0 & & & \\ & & & & & \ddots & & \\ & & & & & & 0 & m_{n} \\ & & & & & & -m_{n} & 0 \end{array}\right], ΓTAΓ=⎣ ⎡​0−m1​​m1​0​⋱​0−mr​​mr​0​⋱​0−mn​​mn​0​⎦ ⎤​,       上式中 ± b i \pm b_i ±bi​ 是 A \mathbf A A 的全部非零特征值, i ∈ { 1 , 2 , 3 ⋯   } i \in \{1,2,3 \cdots \} i∈{1,2,3⋯}。 A \mathbf A A 的秩 R ( A ) = 2 r R(\mathbf A)=2r R(A)=2r。其上矩阵 Γ T A Γ \mathbf \Gamma^T \mathbf A \mathbf \Gamma ΓTAΓ 称为实反对称矩阵 A \mathbf A A 在正交相似下的标准型。

性质 ( 4 ) : \color{red}{性质(4):} 性质(4):

 

三、基础推导

首先这里我们作如下假设(偏移矩阵与旋转矩阵): t = ( t 1 , t 2 , t 3 )               R = ( r 1 , r 2 , r 3 ) (04) \tag{04} \color{blue} \mathbf t=(t_1,t_2,t_3)~~~~~~~~~~~~~\mathbf R=(\mathbf r_1,\mathbf r_2,\mathbf r_3) t=(t1​,t2​,t3​)             R=(r1​,r2​,r3​)(04)那么我们根据公式(1)可得: E = t ∧ R = ( t ∧ r 1 , t ∧ r 2 , t ∧ r 3 ) (05) \tag{05} \color{blue} \mathbf E=\mathbf t^{\wedge} \mathbf R=\mathbf(\mathbf t^{\wedge} \mathbf r_1,\mathbf t^{\wedge}\mathbf r_2,\mathbf t^{\wedge}\mathbf r_3) E=t∧R=(t∧r1​,t∧r2​,t∧r3​)(05)根据前面博客的推论,我们知道 , E ,\mathbf E ,E 的奇异矩阵必是 d i a g ( σ 1 , σ 2 , 0 ) = ( t 1 2 + t 2 2 + t 3 2 , t 1 2 + t 2 2 + t 3 2 , 0 ) diag(\sigma_{1}, \sigma_{2}, 0)=(t_{1}^{2}+t_{2}^{2}+t_{3}^{2}, t_{1}^{2}+t_{2}^{2}+t_{3}^{2}, 0) diag(σ1​,σ2​,0)=(t12​+t22​+t32​,t12​+t22​+t32​,0)。另外根据反对真矩阵的性质: 反对称矩阵矩阵一定正交于 d i a g ( m 1 D , m 2 D , m 3 D , 0 , 0 , ⋯ 0 ) diag(m_1D,m_2D,m_3D,0,0,\cdots0) diag(m1​D,m2​D,m3​D,0,0,⋯0), D D D 的注解如下: D = ( 0 1 − 1 0 ) , m i ≠ 0 , i = 1 , 2 , 3 ⋯ (06) \tag{06} \color{blue} \mathbf D=\left(\begin{array}{cc} 0 & 1 \\ -1 & 0 \end{array}\right), m_{i} \neq 0, i=1, 2, 3\cdots D=(0−1​10​),mi​=0,i=1,2,3⋯(06)根据反对称 性质(3) ,然后等式的两边都进行转置: t ∧ = Γ N Γ T \mathbf t^{\wedge}=\mathbf {\Gamma N\Gamma}^T t∧=ΓNΓT,这里的 Γ \mathbf \Gamma Γ 为正交矩阵, N \mathbf N N的格式如下: N = [ 0 − m 0 m 0 0 0 0 0 ] (07) \tag{07} \color{blue} \mathbf N=\left[\begin{array}{ccc} 0 & -m & 0 \\ m & 0 & 0 \\ 0 & 0 & 0 \end{array}\right] N=⎣ ⎡​0m0​−m00​000​⎦ ⎤​(07)把 t ∧ = Γ N Γ T \mathbf t^{\wedge}=\mathbf \Gamma \mathbf N\mathbf \Gamma^T t∧=ΓNΓT 代入 E = t ∧ R \mathbf E =\mathbf t^{\wedge} \mathbf R E=t∧R 可得: E = t ∧ R = Γ N Γ T R (08) \tag{08} \color{blue} \mathbf E =\mathbf t^{\wedge} \mathbf R=\mathbf {\Gamma N \Gamma}^T\mathbf R E=t∧R=ΓNΓTR(08) E T E = R T Γ N T N Γ T R (09) \tag{09} \color{blue} \mathbf {E}^T{\mathbf E}=\mathbf {R}^T \mathbf \Gamma \mathbf N^T\mathbf N\mathbf \Gamma^T\mathbf R ETE=RTΓNTNΓTR(09)又: N T N = d i a g ( m 2 , m 2 , 0 ) (10) \tag{10} \color{blue} \mathbf N^T\mathbf N=diag(m^2,m^2,0) NTN=diag(m2,m2,0)(10)这个时候可以很明显的看到 d i a g ( m 2 , m 2 , 0 ) diag(m^2,m^2,0) diag(m2,m2,0) 与奇异值矩阵是十分相似的,根据奇异值分解的原理 A = U Σ V T \mathbf A=\mathbf U \mathbf \Sigma \mathbf V^{T} A=UΣVT,如果 A T A = V Σ 2 V T \mathbf A^T\mathbf A=\mathbf V \mathbf \Sigma^2 \mathbf V^{T} ATA=VΣ2VT,特征向量组成 V \mathbf V V矩阵; 如果 A A T = U Σ 2 U T \mathbf A\mathbf A^T=\mathbf U\mathbf \Sigma^2 \mathbf U^{T} AAT=UΣ2UT,特征向量组成 U \mathbf U U 矩阵。那么我们现在对本质 E T E \mathbf E^T\mathbf E ETE 进行特征值分解: E T E = V Σ 2 V T = R T Γ N T N Γ T R = ( R T Γ ) ( N T N ) ( Γ T R ) (11) \tag{11} \color{blue} \mathbf E^T\mathbf E=\mathbf V \mathbf \Sigma^2 \mathbf V^{T}=\mathbf {R}^T \mathbf \Gamma \mathbf N^T\mathbf N\mathbf \Gamma^T\mathbf R=(\mathbf {R}^T \mathbf \Gamma) (\mathbf N^T\mathbf N) (\mathbf \Gamma^T\mathbf R) ETE=VΣ2VT=RTΓNTNΓTR=(RTΓ)(NTN)(ΓTR)(11)可以知道 E T E \mathbf E^T\mathbf E ETE 的特征值为 N T N = d i a g ( m 2 , m 2 , 0 ) \mathbf N^T\mathbf N=diag(m^2,m^2,0) NTN=diag(m2,m2,0), 其对应的特征向量为 V = R T Γ = ( V 1 , V 2 , V 3 ) \mathbf V=\mathbf R^T \mathbf \Gamma=(V_1,V_2,V_3) V=RTΓ=(V1​,V2​,V3​)。这里的 V \mathbf V V 也是。这样我们得到 Σ = d i a g ( ∣ m ∣ , ∣ m ∣ , 0 ) (12) \tag{12} \color{blue} \mathbf \Sigma=diag(|m|,|m|,0) Σ=diag(∣m∣,∣m∣,0)(12) N T N = Σ 2 (13) \tag{13} \color{blue} \mathbf N^T\mathbf N= \mathbf \Sigma^2 NTN=Σ2(13)  对于(07)式子,其可以写成 N = W Σ \mathbf N=\mathbf W \mathbf \Sigma N=WΣ:(这里的 Σ \mathbf \Sigma Σ 为正交矩阵) N = W Σ = [ 0 − 1 0 1 0 0 0 0 1 ] [ m 0 0 0 m 0 0 0 0 ] (14) \tag{14} \color{blue} \mathbf N=\mathbf W \mathbf \Sigma=\left[\begin{array}{ccc} 0 & - 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{ccc} m & 0 & 0 \\ 0 & m & 0 \\ 0 & 0 & 0 \end{array}\right] N=WΣ=⎣ ⎡​010​−100​001​⎦ ⎤​⎣ ⎡​m00​0m0​000​⎦ ⎤​(14) 注意 : \color{red}{注意:} 注意:其上的 Σ \mathbf \Sigma Σ 为正交矩阵,那么他的逆就等于他的转置。后续会利用到这个性质。另外,可以发现,上式还可以写成: N = − W T Σ = [ 0 1 0 − 1 0 0 0 0 − 1 ] [ m 0 0 0 m 0 0 0 0 ] (15) \tag{15} \color{blue} \mathbf N=-\mathbf W^T \mathbf \Sigma=\left[\begin{array}{ccc} 0 & 1 & 0\\ -1 & 0 & 0 \\ 0 & 0 & -1 \end{array}\right]\left[\begin{array}{ccc} m & 0 & 0 \\ 0 & m & 0 \\ 0 & 0 & 0 \end{array}\right] N=−WTΣ=⎣ ⎡​0−10​100​00−1​⎦ ⎤​⎣ ⎡​m00​0m0​000​⎦ ⎤​(15)那么我们就要就要注意了,后续再计算 R t \mathbf R \mathbf t Rt的时候,其结果是否受 W \mathbf W W 影响,如果与其相关,则我们需要分情况进行讨论。另外,需要注意到, Σ = d i a g ( ∣ m ∣ , ∣ m ∣ , 0 ) \mathbf \Sigma=diag(|m|,|m|,0) Σ=diag(∣m∣,∣m∣,0) 因为奇异值是大于0的。但是 m 的正负值是不确定的,所以我们需要分两种情况来进行讨论,即 m>0 与 m0)

情形一: 以(14)式为基准( N = W Σ \mathbf N= \mathbf W \mathbf \Sigma N=WΣ) 根据前面的推导 N = W Σ \mathbf N= \mathbf W \mathbf \Sigma N=WΣ。结合我们前面的 V = R T Γ = ( V 1 , V 2 , V 3 ) \mathbf V=\mathbf R^T \mathbf \Gamma=(V_1,V_2,V_3) V=RTΓ=(V1​,V2​,V3​), 以及 (08) 式可以得出: E V = Γ N Γ T R V = Γ N Γ T R R T Γ = Γ N = Γ W Σ (16) \tag{16} \color{blue} \mathbf E \mathbf V=\mathbf {\Gamma N \Gamma}^T\mathbf R \mathbf V= \mathbf {\Gamma N \Gamma}^T\mathbf R \mathbf R^T \mathbf \Gamma=\mathbf \Gamma \mathbf N=\mathbf \Gamma \mathbf {W \Sigma} EV=ΓNΓTRV=ΓNΓTRRTΓ=ΓN=ΓWΣ(16)另外结合 E = U Σ V T \mathbf E=\mathbf U \mathbf \Sigma \mathbf V^{T} E=UΣVT,两边同时乘 V \mathbf V V, 可以得到 E V = U Σ \mathbf E \mathbf V= \mathbf U \Sigma EV=UΣ。那么结合(16)式可以得到: E V = U Σ = Γ N = Γ W Σ (17) \tag{17} \color{blue} \mathbf E \mathbf V= \mathbf U \Sigma=\mathbf \Gamma \mathbf N=\mathbf \Gamma \mathbf {W \Sigma} EV=UΣ=ΓN=ΓWΣ(17) U = Γ W    ⟹    Γ = U W T \color{blue} \mathbf U=\mathbf \Gamma \mathbf W~~\Longrightarrow ~~\mathbf \Gamma = \mathbf U\mathbf W^T U=ΓW  ⟹  Γ=UWT 前面通过(11)式得到 V = R T Γ \mathbf V=\mathbf R^T \mathbf \Gamma V=RTΓ,结合上式可以得到如下结论( W − 1 = W T \mathbf W^{-1}=\mathbf W^T W−1=WT,正交矩阵性质): R = Γ V T = U W T V T (18) \tag{18} \color{blue} \mathbf R= \mathbf \Gamma \mathbf V^T=\mathbf U\mathbf W^T\mathbf V^T R=ΓVT=UWTVT(18) 我们前面已经假设 t ∧ = Γ N Γ T \mathbf t^{\wedge}=\mathbf {\Gamma N\Gamma}^T t∧=ΓNΓT,以及(17)式中 U = Γ W \mathbf U=\mathbf \Gamma \mathbf W U=ΓW, 那么进一步推导可以的获得: t ∧ = Γ N Γ T = U W T N W U T = U W T W Σ W U T = U Σ W U T (19) \tag{19} \color{blue} \mathbf t^{\wedge}=\mathbf {\Gamma N\Gamma}^T=\mathbf U \mathbf W^T \mathbf N \mathbf WU^T=\mathbf U \mathbf W^T \mathbf W \mathbf \Sigma \mathbf WU^T=\mathbf U \mathbf \Sigma \mathbf WU^T t∧=ΓNΓT=UWTNWUT=UWTWΣWUT=UΣWUT(19)

情形二: 以(15)式为基准( N = − W T Σ \mathbf N= -\mathbf W^T \mathbf \Sigma N=−WTΣ) 根据上面的推导,我们知道情形一与情形二他们主要在于 N \mathbf N N 的区别,进一步其实是在于 W \mathbf W W 与 − W T -\mathbf W^T −WT 的区别,所以只需要把情形一中的 W \mathbf W W 替换成 − W T -\mathbf W^T −WT 即可,故: R = U W T V T = U ( − W T ) T V T = − U W V T (20) \tag{20} \color{blue} \mathbf R= \mathbf U\mathbf W^T\mathbf V^T= \mathbf U (-\mathbf W^T)^T\mathbf V^T= -\mathbf U \mathbf W \mathbf V^T R=UWTVT=U(−WT)TVT=−UWVT(20) t ∧ = U Σ W U T = U Σ ( − W T ) U T = − U Σ W T U T \color{blue} \mathbf t^{\wedge}=\mathbf U \mathbf \Sigma \mathbf W\mathbf U^T=\mathbf U \mathbf \Sigma (-\mathbf W^T)\mathbf U^T=-\mathbf U \mathbf \Sigma \mathbf W^T\mathbf U^T t∧=UΣWUT=UΣ(−WT)UT=−UΣWTUT  

五、情况一(m0)中情形二,也就是式(20)结果中的 t ∧ \mathbf t^{\wedge} t∧ 变号即可。如下: R = − U W V T (25) \tag{25} \color{blue} \mathbf R= -\mathbf U \mathbf W \mathbf V^T R=−UWVT(25) t ∧ = U Σ W T U T \color{blue} \mathbf t^{\wedge}=\mathbf U \mathbf \Sigma \mathbf W^T\mathbf U^T t∧=UΣWTUT

 

六、求解偏移矩阵t

根据上述的推导,我们共获得了4组解,从解可以看出,只需要对 E \mathbf E E 做奇异值分解,即可获得 U , Σ , V \mathbf U, \mathbf \Sigma, \mathbf V U,Σ,V 从而轻松求解出 R \mathbf R R 以及 , t ∧ \mathbf t^{\wedge} t∧。由于本质矩阵 E \mathbf E E 具备尺度等价性质,那么我们先对 E \mathbf E E 进行特征值分解,分解之后获得 U , Σ , V \mathbf U, \mathbf \Sigma, \mathbf V U,Σ,V, 然后令其中的 Σ = d i a g ( 1 , 1 , 0 ) \mathbf \Sigma=diag(1,1,0) Σ=diag(1,1,0) 再重新与 U , V \mathbf U,\mathbf V U,V 组合,根据前面的公式求解 R \mathbf R R 以及 , t ∧ \mathbf t^{\wedge} t∧。

那么现在我们就需要根据 t ∧ \mathbf t^{\wedge} t∧ 求解出 t \mathbf t t,进一步分析,我们以(19)式中的 t ∧ = U Σ W U T \mathbf t^{\wedge}=\mathbf U \mathbf \Sigma \mathbf W\mathbf U^T t∧=UΣWUT 为例进行分析,其中的 U = ( u 1 , u 2 , u 3 ) \mathbf U=(u_1,u_2,u_3) U=(u1​,u2​,u3​)。那么: t ∧ = [ u ⃗ 1 , u ⃗ 2 , u ⃗ 3 ] [ 1 1 0 ] [ 0 − 1 0 1 0 0 0 0 1 ] [ u 1 T u 2 T u 3 T ] = u 2 u 1 T − u 1 u 2 T (26) \tag{26} \color{blue} \mathbf {t}^{\wedge}=\left[\vec{u}_{1}, \vec{u}_{2}, \vec{u}_{3}\right]\left[\begin{array}{ccc} 1 & \\ & 1 & \\ & & 0 \end{array}\right]\left[\begin{array}{ccc} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} {u}_{1}^T \\ {u}_{2}^T \\ {u}_{3}^T \end{array}\right]=u_2u_1^T-u_1u_2^T t∧=[u 1​,u 2​,u 3​]⎣ ⎡​1​1​0​⎦ ⎤​⎣ ⎡​010​−100​001​⎦ ⎤​⎣ ⎡​u1T​u2T​u3T​​⎦ ⎤​=u2​u1T​−u1​u2T​(26)令 u 1 , u 2 , u 3 u_1,u_2,u_3 u1​,u2​,u3​ 构成右手坐标系,即 d e t ( U ) = 1 det(U)=1 det(U)=1,又如果 x,y向量正交,则x y内积为0,即x的转置乘y为0,根据该性质我们可以得出: t ∧ u 1 = u 2         t ∧ u 2 = − u 1         t ∧ u 3 = 0 (27) \tag{27} \color{blue} \mathbf t^{\wedge}u_1=u_2~~~~~~~\mathbf t^{\wedge}u_2=-u_1~~~~~~~\mathbf t^{\wedge}u_3=0 t∧u1​=u2​       t∧u2​=−u1​       t∧u3​=0(27) 然后再根据性质 a,b向量叉乘,获得垂直与a,b的新向量,进行如下推导: { ( t − u 3 ) ∧ u 1 = t ∧ u 1 + u 3 ∧ u 1 = u 2 − u 3 × u 1 = u 2 − u 2 = 0 ( t − u 3 ) ∧ u 2 = t ∧ u 2 + u 3 ∧ u 2 = − u 1 + u 3 × u 2 = − u 1 + u 1 = 0 ( t − u 3 ) ∧ u 3 = t ∧ u 3 + u 3 ∧ u 3 = 0 − u 3 × u 3 = 0 − 0 = 0 (28) \tag{28} \color{blue} \left\{\begin{array}{l} (\mathbf t-u_3)^{\wedge}u_1=\mathbf t^{\wedge}u_1+u_3^{\wedge}u_1=u_2-u_3\times u_1=u_2-u_2=\mathbf0\\ (\mathbf t-u_3)^{\wedge}u_2=\mathbf t^{\wedge}u_2+u_3^{\wedge}u_2=-u_1+u_3\times u_2=-u_1+u_1=\mathbf0\\ (\mathbf t-u_3)^{\wedge}u_3=\mathbf t^{\wedge}u_3+u_3^{\wedge}u_3=\mathbf0-u_3\times u_3=\mathbf0-\mathbf0=\mathbf0\\ \end{array}\right. ⎩ ⎨ ⎧​(t−u3​)∧u1​=t∧u1​+u3∧​u1​=u2​−u3​×u1​=u2​−u2​=0(t−u3​)∧u2​=t∧u2​+u3∧​u2​=−u1​+u3​×u2​=−u1​+u1​=0(t−u3​)∧u3​=t∧u3​+u3∧​u3​=0−u3​×u3​=0−0=0​(28) 又因为 u 1 , u 2 , u 3 u_1,u_2,u_3 u1​,u2​,u3​ 为非零列列向量,故只有 t − u 3 = 0 \mathbf t-u_3=0 t−u3​=0 时,才能满足上述要求,所以 t = u 3 \mathbf t=u_3 t=u3​。由此可见, t \mathbf t t 为 E E E 左奇异值矩阵的最后一列。

 

七、源码注释

其代码的主调函数为 Initializer.cc文件中的 Initializer::ReconstructF() 函数,该函数调用 DecomposeE(E21,R1,R2,t) 函数,该为核心部分,展示如下:

/**
 * @brief 分解Essential矩阵得到R,t
 * 分解E矩阵将得到4组解,这4组解分别为[R1,t],[R1,-t],[R2,t],[R2,-t]
 * 参考:Multiple View Geometry in Computer Vision - Result 9.19 p259
 * @param[in] E                 本质矩阵
 * @param[in & out] R1          旋转矩阵1
 * @param[in & out] R2          旋转矩阵2
 * @param[in & out] t           平移向量,另外一个取相反数
 */
void Initializer::DecomposeE(const cv::Mat &E, cv::Mat &R1, cv::Mat &R2, cv::Mat &t)
{

    // 对本质矩阵进行奇异值分解
	//准备存储对本质矩阵进行奇异值分解的结果
    cv::Mat u,w,vt;
	//对本质矩阵进行奇异值分解
    cv::SVD::compute(E,w,u,vt);

    // 左奇异值矩阵U的最后一列就是t,对其进行归一化
    u.col(2).copyTo(t);
    t=t/cv::norm(t);

    // 构造一个绕Z轴旋转pi/2的旋转矩阵W,按照下式组合得到旋转矩阵 R1 = u*W*vt
    //计算完成后要检查一下旋转矩阵行列式的数值,使其满足行列式为1的约束
    cv::Mat W(3,3,CV_32F,cv::Scalar(0));
    W.at(0,1)=-1;
    W.at(1,0)=1;
    W.at(2,2)=1;

	//计算
    R1 = u*W*vt;
	//旋转矩阵有行列式为+1的约束,所以如果算出来为负值,需要取反
    if(cv::determinant(R1)0.7*maxGood)
        nsimilar++;
    if(nGood2>0.7*maxGood)
        nsimilar++;
    if(nGood3>0.7*maxGood)
        nsimilar++;
    if(nGood4>0.7*maxGood)
        nsimilar++;

    // Step 4.4 四个结果中如果没有明显的最优结果,或者没有足够数量的三角化点,则返回失败
    // 条件1: 如果四组解能够重建的最多3D点个数小于所要求的最少3D点个数(mMinGood),失败
    // 条件2: 如果存在两组及以上的解能三角化出 >0.7*maxGood的点,说明没有明显最优结果,失败
    if(maxGood1)	
    {
        return false;
    }


    //  Step 4.5 选择最佳解记录结果
    // 条件1: 有效重建最多的3D点,即maxGood == nGoodx,也即是位于相机前方的3D点个数最多
    // 条件2: 三角化视差角 parallax 必须大于最小视差角 minParallax,角度越大3D点越稳定

    //看看最好的good点是在哪种解的条件下发生的
    if(maxGood==nGood1)
    {
		//如果该种解下的parallax大于函数参数中给定的最小值
        if(parallax1>minParallax)
        {
            // 存储3D坐标
            vP3D = vP3D1;

			// 获取特征点向量的三角化测量标记
            vbTriangulated = vbTriangulated1;

			// 存储相机姿态
            R1.copyTo(R21);
            t1.copyTo(t21);
			
            // 结束
            return true;
        }
    }else if(maxGood==nGood2)
    {
        if(parallax2>minParallax)
        {
            vP3D = vP3D2;
            vbTriangulated = vbTriangulated2;

            R2.copyTo(R21);
            t1.copyTo(t21);
            return true;
        }
    }else if(maxGood==nGood3)
    {
        if(parallax3>minParallax)
        {
            vP3D = vP3D3;
            vbTriangulated = vbTriangulated3;

            R1.copyTo(R21);
            t2.copyTo(t21);
            return true;
        }
    }else if(maxGood==nGood4)
    {
        if(parallax4>minParallax)
        {
            vP3D = vP3D4;
            vbTriangulated = vbTriangulated4;

            R2.copyTo(R21);
            t2.copyTo(t21);
            return true;
        }
    }

    // 如果有最优解但是不满足对应的parallax>minParallax,那么返回false表示求解失败
    return false;
}

 

八、结语

从上述的分析中,我们知道从 Essential 中恢复 Rt 存在四种解,那么那一组解才是最合适的呢?源码中是对每一个解进行分析,检测点是不是都在两个相机的前方,并且统计重投影误差较小的点的个数,找出4个解中统计得到点数最多的的那个解作为最终的解。其代码具体的实现,我们接下会进行讲解。

    本文内容来自计算机视觉life ORB-SLAM2 课程课件

关注
打赏
1592542134
查看更多评论
立即登录/注册

微信扫码登录

0.0522s