如果我们已知多组匹配特征点对的2D/2D像素坐标,那么此时可以使用对极几何或者单应性求出相机的相对运动,其典型的应用场景就是在单目视觉SLAM的初始化的时候。但对极几何要求相机必须是移动的,单应性要求特征点必须在同一平面上,正是由于这些局限性,单目SLAM的初始化是一件非常困难的事情,一旦我们初始化完成之后,由于此时相机的运动已知,我们就可以三角化出特征点的3D坐标,当新的一帧进来之后,我们可以匹配出多对2D/3D特征点对,此时就可以使用PnP来求解相机运动。
对极约束
如图所示(图片取自视觉SLAM十四讲),
I
1
I_1
I1和
I
2
I_2
I2为两帧图像,
O
1
O_1
O1和
O
2
O_2
O2为相机中心位置。
p
1
p_1
p1为图像
I
1
I_1
I1中的某个特征点,
p
2
p_2
p2为图像
I
2
I_2
I2中与
p
1
p_1
p1匹配的特征点。射线
O
1
p
1
O_1p_1
O1p1上的点都会投影到像素点
p
1
p_1
p1,射线
O
2
p
2
O_2p_2
O2p2同理。在匹配正确的情况下,由于
p
1
p_1
p1和
p
2
p_2
p2对应的是空间中的同一点,所以射线
O
1
p
1
O_1p_1
O1p1和
O
2
p
2
O_2p_2
O2p2必相交于点P。面
O
1
O
2
P
O_1O_2P
O1O2P称为极平面;
O
1
O
2
O_1O_2
O1O2称为基线;基线与两个成像平面
I
1
I_1
I1和
I
2
I_2
I2分别相交于点
e
1
e_1
e1和
e
2
e_2
e2,称为极点;极平面与两个成像平面
I
1
I_1
I1和
I
2
I_2
I2分别相交于线段
l
1
l_1
l1、
l
2
l_2
l2,称为极线。
由相机模型有
s
1
p
1
=
K
P
s_1p_1=KP
s1p1=KP
s
2
p
2
=
K
(
R
P
+
t
)
s_2p_2=K(RP+t)
s2p2=K(RP+t)
K
K
K为相机内参,
p
1
p_1
p1和
p
2
p_2
p2为齐次像素坐标。如果用
x
1
x_1
x1和
x
2
x_2
x2分别表示
P
P
P点在两个相机下的归一化坐标,那么
x
1
=
K
−
1
p
1
,
x
2
=
K
−
1
p
2
x_1=K^{-1}p_1, x_2=K^{-1}p_2
x1=K−1p1,x2=K−1p2,因此
s
2
x
2
=
R
s
1
x
1
+
t
s_2x_2=Rs_1x_1+t
s2x2=Rs1x1+t等式两边对
t
t
t做外积并左乘
x
2
T
x_2^T
x2T得
s
2
x
2
T
t
∧
x
2
=
s
1
x
2
T
t
∧
R
x
1
+
x
2
T
t
∧
t
s_2x_2^Tt^{\land}x_2=s_1x_2^Tt^{\land}Rx_1+x_2^Tt^{\land}t
s2x2Tt∧x2=s1x2Tt∧Rx1+x2Tt∧t因为正交向量内积为零,同方向向量外积为零,因为一三项等于零,可得对极约束公式:
x
2
T
t
∧
R
x
1
=
0
x_2^Tt^{\land}Rx_1=0
x2Tt∧Rx1=0
p
2
T
K
−
T
t
∧
R
K
−
1
p
1
=
0
p_2^TK^{-T}t^\land RK^{-1}p_1=0
p2TK−Tt∧RK−1p1=0
令
E
=
t
∧
R
E=t^{\land}R
E=t∧R
,
,
,
F
=
K
−
T
t
∧
R
K
−
1
F=K^{-T}t^\land RK^{-1}
F=K−Tt∧RK−1,那么
E
E
E和
F
F
F分别称为本质矩阵和基础矩阵。
本质矩阵
本质矩阵具有以下三个特点:任意系数倍的
E
E
E依然满足对极约束,所以
E
E
E在不同尺度下是等价的;
E
E
E的奇异值满足
[
σ
,
σ
,
0
]
[\sigma,\sigma,0]
[σ,σ,0]的形式,称为本质矩阵的内在性质;
E
E
E的自由度为5(旋转3+平移3-尺度等价约束1)。如果我们只考虑尺度等价的约束,那么
E
E
E的自由度为8,可以使用8对点来求解
E
E
E。
(
u
2
1
u
1
1
u
2
1
v
1
1
u
2
1
v
2
1
u
1
1
v
2
1
v
1
1
v
2
1
u
1
1
v
1
1
1
u
2
2
u
1
2
u
2
2
v
1
2
u
2
2
v
2
2
u
1
2
v
2
2
v
1
2
v
2
2
u
1
2
v
1
2
1
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
u
2
8
u
1
8
u
2
8
v
1
8
u
2
8
v
2
8
u
1
8
v
2
8
v
1
8
v
2
8
u
1
8
v
1
8
1
)
(
e
1
e
2
e
3
e
4
e
5
e
6
e
7
e
8
e
9
)
=
0
\begin{array}{c} \begin{array}{c} \end{array}\left(\begin{array}{ccccccccc} u_{2}^{1} u_{1}^{1} & u_{2}^{1} v_{1}^{1} & u_{2}^{1} & v_{2}^{1} u_{1}^{1} & v_{2}^{1} v_{1}^{1} & v_{2}^{1} & u_{1}^{1} & v_{1}^{1} & 1 \\ u_{2}^{2} u_{1}^{2} & u_{2}^{2} v_{1}^{2} & u_{2}^{2} & v_{2}^{2} u_{1}^{2} & v_{2}^{2} v_{1}^{2} & v_{2}^{2} & u_{1}^{2} & v_{1}^{2} & 1 \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \\ u_{2}^{8} u_{1}^{8} & u_{2}^{8} v_{1}^{8} & u_{2}^{8} & v_{2}^{8} u_{1}^{8} & v_{2}^{8} v_{1}^{8} & v_{2}^{8} & u_{1}^{8} & v_{1}^{8} & 1 \end{array}\right)\left(\begin{array}{l} e_{1} \\ e_{2} \\ e_{3} \\ e_{4} \\ e_{5} \\ e_{6} \\ e_{7} \\ e_{8} \\ e_{9} \end{array}\right) = 0 \end{array}
u21u11u22u12⋮u28u18u21v11u22v12⋮u28v18u21u22⋮u28v21u11v22u12⋮v28u18v21v11v22v12⋮v28v18v21v22⋮v28u11u12⋮u18v11v12⋮v18111
e1e2e3e4e5e6e7e8e9
=0
如果8对点的归一化坐标
u
i
u_i
ui、
v
i
v_i
vi构成的矩阵满秩,即可求出
E
E
E。求出
E
E
E之后,可以使用SVD分解,求出
R
R
R和
t
t
t。设
E
=
U
Σ
V
T
E=U\Sigma V^T
E=UΣVT,其中
U
U
U、
V
V
V为正交矩阵,
Σ
=
d
i
a
g
(
σ
1
,
σ
2
,
σ
3
)
\Sigma=diag(\sigma_1,\sigma_2,\sigma_3)
Σ=diag(σ1,σ2,σ3)。由于八点法没有考虑
E
E
E的内在性质,所以
Σ
\Sigma
Σ不满足
E
E
E的奇异值形式。假设
σ
1
>
σ
2
>
σ
2
\sigma_1>\sigma_2>\sigma_2
σ1>σ2>σ2,我们可以构造一个新的
E
=
U
d
i
a
g
(
(
σ
1
+
σ
2
)
/
2
,
(
σ
1
+
σ
2
)
/
2
,
0
)
V
T
E=Udiag((\sigma_1+\sigma_2)/2,(\sigma_1+\sigma_2)/2,0) V^T
E=Udiag((σ1+σ2)/2,(σ1+σ2)/2,0)VT,然后可以分解出两个
R
R
R、
t
t
t分别为:
t
1
∧
=
U
R
Z
(
π
2
)
Σ
U
T
,
R
1
=
U
R
Z
T
(
π
2
)
V
T
t
2
∧
=
U
R
Z
(
−
π
2
)
Σ
U
T
,
R
2
=
U
R
Z
T
(
−
π
2
)
V
T
\begin{array}{ll} \boldsymbol{t}_{1}^{\wedge}=\boldsymbol{U} \boldsymbol{R}_{Z}\left(\frac{\pi}{2}\right) \boldsymbol{\Sigma} \boldsymbol{U}^{\mathrm{T}}, \quad \boldsymbol{R}_{1}=\boldsymbol{U} \boldsymbol{R}_{Z}^{\mathrm{T}}\left(\frac{\pi}{2}\right) \boldsymbol{V}^{\mathrm{T}} \\ \boldsymbol{t}_{2}^{\wedge}=\boldsymbol{U} \boldsymbol{R}_{Z}\left(-\frac{\pi}{2}\right) \boldsymbol{\Sigma} \boldsymbol{U}^{\mathrm{T}}, \quad \boldsymbol{R}_{2}=\boldsymbol{U} \boldsymbol{R}_{Z}^{\mathrm{T}}\left(-\frac{\pi}{2}\right) \boldsymbol{V}^{\mathrm{T}} \end{array}
t1∧=URZ(2π)ΣUT,R1=URZT(2π)VTt2∧=URZ(−2π)ΣUT,R2=URZT(−2π)VT
由于尺度等价性,
−
E
-E
−E也是满足对极约束的一个解。可分解得到两个
R
R
R、
t
t
t,其中
R
R
R与
E
E
E分解的相同,
t
t
t与
E
E
E分解的相反。所以可以得到共4个结果。我们把4个结果分别代入三角化可以求得
P
P
P点在两个相机坐标系下的深度,满足深度为正的条件的解才是最终的解。
单应矩阵
如果所有的特征点都处于现实世界的同一平面之内,那么此时需要使用单应性来估计相机的运动。假设平面方程为
n
T
P
+
d
=
0
n^TP+d=0
nTP+d=0,其中
n
n
n为平面法向量,
d
d
d为平面到相机原点的距离。
s
2
p
2
=
K
(
R
P
+
t
)
=
K
(
R
P
−
n
T
P
t
d
)
=
K
(
R
−
n
T
t
d
)
P
=
s
1
K
(
R
−
n
T
t
d
)
K
−
1
p
1
s_2p_2=K(RP+t)=K(RP-\frac {n^TPt} d)=K(R- \frac {n^Tt} d )P=s_1K(R- \frac {n^Tt} d )K^{-1}p_1
s2p2=K(RP+t)=K(RP−dnTPt)=K(R−dnTt)P=s1K(R−dnTt)K−1p1
令
H
=
K
(
R
−
n
T
t
d
)
K
−
1
H=K(R- \frac {n^Tt} d )K^{-1}
H=K(R−dnTt)K−1,则矩阵
H
H
H称为单应矩阵,其描述了处于同一平面上的空间点在两幅图像间的变换关系,那么
p
2
≃
H
p
1
p_2\simeq Hp_1
p2≃Hp1。考虑尺度等价性,那么单应矩阵的自由度为8,每一对点可以提供两个约束方程,那么使用4对不共线的点即可求出
H
H
H,如果设
h
9
=
1
h_9=1
h9=1那么可得到如下展开式:
(
u
1
1
v
1
1
1
0
0
0
−
u
1
1
u
2
1
−
v
1
1
u
2
1
0
0
0
u
1
1
v
1
1
1
−
u
1
1
v
2
1
−
v
1
1
v
2
1
u
1
2
v
1
2
1
0
0
0
−
u
1
2
u
2
2
−
v
1
2
u
2
2
0
0
0
u
1
2
v
1
2
1
−
u
1
2
v
2
2
−
v
1
2
v
2
2
u
1
3
v
1
3
1
0
0
0
−
u
1
3
u
2
3
−
v
1
3
u
2
3
0
0
0
u
1
3
v
1
3
1
−
u
1
3
v
2
3
−
v
1
3
v
2
3
u
1
4
v
1
4
1
0
0
0
−
u
1
4
u
2
4
−
v
1
4
u
2
4
0
0
0
u
1
4
v
1
4
1
−
u
1
4
v
2
4
−
v
1
4
v
2
4
)
(
h
1
h
2
h
3
h
4
h
5
h
6
h
7
h
8
)
=
(
u
2
1
v
2
1
u
2
2
v
2
2
u
2
3
v
2
3
u
2
4
v
2
4
)
\left(\begin{array}{cccccccc} u_{1}^{1} & v_{1}^{1} & 1 & 0 & 0 & 0 & -u_{1}^{1} u_{2}^{1} & -v_{1}^{1} u_{2}^{1} \\ 0 & 0 & 0 & u_{1}^{1} & v_{1}^{1} & 1 & -u_{1}^{1} v_{2}^{1} & -v_{1}^{1} v_{2}^{1} \\ u_{1}^{2} & v_{1}^{2} & 1 & 0 & 0 & 0 & -u_{1}^{2} u_{2}^{2} & -v_{1}^{2} u_{2}^{2} \\ 0 & 0 & 0 & u_{1}^{2} & v_{1}^{2} & 1 & -u_{1}^{2} v_{2}^{2} & -v_{1}^{2} v_{2}^{2} \\ u_{1}^{3} & v_{1}^{3} & 1 & 0 & 0 & 0 & -u_{1}^{3} u_{2}^{3} & -v_{1}^{3} u_{2}^{3} \\ 0 & 0 & 0 & u_{1}^{3} & v_{1}^{3} & 1 & -u_{1}^{3} v_{2}^{3} & -v_{1}^{3} v_{2}^{3} \\ u_{1}^{4} & v_{1}^{4} & 1 & 0 & 0 & 0 & -u_{1}^{4} u_{2}^{4} & -v_{1}^{4} u_{2}^{4} \\ 0 & 0 & 0 & u_{1}^{4} & v_{1}^{4} & 1 & -u_{1}^{4} v_{2}^{4} & -v_{1}^{4} v_{2}^{4} \end{array}\right)\left(\begin{array}{l} h_{1} \\ h_{2} \\ h_{3} \\ h_{4} \\ h_{5} \\ h_{6} \\ h_{7} \\ h_{8} \end{array}\right)=\left(\begin{array}{c} u_{2}^{1} \\ v_{2}^{1} \\ u_{2}^{2} \\ v_{2}^{2} \\ u_{2}^{3} \\ v_{2}^{3} \\ u_{2}^{4} \\ v_{2}^{4} \end{array}\right)
u110u120u130u140v110v120v130v140101010100u110u120u130u140v110v120v130v1401010101−u11u21−u11v21−u12u22−u12v22−u13u23−u13v23−u14u24−u14v24−v11u21−v11v21−v12u22−v12v22−v13u23−v13v23−v14u24−v14v24
h1h2h3h4h5h6h7h8
=
u21v21u22v22u23v23u24v24
求出单应矩阵后通过分解同样可以得到四组
R
R
R、
t
t
t,通过验证深度为正可以过滤两组解,然后通过假设场景平面与相机平面平行等先验假设来获得最终解。在单目相机初始化的时候,我们通常会同时计算单应矩阵和基础矩阵,来估计相机运动,选择重投影误差小的估计作为最终的运动估计。由于尺度等价的存在,分解出来的
R
R
R和
t
t
t也是尺度等价的,所以我们通常归一化
t
t
t或者令初始化时所有特征点平均深度为1来固定尺度。