12. 双目视觉之极线矫正

目录

  • [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

相关推荐
weixin_466485113 天前
halcon标定助手的使用
数码相机
诸葛务农4 天前
ToF(飞行时间)相机在人形机器人非接触式传感领域内的应用
数码相机·机器人
塞北山巅5 天前
相机自动曝光(AE)核心算法——从参数调节到亮度标定
数码相机·算法
美摄科技5 天前
相机sdk是什么意思?
数码相机
phyit5 天前
全景相机领域,影石何以杀出重围?
数码相机
鄃鳕6 天前
装饰器【Python】
开发语言·python·数码相机
聪明不喝牛奶6 天前
【已解决】海康威视相机如何升级固件
数码相机
PAQQ6 天前
1站--视觉搬运工业机器人工作站 -- 相机部分
数码相机·机器人
诸葛务农6 天前
人形机器人基于视觉的非接触式触觉传感技术
数码相机·机器人
moonsims7 天前
被动式热成像摄像机也称前视红外 (FLIR) 摄像机-Sierra-Olympia Technologies 中波红外摄像机
数码相机