两视图几何
对同一场景在两个不同的视角下观看,可以得到两张不同的图像,如图所示。
与此相关的几何问题即两视图几何问题
同一点在不同坐标系的表达
对于场景中的一个点 P w P_w Pw,假设它在两个视角的相机所成的图像对应像素点为 x 1 = ( x 1 1 , x 1 2 , 1 ) , x 2 = ( x 2 1 , x 2 2 , 1 ) x_1=(x^1_1,x^2_1,1),x_2=(x^1_2,x^2_2,1) x1=(x11,x12,1),x2=(x21,x22,1),则它们在归一化平面上对应的点为 X 1 = K 1 − 1 x 1 , X 2 = K 1 − 1 x 2 X_1=K_1^{-1}x_1,X_2=K_1^{-1}x_2 X1=K1−1x1,X2=K1−1x2
假设它们在两个视角下的深度为
z
1
,
z
2
z_1,z_2
z1,z2,可以得到它们在局部坐标系的坐标
P
c
1
=
z
1
X
1
,
P
c
2
=
z
2
X
2
P_{c1}=z_1X_1,~P_{c2}=z_2X_2
Pc1=z1X1, Pc2=z2X2
假设两个视角的相对位姿为
T
12
=
(
R
12
,
t
12
)
T_{12}=(R_{12},t_{12})
T12=(R12,t12),则两个局部坐标系下的坐标满足
P
c
1
=
R
12
P
c
2
+
t
12
P_{c1}=R_{12}P_{c2}+t_{12}
Pc1=R12Pc2+t12
→
z
1
X
1
=
R
12
z
2
X
2
+
t
12
\to z_1X_1=R_{12}z_2X_2+t_{12}
→z1X1=R12z2X2+t12
极线约束
根据投影模型,场景中的同一点在不同的视角下所在的图像的像素位置存在一定的约束,这一约束称为极线约束。
实际求解问题时我们往往很难知道点在当前帧的深度,因此为了得到两帧像素点的约束,我们需要先消去 z 1 , z 2 z_1,z_2 z1,z2
在等式两边同时点乘
t
12
×
X
1
t_{12}\times X_1
t12×X1
有
z
1
X
1
⋅
(
t
12
×
X
1
)
=
(
R
12
z
2
X
2
+
t
12
)
⋅
(
t
12
×
X
1
)
z_1X_1\cdot (t_{12}\times X_1)=(R_{12}z_2X_2+t_{12})\cdot(t_{12}\times X_1)
z1X1⋅(t12×X1)=(R12z2X2+t12)⋅(t12×X1)
考虑到
t
12
×
X
1
t_{12}\times X_1
t12×X1与
t
12
t_{12}
t12和
x
1
x_1
x1都正交,只剩下
0 = ( R 12 z 2 X 2 ) ⋅ ( t 12 × X 1 ) 0=(R_{12}z_2X_2)\cdot(t_{12}\times X_1) 0=(R12z2X2)⋅(t12×X1)
我们知道向量叉乘可以转换为矩阵乘法,即
a
×
b
=
a
×
b
,
(
a
×
)
=
(
0
−
a
3
a
2
a
3
0
−
a
1
−
a
2
a
1
0
)
,
a
×
=
−
(
a
×
)
T
a\times b=a^\times b, \mathbf (a^\times)= \begin{pmatrix} 0 & -a_3 & a_2\\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{pmatrix} , a^\times = -(a^\times)^T
a×b=a×b,(a×)=⎝⎛0a3−a2−a30a1a2−a10⎠⎞,a×=−(a×)T
由此我们有
0
=
(
R
12
z
2
X
2
)
⋅
(
t
12
×
X
1
)
=
(
t
12
×
X
1
)
T
(
R
12
z
2
X
2
)
0=(R_{12}z_2X_2)\cdot(t_{12}^\times X_1)=(t_{12}^\times X_1)^T(R_{12}z_2X_2)
0=(R12z2X2)⋅(t12×X1)=(t12×X1)T(R12z2X2)
→
X
1
T
t
12
×
R
12
X
2
=
0
\to X_1^Tt_{12}^\times R_{12} X_2=0
→X1Tt12×R12X2=0
→
x
1
T
K
1
−
T
t
12
×
R
12
K
2
−
1
x
2
=
0
\to x_1^TK_1^{-T}t_{12}^\times R_{12}K_2^{-1} x_2=0
→x1TK1−Tt12×R12K2−1x2=0
分别令 E = t 12 × R 12 E=t^\times_{12}R_{12} E=t12×R12, F = K 1 − T t 12 × R 12 K 2 − 1 F=K_1^{-T}t_{12}^\times R_{12}K_2^{-1} F=K1−Tt12×R12K2−1
可以得到
X
1
T
E
X
2
=
0
X_1^TE X_2=0
X1TEX2=0
x
1
T
F
x
2
=
0
x_1^TF x_2=0
x1TFx2=0
前者表达了两帧对应归一化平面点所满足的约束,E称为Essential Matrix(本质矩阵)。
后者表达了两帧对应像素点所满足的约束,F称为Fundamental Matrix(基础矩阵)。
可以看到,两者之间只相差一个内参。
极线与本质矩阵
考虑
X
1
T
E
X
2
=
0
X_1^TE X_2=0
X1TEX2=0
其中E为3X3的矩阵,于是我们可以令向量
l
=
E
X
2
l=EX_2
l=EX2
于是有
X
1
⋅
l
=
0
X_1\cdot l=0
X1⋅l=0
这刚好满足点在直线上的条件,将l视为直线,则
P
w
P_w
Pw在
T
1
w
T_{1w}
T1w下的归一化平面坐标必过直线l。对于基础矩阵有同样的性质。
自由度
由表达式
E
=
t
12
×
R
12
E=t^\times_{12}R_{12}
E=t12×R12
可知,E有最多6个自由度(t和R各三个)
考虑到
X
1
T
E
X
2
=
0
=
X
1
T
s
E
X
2
X_1^TE X_2=0=X_1^TsE X_2
X1TEX2=0=X1TsEX2
即乘以不同系数的E总是相同,因此E其实只有5个自由度。
通过对应点构建方程可以求出E,常用的方法有五点法和八点法,目前的视觉工具箱中均有包含,在此不多赘述。
退化与单应矩阵
当
∣
∣
t
12
∣
∣
=
0
||t_{12}||=0
∣∣t12∣∣=0时,
F
=
0
F=\mathbf 0
F=0
上面的极线约束变成
0
=
0
0=0
0=0
发生了退化。此时极线约束没有意义。
前面提到
z
1
X
1
=
R
12
z
2
X
2
+
t
12
z_1X_1=R_{12}z_2X_2+t_{12}
z1X1=R12z2X2+t12
此时
z
1
X
1
=
R
12
z
2
X
2
z_1X_1=R_{12}z_2X_2
z1X1=R12z2X2
→
z
1
K
1
−
1
x
1
=
z
2
R
12
K
2
−
1
x
2
\to z_1K_1^{-1}x_1=z_2R_{12}K_2^{-1}x_2
→z1K1−1x1=z2R12K2−1x2
→
x
1
=
s
K
1
R
12
K
2
−
1
x
2
\to x_1=sK_1R_{12}K_2^{-1}x_2
→x1=sK1R12K2−1x2
考虑到上面是齐次坐标,s可以直接去掉。此时
x
1
x_1
x1,
x
2
x_2
x2满足前面提到的单应矩阵的约束
令
H
=
K
1
R
12
K
2
−
1
H=K_1R_{12}K_2^{-1}
H=K1R12K2−1
有
x
1
=
H
x
2
x_1=Hx_2
x1=Hx2
即纯旋转时两帧之间的关系可以用单应矩阵表示