对极几何方法——2D图片特征点估计运动
引入
如图所示,在相邻两帧图片
I
1
,
I
2
I_1,I_2
I1,I2中:
- p 1 , p 2 p_1,p_2 p1,p2是两个匹配的特征点,
- o 1 , o 2 o_1,o_2 o1,o2是两帧图片的光心,即小孔成像的小孔,
- 连接 o 1 p 1 o_1p_1 o1p1和 o 2 p 2 o_2p_2 o2p2,相交于现实中的点p。
- 连接
o
1
o
2
o_1o_2
o1o2与两帧图片分别交于
e
1
,
e
2
e_1,e_2
e1,e2。
显然, p , p 1 , o 1 , e 1 , e 2 , o 2 , p 2 p,p_1,o_1,e_1,e_2,o_2,p_2 p,p1,o1,e1,e2,o2,p2在同一平面,这个约束就是对极几何约束
对极几何约束
由针孔相机模型可知,对于第一帧照片:
z
1
[
u
1
v
1
1
]
=
K
⋅
P
z_1 \begin{bmatrix} u_1 \\ v_1 \\ 1 \end{bmatrix} =K \cdot P
z1
u1v11
=K⋅P
两帧之间相机有一个旋转R和平移t运动,则对于第二帧照片:
z
2
p
2
=
K
(
R
P
+
t
)
z_2p_2=K(RP+t)
z2p2=K(RP+t)
p
2
=
[
u
2
,
v
2
,
1
]
T
p_2=[u_2,v_2,1]^{T}
p2=[u2,v2,1]T
则有:
{
z
1
K
−
1
p
1
=
P
z
2
K
−
1
p
2
=
R
P
+
t
\left\{ \begin{aligned} &z_1K^{-1}p_1=P\\ &z_2K^{-1}p_2=RP+t \end{aligned} \right.
{z1K−1p1=Pz2K−1p2=RP+t
令
K
−
1
p
1
=
x
1
,
K
−
1
p
2
=
x
2
K^{-1}p_1=x_1,K^{-1}p_2=x_2
K−1p1=x1,K−1p2=x2则有:
{
z
1
x
1
=
P
z
2
x
2
=
R
P
+
t
\left\{ \begin{aligned} &z_1x_1=P\\ &z_2x_2=RP+t \end{aligned} \right.
{z1x1=Pz2x2=RP+t
解得:
z
2
x
2
=
R
(
z
1
x
1
)
+
t
z_2x_2=R(z_1x_1)+t
z2x2=R(z1x1)+t
两边同时左乘
t
∧
t^{∧}
t∧("∧"表示向量的正交矩阵,相当于叉乘)得:
z
2
t
∧
x
2
=
z
1
t
∧
R
x
1
z_2t^{∧}x_2=z_1t^{∧}Rx_1
z2t∧x2=z1t∧Rx1
两边左乘
x
2
T
x_2^{T}
x2T得:
z
2
x
2
T
t
∧
x
2
=
z
1
x
2
T
t
∧
R
x
1
z_2x_2^{T}t^{∧}x_2=z_1x_2^{T}t^{∧}Rx_1
z2x2Tt∧x2=z1x2Tt∧Rx1
左式中
t
∧
x
2
t^{∧}x_2
t∧x2与t和
x
2
x_2
x2均垂直,故再与
x
2
x_2
x2点乘结果为0。因此:
0
=
x
2
T
t
∧
R
x
1
0=x_2^{T}t^{∧}Rx_1
0=x2Tt∧Rx1
重新代入
p
1
,
p
2
p_1,p_2
p1,p2有:
0
=
(
K
−
1
p
2
)
T
t
∧
R
K
−
1
p
1
0=(K^{-1}p_2)^{T}t^{∧}RK^{-1}p_1
0=(K−1p2)Tt∧RK−1p1
即:
0
=
p
2
T
K
−
T
t
∧
R
K
−
1
p
1
0=p_2^{T}K^{-T}t^{∧}RK^{-1}p_1
0=p2TK−Tt∧RK−1p1
这就是对极几何约束。它的几何意义是
o
1
,
P
,
o
2
o_1,P,o_2
o1,P,o2三者共面。
我们把中间部分记作两个矩阵:基础矩阵(Fundamental Matrix)F和本质矩阵(Essential Matrix)E,于是可以进一步简化对极约束:
{
E
=
t
∧
R
F
=
K
−
T
E
K
−
1
0
=
x
2
T
E
x
1
,
0
=
p
2
T
F
p
1
\left\{ \begin{aligned} &E=t^{∧}R\\ &F=K^{-T}EK^{-1}\\ &0=x_2^{T}Ex_1,0=p_2^{T}Fp_1 \end{aligned} \right.
⎩
⎨
⎧E=t∧RF=K−TEK−10=x2TEx1,0=p2TFp1
于是,相机位姿估计问题变为以下两步:
- 根据配对点的像素位置求出E或者F。
- 根据E或F求出R,t。
由于E和F只相差了相机内参,而内参在SLAM中通常是已知的,所以实践中往往使用形式更简单的E。因此以E为例,介绍上面两个问题如何求解。
利用对极几何约束估计相机运动
E为3×3的矩阵,有9个未知数。为了便于计算只考虑它的尺度等价性(即矩阵同时除以其中一个未知数,可以使得这个未知数变成1,这样的E也是等价的,从而可以减少一个未知数),使用8对点来估计E——这就是经典的八点法(Eight-point-algorithm)。
考虑一对匹配点,它们的归一化坐标为x1=[u1,v1,1]T,x2=[u2,v2,1]T。根据对极约束,有:
把矩阵E展开,写成向量的形式:
那么,对极约束等价于(可以自己矩阵运算一下就明白了):
同理,对于其他点对也有相同的表示。我们把所有点都放到一个方程中,变成线性方程组:
如果这八个点互不相关,即系数满秩,那么E的各元素就可由上述方程解得。
对E进行奇异值分解(SVD)即可求得R和t。
奇异值分解如果不明白可以参看其他资料,这里不多赘述了。
这个方法在opencv中有成熟的代码实现。如果大家感兴趣,我也会抽空把代码和注释附上。