上一篇博客《解读《视觉SLAM十四讲》,带你一步一步入门视觉SLAM—— 第 7 讲视觉里程计1 ( 上 )》,我解读了特征点,讲述了关键点的提取和描述子的计算,以及特征点的匹配。经过匹配之后就会获得很多匹配点对。那么怎么从匹配的点对中获得相机的运动关系呢?
作者首先通过三点共面关系,推导出了对极约束。实际上这个推导过程还有一种更加简洁的方法,首先将书中对极几何约束示意图简化成如下形式:
由于 O 1 p 1 , O 1 O 2 , O 2 p 2 O_1p_1,O_1O_2,O_2p_2 O1p1,O1O2,O2p2三者共面,所以可以得出下式:
O 1 p 1 ⃗ ⋅ ( O 1 O 2 ⃗ × O 2 p 2 ⃗ ) = 0 (0) \vec {O_1p_1} \cdot(\vec{O_1O_2} \times \vec{O_2p_2}) = 0 \tag 0 O1p1⋅(O1O2×O2p2)=0(0)上式采用书中的变量替换,则
p 1 ⋅ ( t ⋀ R p 2 ) = 0 (1) \boldsymbol p_1 \cdot(\boldsymbol t^{\bigwedge} \boldsymbol R \boldsymbol p_2) = 0 \tag1 p1⋅(t⋀Rp2)=0(1)注释:这里的 R p 2 \boldsymbol R \boldsymbol p_2 Rp2就是在 O 1 O_1 O1坐标系下表示 O 2 p 2 ⃗ \vec{O_2p_2} O2p2
是不是更好理解了,一个等式就得到了对极约束,通过一对匹配成功的特征点,我们可以得到一个对极约束,通过对极约束我们获得了非常重要的一个矩阵:本质矩阵 E = t ⋀ R \boldsymbol E =\boldsymbol t^{\bigwedge} \boldsymbol R E=t⋀R。
本质矩阵有三个值得我们关注的地方:
五个自由度只需要五对匹配点就可以解出来本质矩阵,但是由于一些数学问题和便利性,常常采用8对点(这里的数学问题,我也不是很理解,大家可以参考相关文献[1][2])
根据对极约束,可以写出一对点的对极约束等式
[ u 1 , v 2 , 1 ] [ e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ] [ u 2 v 2 1 ] = 0 (2) [u_1, v_2,1] \left[ \begin{matrix}e_1 & e_2 & e_3 \\ e_4 & e_5 & e_6 \\ e_7 & e_8 & e_9 \end{matrix} \right] \left[ \begin{matrix}u_2 \\ v_2 \\1\end{matrix} \right] = 0 \tag2 [u1,v2,1]⎣⎡e1e4e7e2e5e8e3e6e9⎦⎤⎣⎡u2v21⎦⎤=0(2)
根据八点法,只要有八组这样的方程,就可以解出对极约束中的本质矩阵 E E E。
八个方程,就算是满秩,解出9个变量,好像也是不太可能的,但是别忘记了,本质矩阵实际只有5个自由度。
根据八点法求得本质矩阵之后,通过SVD奇异值分解,可以得到 t , R \boldsymbol t,\boldsymbol R t,R,
《十四讲》中只是给了SVD分解的结论,至于中间过程,可以参考这篇博客《SVD分解(奇异值分解)求旋转矩阵》,求解出来的 t , R \boldsymbol t,\boldsymbol R t,R可以组成四种可能,此时需要通过正深度剔除另外三种情况。
本质矩阵考虑的是空间中的任意组成的点集,但是实际在SLAM中有一些是特殊场景,比方说走廊或者墙面,所有的点都落在一个平面上了,此时如果还继续按照本质矩阵来求相机运动,就会导致退化问题,基础矩阵的自由度就会下降,此时多余出来的矩阵就由噪声来决定。所以为了解决这种问题,常常是同时计算本质矩阵和单应矩阵,然后选择重投影误差比较小的那个。
对于单应矩阵,书中首先根据平面表示公式:
n T P + d = 0 (3) \boldsymbol n^{T}P+d=0 \tag 3 nTP+d=0(3)实际上这个公式就是将我们高中的表示方法(4)式,采用向量的方法表示了:
A x + B y + C z + D = 0 (4) Ax+By+Cz+D=0 \tag 4 Ax+By+Cz+D=0(4)经过简单的推导(详细过程参考书本)就得到了,平面上的点在两个相机成像平面上的关系:
p 2 = K ( R − t n T d ) K − 1 p 1 (5) \boldsymbol p_2 = \boldsymbol K(\boldsymbol R- \frac{\boldsymbol t \boldsymbol n^{T}}{d})\boldsymbol K^{-1} \boldsymbol p_1 \tag5 p2=K(R−dtnT)K−1p1(5)将中间部分记为 H H H, H H H就叫做 单应矩阵,于是
p 2 = H p 1 (6) \boldsymbol p_2 = \boldsymbol H \boldsymbol p_1 \tag 6 p2=Hp1(6)对于单应矩阵的求解和本质矩阵是一样的套路,单应矩阵只需要四对匹配点就能求解得到,然后可以使用分解的方法求出 R \boldsymbol R R和 t \boldsymbol t t。分解之后同样也会面临四组解,也要通过一些约束进行排除。
在对极约束中,我们得到了本质矩阵 E = t ⋀ R \boldsymbol E =\boldsymbol t^{\bigwedge} \boldsymbol R E=t⋀R,试想一下如果我们给本质矩阵的 t \boldsymbol t t乘以一个常数 k k k, E = k t ⋀ R \boldsymbol E =k\boldsymbol t^{\bigwedge} \boldsymbol R E=kt⋀R,对极约束的关系依然成立。反过来讲,也就是当我们分解求 t , R \boldsymbol t,\boldsymbol R t,R时,就无法确定 t \boldsymbol t t的真实大小。
R. I. Hartley, “In defense of the eight-point algorithm,” in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 19, no. 6, pp. 580-593, June 1997. ↩︎
H.C. Longuet-Higgins,A computer algorithm for reconstructing a scene from two projections,Editor(s): Martin A. Fischler, Oscar Firschein,Readings in Computer Vision,Morgan Kaufmann,1987, ↩︎