ORBSLAM2系列-矩阵模型H和F的分解

矩阵模型的分解

经过前面计算的单应矩阵H和基础矩阵F,下面就开始使用计算的矩阵进行位姿(R,t)的恢复,这其中的公式较多,所以使用手写的方式,便于表达。

单应矩阵H分解

根据之前计算单应矩阵H时的原理,可知单应矩阵H如下:

H = K ( R − t n T d ) K − 1 ⇒ p 2 ≃ H p 1 H=K(R-\frac{tn^T}{d})K^{-1}\quad \Rightarrow \quad p_2 \simeq H p_1 H=K(RdtnT)K1p2Hp1

表明的是两张图像中同一空间点的特征点之间的关系。那么H分解成为R(旋转矩阵)和t(位移向量)就如下所示(较复杂,需要明白每一步时候的已知条件和未知条件):

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

基础矩阵F分解

根据之前计算基础矩阵F时的原理,可知基础矩阵的计算是由对极约束得到的,也就是如下:

E = t ^ R , F = k − T E K − 1 , x 2 T E x 1 = p 2 T F p 1 = 0 E=\hat{t}R,\quad F=k^{-T}EK^{-1},\quad x^T_2Ex_1 = p^T_2Fp_1 = 0 E=t^R,F=kTEK1,x2TEx1=p2TFp1=0

那么想要从基础矩阵F恢复出R,t,就可以使用本质矩阵E,因为 E = t ^ R E=\hat{t}R E=t^R, 方便计算。

本质矩阵E的性质
尺度等价性

本质矩阵E是由对极约束定义的。由于对极约束是等式为零的约束,所以对E乘以任意非零常数后,对极约束仍然满足。我们把这件事情称为E在不同尺度下是等价的。这是视觉slam十四讲中的内容。那么我们需要理解其在几何上的意义,以下内容参考这篇文章

在这里插入图片描述

如果给本质矩阵E乘以一个常数k,那么就相当于在t乘上一个系数。如上图中,由 O 1 O_1 O1 O 2 O_2 O2 和由 O 1 ′ O_1' O1 O 2 ′ O_2' O2 都是相同的R,但是t不同, t 1 , t 2 t_1,t_2 t1,t2 完全平行,且只相差一个常数系数。

因此,本质矩阵E的尺度等价性,指的就是单目相机由于缺乏深度信息,导致其具有尺度不变性

内在性质

根据计算基础矩阵F的原理中,说明了基础矩阵F和本质矩阵E的秩是2

本质矩阵 E = t ^ R E=\hat{t}R E=t^R 中, R R R 是正交矩阵,乘以一个正交矩阵是不会改变矩阵的秩和奇异值的,因此决定本质矩阵的奇异值实际上只与反对称矩阵 t ^ \hat{t} t^ 有关,而反对称矩阵根据其特有的对称性,两个奇异值一定是相等的,也就是说对本质矩阵E进行SVD分解时:

E = U Σ V T 其中 Σ = d i a g ( a , a , 0 ) E=U\Sigma V^T \quad 其中\Sigma =diag(a,a,0) E=UΣVT其中Σ=diag(a,a,0)

本质矩阵E的分解

根据上面的两条性质,再根据SVD分解,就可求解R,t。

在这里插入图片描述

注意:因为旋转矩阵R是一个行列式为1的正交矩阵,所以在求解得到的R中,需要将行列式为-1的R去相反,即 R = − R R=-R R=R

三角化求解地图点

三角化就是在已知位姿R(旋转矩阵)和t(位移向量)后,根据匹配的特征点计算出地图点在世界坐标系的坐标(设定第一帧是世界坐标系)

点的坐标

地图点坐标转换:就是相机成像原理中说明的,一个地图点的坐标经过旋转矩阵和位移向量计算后,转换到了相机坐标系中:

X c = R X w + t ⇒ ( x c y c z c 1 ) = [ R t 0 1 ] ( x w y w z w 1 ) X_c=RX_w+t\quad \Rightarrow \quad\begin{pmatrix}x_c\\y_c\\z_c\\1\end{pmatrix} = \begin{bmatrix} R & t\\ 0 & 1\\ \end{bmatrix} \begin{pmatrix} x_w\\ y_w\\ z_w\\ 1 \end{pmatrix} Xc=RXw+t xcyczc1 =[R0t1] xwywzw1

光心点O坐标:就如上面的转换公式,由于光心在相机坐标系中的坐标是 X c = ( 0 , 0 , 0 ) X_c=(0,0,0) Xc=(0,0,0) ,那么其在世界坐标系中的坐标就是:

X o w = − R T t X_{ow} = -R^Tt Xow=RTt

地图点求解

根据相机成像的原理:
( u v 1 ) = 1 Z ( f x 0 c x 0 f y c y 0 0 1 ) [ R t ] ( x w y w z w 1 ) = 1 Z K T ( x w y w z w 1 ) \begin{pmatrix}u\\v\\1\end{pmatrix}=\frac{1}{Z}\begin{pmatrix}f_x & 0 & c_x\\0 & f_y & c_y\\0 & 0 & 1\end{pmatrix}\begin{bmatrix}R & t\end{bmatrix}\begin{pmatrix}x_w\\y_w\\z_w\\1\end{pmatrix}= \frac{1}{Z}KT \begin{pmatrix} x_w\\ y_w\\ z_w\\ 1 \end{pmatrix} uv1 =Z1 fx000fy0cxcy1 [Rt] xwywzw1 =Z1KT xwywzw1

将中间的 K T KT KT 使用一个投影矩阵 P = K T P=KT P=KT 计算,可以表示为:
[ u v 1 ] = 1 Z [ p 1 p 2 p 3 p 4 p 5 p 6 p 7 p 8 p 9 p 10 p 11 p 12 ] [ x w y w z w 1 ] ⇒ [ u v 1 ] = 1 Z [ P 0 − P 1 − P 2 − ] [ x w y w z w 1 ] \begin{bmatrix}u \\ v \\ 1\end{bmatrix}=\frac{1}{Z}\begin{bmatrix}p1 & p2 & p3 & p4\\p5 & p6 & p7 & p8\\p9 & p10 & p11 & p12\end{bmatrix}\begin{bmatrix}x_w \\ y_w \\ z_w \\ 1\end{bmatrix}\quad \Rightarrow \quad\begin{bmatrix}u \\ v \\ 1\end{bmatrix}= \frac{1}{Z} \begin{bmatrix} & P_0 & -\\ & P_1 & -\\ & P_2 & - \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} uv1 =Z1 p1p5p9p2p6p10p3p7p11p4p8p12 xwywzw1 uv1 =Z1 P0P1P2 xwywzw1

对等式两边同时乘像素齐次坐标的反对称矩阵,使得等式左边为0,得到了如下等式:

[ v P 2 − P 1 P 0 − u P 2 u P 1 − v P 0 ] [ x w y w z w 1 ] = 0 \begin{bmatrix} vP_2-P_1\\ P_0-uP_2\\ uP_1-vP_0 \end{bmatrix} \begin{bmatrix} x_w \\ y_w\\z_w\\1 \end{bmatrix} =0 vP2P1P0uP2uP1vP0 xwywzw1 =0

而这只是一个特征点形成的等式,如果一个空间点在两帧图像上的特征点(2个特征点)组合在一起,就形成了 A X = 0 AX=0 AX=0 的形式,可以求得空间坐标 X X X

[ v P 2 − P 1 P 0 − u P 2 v ′ P 2 ′ − P 1 ′ P 0 ′ − u ′ P 2 ′ ] [ x w y w z w 1 ] = 0 \begin{bmatrix} vP_2-P_1\\ P_0-uP_2\\ v'P_2'-P_1'\\ P_0'-u'P_2' \end{bmatrix} \begin{bmatrix} x_w \\ y_w\\z_w\\1 \end{bmatrix} =0 vP2P1P0uP2vP2P1P0uP2 xwywzw1 =0

上面公式中,一帧图像上的特征点坐标是 ( u , v ) (u,v) (u,v) ,对应的投影矩阵是 P P P,另一帧图像的匹配特征点坐标是 ( u ′ , v ′ ) (u',v') (u,v) ,对应的投影矩阵是 P ′ P' P 。使用之前的最小二乘法,对 A A A 进行SVD分解,得到的右奇异矩阵的最后一列就是最优解。

在ORBSLAM2中使用三角化计算的地图点,还需要经过很多判定条件才能最终认定这个地图点是合格的

ORBSLAM2应用

由于代码中的注释都很详细,这里就并不列举。可以参考这里的流程,查看代码中的逻辑。(此时已经得到了计算的最好的矩阵模型)

单应矩阵H的分解流程 👇

  • 1.按照上面的分解原理,将H矩阵分解:
    • 1-1.计算 A = K − 1 H K A=K^{-1}HK A=K1HK ,后对 A A A 进行SVD分解,使用分解后的奇异矩阵进行计算
    • 1-2.根据 x 1 , x 3 x_1,x_3 x1,x3 的4中组合,按照上面推导的公式,分别得到 d ′ > 0 , d ′ < 0 d'>0,d'<0 d>0,d<0 的各4个 R ′ , t ′ R',t' R,t
    • 1-3.根据 R = x U R ′ V T , t = U t ′ R=xUR'V^T,t=Ut' R=xURVT,t=Ut ,计算得到一共8组 R , t R,t R,t
  • 2.分别对8组解进行三角化,判断哪个解是三角化最好的:
    • 2-1.分别计算两帧图像的两个投影矩阵 P 1 = K ∗ [ I ∣ 0 ] P_1=K*[I|0] P1=K[I∣0](因为是以第一帧图像的坐标系为世界坐标系,所以这里的 [ R ∣ t ] = [ T ∣ 0 ] [R|t]=[T|0] [Rt]=[T∣0]), P 2 = K ∗ [ R ∣ t ] P_2=K*[R|t] P2=K[Rt]
    • 2-2.对每一个匹配的特征点进行三角化,并判断生成的空间点是否合法:
      • 2-2-1.坐标中是否存在无穷大的数值
      • 2-2-2.根据 a ⋅ b = ∣ a ∣ ∣ b ∣ c o s < a , b > a\cdot b=|a||b|cos<a,b> ab=a∣∣bcos<a,b> 得到该点到两个光心之间的夹角(视差角),判断视差角是否过大,并判断深度值是否为负数
      • 2-2-3.将空间点坐标分别反向投影到两帧图像,判断与特征点坐标的重投影误差是否太大
      • 2-2-4.经过上面的重重检查,最终留下的点就是三角化成功的点,称为good点
    • 2-3.对8组解分别计算上面打的三角化过程,得到8组解中good点最多的解,作为最优解,同时找到次优解,用于后面再次判断
  • 3.根据找到的最优解和次优解,再次判断此最优解是否合格:
    • 3-1.good点数最优解要明显大于次优解,一般取0.75
    • 3-2.视差角大于规定阈值(此视差角是计算每组解的三角化点时统计的一个比较合适的视差角)
    • 3-3.good点数要大于规定的最小被三角化的点数量
    • 3-4.good点数要达到所有特征点数量的90%以上
  • 4.以上的条件全部达到,认为单应矩阵H的分解成功,否则失败

基础矩阵F的分解流程 👇

  • 1.按照上面的分解原理,将F矩阵分解:
    • 1-1.计算 E = K T F K E=K^{T}FK E=KTFK ,得到本质矩阵E,使用上面的公式分解E
    • 1-2.根据分解公式,得到 R 1 = U W V T , R 2 = U W T V T , t 1 = U 2 , t 2 = − U 2 R_1=UWV^T,R_2=UW^TV^T,t_1=U_2,t_2=-U_2 R1=UWVT,R2=UWTVT,t1=U2,t2=U2 共组合成4组解,注意,在计算R时,如果R行列式为负数,需要取反 R = − R R=-R R=R
  • 2.分别对4组解进行三角化,判断哪个解是三角化最好的:
    • 2-1.分别计算两帧图像的两个投影矩阵 $ P_1=K*[I|0] $(因为是以第一帧图像的坐标系为世界坐标系,所以这里的 [ R ∣ t ] = [ T ∣ 0 ] [R|t]=[T|0] [Rt]=[T∣0] ), P 2 = K ∗ [ R ∣ t ] P_2=K*[R|t] P2=K[Rt]
    • 2-2.对每一个匹配的特征点进行三角化,并判断生成的空间点是否合法:
      • 2-2-1.坐标中是否存在无穷大的数值
      • 2-2-2.根据 a ⋅ b = ∣ a ∣ ∣ b ∣ c o s < a , b > a\cdot b=|a||b|cos<a,b> ab=a∣∣bcos<a,b> 得到该点到两个光心之间的夹角(视差角),判断视差角是否过大,并判断深度值是否为负数
      • 2-2-3.将空间点坐标分别反向投影到两帧图像,判断与特征点坐标的重投影误差是否太大
      • 2-2-4.经过上面的重重检查,最终留下的点就是三角化成功的点,称为good点
    • 2-3.对4组解分别计算上面的三角化过程,得到4组解中good点最多的解
  • 3.根据找到的最优解,再次判断此最优解是否合格:
    • 3-1.最优解的good点数量一定要是远远大于其他解的,一般设为是0.7
    • 3-2.最优解的good点数量要大于所要求的最少三角化3D点的数量
    • 3-3.三角化视差角必须大于所设置的最小视差角
  • 4.以上的条件全部达到,认为基础矩阵F的分解成功,否则失败
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值