图像校正——使得在对极线上寻找对应点更加容易
2019/10/27 FesianXu
前言
我们在[1]中曾经谈到了如何在对极线上去寻找对应点,这样会使得算法更鲁棒,而且速度更快。在本文中,我们将会继续介绍一种称之为图像矫正的方法,通过这种方法,我们可以在对极线的基础上,使得寻找对应点变得更为容易。
如有谬误,请联系指正。转载请注明出处。
∇ 联系方式:
e-mail: FesianXu@gmail.com
QQ: 973926198
github: https://github.com/FesianXu
为什么我们需要图像矫正
我们在[1]曾经聊到了在对极线上寻找对应点的方法,如Fig 1.1所示。这种方法将对应点可能的范围约束到了一条直线上,而不是一个二维平面,这样大大减小了搜索空间。同时,我们也在[1]中聊过,每个对极面都是会经过基线的,每个对极线也是会经过对应的对极点的,正是因为如此,其实对于单张图的对极线组来说,如果延伸每条对极线,我们会发现每条对极线都会汇聚于对极点上,如Fig 1.2所示。也正是因为如此,我们得到的对极线们都不是平行的,如Fig 1.3所示。
Fig 1.1 在对极线l和l'上寻找对应点。
Fig 1.2 对极线的延长线将会汇聚在对极点上。
Fig 1.3 两张图对应的对极线对(epipolar lines pair),我们发现这两组对极线都是不平行的。
我们在后续的处理中,将会发现不平行的对极线会使得寻找对极点的运算变得复杂,我们期望的是, 如果每对对极线都是平行的,那将会大大减少后续算法的复杂度,特别是在求视差时,平行的对极线将会提供极大的便利。 理想的对极线对的效果如Fig 1.4所示。我们后续就讨论如何才能从不平行的对极线转换成平行的,也就是 图像矫正(image rectification) 的具体操作。
Fig 1.4 上图表示的是未经过图像矫正的对极线配对,我们发现其是不平行的。下图是经过图像矫正的对极线配对,我们发现其平行了,这个效果正是我们所期望的。
图像矫正
需要明确的是,进行图像矫正之前需要知道相机的内参数和外参数[4]。
我们首先要知道,为什么我们的对极线对会不平行呢?如图Fig 2.1所示,其不平行的原因是因为我们的成像平面没有共面(coplanar),那么自然地,我们的直接做法就是矫正我们的成像平面,使得其共面,效果如图Fig 2.2的黄色面所示。其总体效果,如Fig 2.3所示,我们可以发现,通过这种手段,我们的对应点的搜索空间进一步缩小到了水平线上,只用一个水平线上的参数x表示其距离就可以描述对应点了,这样其实是大大减少了运算量的。
Fig 2.1 使得对极线不平行的根本原因是我们的不同摄像机的成像平面之间并不是共面的。
Fig 2.2 通过矫正成像平面到共面,我们可以使得对极线对平行。
Fig 2.3 通过矫正到(2)的情况,我们的搜索空间进一步减少了。
我们后续具体分析这个矫正过程,我们要想怎么样才能将成像平面矫正到共面呢?我们观察图Fig 2.4,我们延伸射线PO和PO′分别得到PPˉ,PPˉ′,使得OO′//PˉPˉ′,同时,我们确保O,O′到平面∏ˉ,∏ˉ′的距离相同,那么我们的平面∏ˉ,∏ˉ′就是期望得到的矫正成像平面了。其实这个也不难理解,因为每个对极面都是经过基线的,而基线平行于∏ˉ,∏ˉ′,那么ep,e′p′在基线上的投影必然是平行于PˉPˉ′的,同时,我们保证了两个焦点到两个平面的距离相同,确保了其是∏ˉ,∏ˉ′的投影。
Fig 2.4 平行对极线(粉色)平行于基线(黑色OO'),而且焦点分别到其对应的成像平面的距离相同。
我们为什么要加上这个焦点到两个矫正后的成像平面的距离相同这个约束呢?让我们看一个例子。
在如图Fig 2.5的系统中,我们假设两个成像平面是共面的,其焦点之间的距离OO′=d,两个摄像头之间不存在有旋转关系,那么我们可以知道其相机参数为:
RTE=I=[−d,0,0]T=[T×]R=⎣⎡00000−d0d0⎦⎤(2.1)
Fig 2.5 在共面的成像平面中的建模。
从[1]中提到的对极约束的代数表达形式,我们有:
p′Ep=0⇒[x′,y′,f]⎣⎡00000−d0d0⎦⎤⎣⎡xyf⎦⎤=0⇒y=y′(2.2)
从中我们发现,我们必须引入这个约束去约束成像平面的位置。
我们知道极点e是本征矩阵的零空间向量,也就是说我们有Ee=0,我们可以解出:
⎣⎡00000−d0d0⎦⎤⎣⎡100⎦⎤=0
我们如果从齐次坐标的角度去看待e=⎣⎡100⎦⎤ 那么我们知道其实这个时候极点是在无限远处了。(关于齐次坐标系,见[2,3])
于是,其实矫正成像平面的后果就是,我们的极点被挪到了无限远处,这个和我们图Fig 1.2的推论相同。
Fig 2.6 经过矫正之后,图像的极点被移到了无限远处。
我们到现在算是对图像矫正有了直观上的印象,接下来我们尝试用算法去描述这个过程。图像矫正算法主要分四步。
-
用旋转矩阵Rrec旋转左相机,使得左成像平面的极点到无限远处。
-
用和第一步相同的旋转矩阵旋转右相机。
-
用外参数中的R旋转继续旋转右相机。
-
对坐标系调整尺度。
我们首先需要确定旋转矩阵Rrec。为了确定这个矩阵,我们需要构造一组彼此正交的单位向量e1,e2,e3。我们一般选择以其中一个焦点为原点构建,选择OO′=T=(Tx,Ty,Tz)T作为一个基底,然后进行单位化,我们有:
e1=∣∣T∣∣T
构造e2则只有和e1正交并且是单位向量这约束,因此比较任意,如:
e2=Tx2+Ty21(−Ty,Tx,0)T
容易定义:
e3=e1×e2
Fig 2.7 构建出正交的单位向量,如绿色线段所示。
因此旋转矩阵为:
Rrec=⎝⎛e1Te2Te3T⎠⎞
然后设置左右摄像机的旋转矩阵
RlRr=Rrec=RRrec
其中的R是外参数的旋转矩阵。
随后进行旋转和调整坐标系尺度,如:对于左相机的点pl=[x,y,f]T,计算出Rlpl=[x′,y′,z′],随后计算器调整后的坐标系,最终有:
pl′=z′f[x′,y′,z′]
对于右相机,其操作相同。
最后的矫正结果展示如:
Reference
[1]. https://blog.csdn.net/LoseInVain/article/details/102665911
[2]. Hartley R, Zisserman A. Multiple View Geometry in Computer Vision[J]. Kybernetes, 2008, 30(9/10):1865 - 1872.
[3]. https://blog.csdn.net/LoseInVain/article/details/102756630
[4]. https://blog.csdn.net/LoseInVain/article/details/102632940