目录
- [1. 为何要进行极线矫正?](#1. 为何要进行极线矫正?)
- [2. 极线矫正过程。](#2. 极线矫正过程。)
1. 为何要进行极线矫正?
之前的文章立体视觉基础中介绍单目相机无法获得深度信息,我们可以通过多个相机来实现立体视觉。通过两个相机对某场景同时观测时,当我们知道了相机的内(外)参以及两者之间的基线,然后通过某种方式找到两相机对同一世界点的观测的关联关系(类似特征匹配),就可以计算出视差,最终通过下列公式计算出观测到的世界点的深度。
我们假设双目相机已经标定完成,即,已知焦距 f f f和基线 b b b,我们下一步就要寻找匹配关系。上一节介绍的对极几何约束告诉我们,左相机对世界点的观测,在右相机上找到对应的观测位置,这个位置在右极线上,不严谨地说,也就是我们在算法上只需要沿着右图像的极线去遍历像素并与 p l p_l pl进行比较,就能找到与左相机观测点的匹配关系。(当然,这条线上可能会有多个像素与 p l p_l pl相似,所以实际寻找匹配时,还会用到一个技术,叫块匹配 。这在高博的十四讲中有描述,这里不做赘述。)
上图为没有经过极线矫正的两相机成像画面。我们在代码中会遍历左图像中的每个像素,然后去右边图像寻找匹配点,在右边图像寻找匹配点,由对极几何约束知道要沿着极线去找。我们再次把对极几何约束贴在这:
设直线方程 l T x = 0 , 其中 l 为直线方程参数, l = [ a , b , 1 ] T l^Tx=0, 其中l为直线方程参数,l=[a,b,1]^T lTx=0,其中l为直线方程参数,l=[a,b,1]T,由对极几何约束可得 l = F p l l = Fp_l l=Fpl为右极线,右边像素符合这个式子的才会进行比较。我们知道图像在计算机加载时,内存是连续的,我们在找那条在极线上的点的时候需要跳跃好多点,这会造成效率上的降低。
如果我们能把两张图像变成上一节的理想情况呢?也就是两个相机完全平行且 x x x轴重合。
相当于把两个相机的成像变为这样:
那右极线直接就变为了图像的一行,我们只需要沿着图像的行进行搜索即可。
立体校正正式将实际成像变成理想共面的形式,在搜索时就可以只沿一个方向进行匹配。对于程序而言,内存是连续的,计算性能会更好。
2. 极线矫正过程。
假设我们已经知道了两个相机的外参,即 R 和 T ,并满足 P r = R P l + T R和T,并满足P_r=RP_l+T R和T,并满足Pr=RPl+T。
也就是说,我们已经知道了两个相机的相对旋转和平移关系。
①首先我们要想把两个相机平面调整平行就从这个相对旋转 R R R下手。如果两者之间的相对旋转较大,那固定一个只旋转另一个,很可能造成共同观测的世界点投影到变换之后的那个图像外边去,所以简单的办法就是折中一下,两个相机各旋转这个相对旋转的一半。这一步可以将两个相机的光轴平行。
我用两本书来表示一下这一步得到的一般情况。两本书表示图像平面,垂直书的是 Z Z Z轴。(这一步使得两平面的 Z 轴平行, Z Z轴平行,Z Z轴平行,Z轴方向上也可能有偏移。)
但是从另一个角度看可能是这样的。(行是不对齐的。)
所以还需要一步旋转,来进行行对齐,使其成为这样。
这才算是完全对齐了。
数学上的过程:
我们已经知道, P r = R P l + T P_r=RP_l+T Pr=RPl+T。按照上面的思路将两个图像各转相对旋转的一半。
首先,我们可以通过罗德里格斯公式将旋转矩阵 R 转换成 r 形式 R转换成r形式 R转换成r形式,然后左相机正向旋转一半, r l = 0.5 r rl=0.5r rl=0.5r,右相机反向旋转一半, r r = − 0.5 r rr=-0.5r rr=−0.5r。
需要注意的是,这时候两相机之间的平移向量已经发生了改变,不再是 T T T,我们重新记为 t t t。可以推一下新的对应关系: r r P r = r r ∗ ( R P l + T ) ,而 P l = r l − 1 ∗ P l ′ ,又 P r ′ = r r P r = > P r ′ = r r ∗ ( R r l ∗ P l ′ + T ) = r r ∗ r l ∗ r l ∗ r l − 1 ∗ P l ′ + r r ∗ T = > P r ′ = P l ′ + r r ∗ T rrP_r=rr*(RP_l+T),而P_l=rl^{-1}*P_l^{'},又P_r^{'}=rrP_r =>P_r^{'}=rr*(Rrl*P_l^{'}+T)=rr*rl*rl*rl^{-1}*P_l^{'}+rr*T=>P_r^{'}=P_l^{'}+rr*T rrPr=rr∗(RPl+T),而Pl=rl−1∗Pl′,又Pr′=rrPr=>Pr′=rr∗(Rrl∗Pl′+T)=rr∗rl∗rl∗rl−1∗Pl′+rr∗T=>Pr′=Pl′+rr∗T,
也就是说现在的平移向量 t = r r ∗ T t=rr*T t=rr∗T。
接着就是将这两个坐标系的 x 轴与 t 对齐 x轴与t对齐 x轴与t对齐。这就比较简单了,两坐标系的 x x x轴已经平行了,只需要两个坐标系再同时转到与 t t t平行即可。可以通过计算 x x x轴与 t t t向量的轴角关系来构建出那个旋转矩阵 R a R_a Ra。
然后最终的两个相机做的旋转过程为:
R l = R a ∗ r l R_l=Ra*rl Rl=Ra∗rl
R r = R a ∗ r r R_r=Ra*rr Rr=Ra∗rr