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