本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始
有兴趣的朋友可以加微信 17575010159 相互讨论技术 - 文末公众号也可关注
文末正下方中心提供了本人
联系方式,
点击本人照片即可显示
W
X
→
官方认证
{\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证}
文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证
一、什么是对极约束
首先,我们用通俗的方式来理解什么是 对极约束 \color{red}{对极约束} 对极约束,图像如下所示,
(1)、
O
0
,
O
1
O_0,O_1
O0,O1 分别是两个位置中相机的光心,也就是针孔相机模型中的针孔。
(2)、
I
0
,
I
1
I0,I1
I0,I1 分别是两个相机的成像平面。
(3)、
P
P
P 是空间中的一个三维点,
p
0
p_0
p0,
p
1
p_1
p1 分别是
P
P
P 点在成像平面
I
0
,
I
1
I0,I1
I0,I1 上的成像点
其上大家需要注意一点:
p
0
p_0
p0,
p
1
p_1
p1 的坐标是相对于
O
0
,
O
1
O_0, O_1
O0,O1 而言,也就是其为图像坐标,并非
像素坐标
\color{red}{像素坐标}
像素坐标。
很明显的可以看到,在直线
p
0
p_0
p0
P
P
P 上选取无穷个点,其映射到 平面
I
0
I0
I0 上都为同一点
p
0
p_0
p0, 但是映射到平面
I
1
I1
I1 中,其并非是一个点了,而是一条直线。
结论 : \color{blue}{结论:} 结论: 成像平面 I 0 I0 I0 任意一个像素点,对应三维空间中的无穷个点,该无穷个点都在同一直线线上,且该直线在平面 I 1 I1 I1 中的投影(Epipolar Line) 必定经过 O 0 O 1 O_0O_1 O0O1 与平面 I 1 I1 I1 的交点(极点Epipole)。
简而言之 : \color{blue}{简而言之:} 简而言之: 平面 I 0 I0 I0 中的任意一个像素点,映射到平面 I 1 I1 I1 中,存在无穷个解。其所有的解,都被约束在一条直线上 → 这就是对极约束。
二、对极约束有什么作用
从上面来看,我们虽然大致知道了其原理,但是其有什么用呢? 其作用是很大的,再后续我们会经常用到他,比如本人后面的几篇博客,都与对极约束兮兮相关。 这里本人打个比方: 小学的时候,我们学了乘法口诀,其我们可以理解为约束,比如 1x1=2,2x9=18 … ,有了这些约束以后,我们就可以做什么东西,比如两位以上的乘法,或者两位以上的除法,都是再在法口诀的约束下完成的。简单的来说,我们可以把约束理解为定理,再这个定理的基础上,我们可以做很多的推导。
三、基本概念
通过前面的描述,我们大致明白了对极约束的原理,那么我们下面就来看看其推导过程,再讲解之前,我们再来补充几个概念,来看看如下图像:
(1)、基线(base line): 两个相机光心的连线
O
0
O
1
O_0O_1
O0O1称为基线。
(2)、对极点(epipolar):
e
0
e
1
e_0e_1
e0e1是对极点,是基线与两个成像平面的交点,也就是两个相机在另一个成像平面上的像点。
(3)、对极平面(epipolar plane):过基线的平面都称之为对极平面,其中两个相机的中心
O
0
O_0
O0和
O
1
O_1
O1,三维点
P
P
P,以及三维点在两个相机成像点
p
0
p_0
p0 ,
p
1
p_1
p1 这五点必定在同一对极平面上,当三维点X变化时,对极平面绕着基线旋转,形成对极平面束。
(4)、对极线(epipolar line):是对极平面和成像平面的交线,所有的对极线都相交于极点。
(5)、焦距:
O
0
O_0
O0 与平面
I
0
I_0
I0, 或者
O
1
O_1
O1 与平面
I
1
I_1
I1 的垂直距离。
四、Essential矩阵推导
以下不懂的概念可以百度以下。
向量叉乘:
\color{blue}{向量叉乘: }
向量叉乘:两个向量的叉乘结果是一个同时垂直于这两个向量的向量,其方向通过右手定则决定。其结果为向量(矢量)
向量点乘:
\color{blue}{向量点乘: }
向量点乘:
a
⃗
⋅
b
⃗
=
∣
a
∣
∗
∣
b
∣
∗
c
o
s
(
θ
)
\vec{a} \cdot \vec{b} = |a|*|b| *cos(θ)
a⋅b=∣a∣∗∣b∣∗cos(θ), 因此如果是两个相互垂直的向量点乘,
c
o
s
(
θ
)
=
0
cos(θ)=0
cos(θ)=0,那么向量点乘结果也为零
方向向量:
\color{blue}{方向向量: }
方向向量:只考虑它的方向,而不考虑它的起点或终点的向量。
有了上面的两个概念之后,我们根据 图2 可以得到 结论 1 \color{red}{结论1} 结论1: O 0 P 0 → ⋅ ( O 0 O 1 → × O 1 P 1 → ) = 0 \color{green} \overrightarrow{O_0P_0}\cdot(\overrightarrow{O_0O_1}\times \overrightarrow{O_1P_1})=0 O0P0⋅(O0O1×O1P1)=0因为 O 0 O 1 → × O 1 P 1 → \overrightarrow{O_0O_1}\times \overrightarrow{O_1P_1} O0O1×O1P1 得到的向量垂直于平面 O 0 O 1 P O_0O_1P O0O1P, O 1 P 1 → \overrightarrow{O_1P_1} O1P1 属于平面 O 0 O 1 P O_0O_1P O0O1P,则 O 1 P 1 → \overrightarrow{O_1P_1} O1P1 垂直于 O 0 O 1 → × O 1 P 1 → \overrightarrow{O_0O_1}\times \overrightarrow{O_1P_1} O0O1×O1P1 的结果,又根据点乘的定义,所以上述公式成立。
图2 中的点
p
0
,
p
1
p_0,p_1
p0,p1 都是二维点,一般来说向量叉乘是三维的概念,.我们假设一个归一化的图像平面,该平面上焦距f =1,这里把它变成三维的方向向量来考虑。因此我们可以定义在以
O
0
O_0
O0 为原点的坐标系下
p
0
=
(
x
0
y
0
1
)
\color{green} p_0=\begin{pmatrix} x_0\\ y_0\\ 1\\ \end{pmatrix}
p0=⎝
⎛x0y01⎠
⎞
而在以
O
1
O_1
O1 为原点的坐标系下:
p
1
=
(
x
1
y
1
1
)
\color{green} p_1=\begin{pmatrix} x_1\\ y_1\\ 1\\ \end{pmatrix}
p1=⎝
⎛x1y11⎠
⎞显而易见
p
0
,
p
1
p_0,p_1
p0,p1 不在同一坐标系中。前面说过,
p
0
p_0
p0 在以
O
0
O_0
O0为原点的参考坐标系,
p
1
p_1
p1 在以
O
1
O_1
O1 为原点的参考坐标系,所以我们还是需要转换坐标系。这里我们把所有点的坐标都转换到以
O
0
O_0
O0为原点的坐标系。前面说过这些向量都是方向向量和向量起始位置无关,所以这里坐标系变换只考虑旋转就可以。我们记
R
R
R 为从
O
1
O_1
O1 坐标系到
O
0
O_0
O0 坐标系的旋转矩阵, 之前的等式结论1 :
O
0
P
0
→
⋅
(
O
0
O
1
→
×
O
1
P
1
→
)
=
0
\color{green} \overrightarrow{O_0P_0}\cdot(\overrightarrow{O_0O_1}\times \overrightarrow{O_1P_1})=0
O0P0⋅(O0O1×O1P1)=0最左边的
O
0
P
0
→
\overrightarrow{O_0P_0}
O0P0 可以使用
p
0
p_0
p0 表示,向量
O
0
O
1
→
\overrightarrow{O_0O_1}
O0O1 就是光心
O
1
O_1
O1 相对于
O
0
O_0
O0 的平移,记为
t
t
t, 向量
O
1
P
1
→
\overrightarrow{O_1P_1}
O1P1根据前面的讨论,可以用
R
p
1
Rp_1
Rp1 来表示,那么结论1可以表示为以下
结论
2
\color{red}{结论2}
结论2:
p
0
⋅
(
t
×
R
p
1
)
=
0
\color{green} p_0 \cdot(t\times Rp_1)=0
p0⋅(t×Rp1)=0
这就是对极约束最直观的解释。又三维列向量下面
a
⃗
×
b
⃗
=
a
⃗
∧
b
⃗
\vec{a} \times \vec{b}=\vec{a}^{\wedge} \vec{b}
a×b=a∧b 等式恒成立(参考博客SLAM练习题(七)—— 对极约束)。
其中等式左边 X 表示叉乘,等式右边上三角符号表示反对称矩阵。所以一般把中间的部分拿出来存在
t
×
R
=
t
∧
R
t\times R=t ^{\wedge} R
t×R=t∧R,像下面这样,记为本质矩阵或本征矩阵(Essential Matrix)。
E
=
t
∧
R
\color{green} E=t ^{\wedge} R
E=t∧R然后我们可以得到如下
结论
3
\color{red}{结论3}
结论3
p
0
⋅
E
p
1
=
p
0
T
E
p
1
=
0
\color{green} p_0 \cdot Ep_1=p_0^TEp_1=0
p0⋅Ep1=p0TEp1=0在前面我们提到,平面
I
0
I_0
I0 中的任意一点,在平面
I
1
I_1
I1 中都有对应的一条对应过极点的直线与之对应。另外我们再来看看什么是齐次坐标.
在2D平面上,一条直线 l 可以用方程
a
x
+
b
y
+
c
=
0
ax+by+c=0
ax+by+c=0 来表示,该直线用向量表示的话一般记做
l
=
(
a
,
b
,
c
)
T
\color{green} l=(a,b,c)^T
l=(a,b,c)T,我们知道点
p
=
(
x
,
y
)
p = (x, y)
p=(x,y)在直线
l
l
l 上的充分必要条件是
a
x
+
b
y
+
c
=
0
ax+by+c=0
ax+by+c=0, 如果使用齐次坐标的话,点p的齐次坐标就是
p
′
=
(
x
,
y
,
1
)
p'=(x, y, 1)
p′=(x,y,1) ,那么
a
x
+
b
y
+
c
=
0
ax + by + c = 0
ax+by+c=0 就可以用两个向量的内积(点乘)来表示:
a
x
+
b
y
+
c
∗
1
=
(
a
,
b
,
c
)
T
(
x
,
y
,
1
)
=
l
T
∗
p
′
=
0
\color{green} a x+b y+c * 1=(a, b, c)^{T}(x, y, 1)=l^{T} * p^{\prime}=0
ax+by+c∗1=(a,b,c)T(x,y,1)=lT∗p′=0因此,点
p
p
p 在直线
l
l
l 上的充分必要条件就是 直线
l
l
l 与
p
p
p 的齐次坐标p’的内积:
l
T
∗
p
′
=
0
\color{green} l^{T} * p^{\prime}=0
lT∗p′=0 根据上面的知识,结论3我们就可以把
E
p
1
Ep_1
Ep1 看做是直线的方程,
p
0
p_0
p0 看做是直线上的点,也就是说
E
p
1
Ep_1
Ep1就是以
O
0
O_0
O0 为原点坐标系中的极线了。如下图中红色线条所示,就是极线啦,它的方程是
E
∗
p
1
E*p_1
E∗p1 。
通过前面的推导,我们得到了结论
p
0
T
E
p
1
=
0
p_0^T Ep_1=0
p0TEp1=0 其中
E
∗
p
1
E*p_1
E∗p1 为极线方程。总的来说就是 平面
I
0
I0
I0 中的任意一点
p
0
p_0
p0,一定在平面
I
1
I1
I1 的极线
E
p
1
Ep_1
Ep1上。这里的
E
E
E 我们称为本质或者本征矩阵(Essential)。
五、Fundamental矩阵推导
前面我们假设一个归一化的图像平面,该平面上焦距f =1。
p
0
p_0
p0,
p
1
p_1
p1 的坐标是相对于
O
0
,
O
1
O_0, O_1
O0,O1 而言,也就是其为图像坐标,并非
像素坐标
\color{red}{像素坐标}
像素坐标。
p
0
=
(
x
0
y
0
1
)
p
1
=
(
x
1
y
1
1
)
(1)
\tag {1} \color{green} p_0=\begin{pmatrix} x_0\\ y_0\\ 1\\ \end{pmatrix} ~~~~~~~~~~~~~~p_1=\begin{pmatrix} x_1\\ y_1\\ 1\\ \end{pmatrix}
p0=⎝
⎛x0y01⎠
⎞ p1=⎝
⎛x1y11⎠
⎞(1)
前面推导的公式
p
0
⋅
E
p
1
=
0
p_0 \cdot Ep_1=0
p0⋅Ep1=0,现在我们在这个公式的结果继续进行推导,假如我们知道相机
O
0
O_0
O0,
O
1
O_1
O1,对应的内参分别为
K
0
,
K
1
K_0, K_1
K0,K1。那么我们可以把
p
0
,
p
1
p_0,p_1
p0,p1 转化为像素坐标
v
0
,
v
1
v_0,v1
v0,v1。
v
0
=
K
0
p
0
v
1
=
K
p
1
(2)
\tag {2} \color{green} v_0=K_0p_0 ~~~~~~~~~~~~~~~v_1=Kp_1
v0=K0p0 v1=Kp1(2)
至于为什么可以这样转换,大家可以去看一下针孔相机的成像过程,或者百度下世界坐标如何转行为像素坐标。那么进一步我们可以得到
p
0
=
v
o
K
0
−
1
p
1
=
v
1
K
1
−
1
(3)
\tag {3} \color{green} p_0=v_oK_0^{-1} ~~~~~~~~~~~~~~~p_1=v_1K_1^{-1}
p0=voK0−1 p1=v1K1−1(3)
我们把(3)式带入 p 0 ⋅ E p 1 = p 0 T E p 1 = 0 p_0 \cdot Ep_1=p_0^TEp_1=0 p0⋅Ep1=p0TEp1=0 我们可以得到如下结论: ( v 0 K 0 − 1 ) T E ( v 1 K 1 − 1 ) = K 0 − T v 0 T E v 1 K 1 − 1 = v 0 T ( K 0 − T E K 1 − 1 ) v 1 = 0 \color{green} (v_0K_0^{-1})^TE(v_1K_1^{-1})= K_0^{-T}v_0^T Ev_1K_1^{-1}=v_0^T(K_0^{-T} EK_1^{-1})v_1=0 (v0K0−1)TE(v1K1−1)=K0−Tv0TEv1K1−1=v0T(K0−TEK1−1)v1=0然后我们令 F = ( K 0 − T E K 1 − 1 ) \color{green} F=(K_0^{-T} EK_1^{-1}) F=(K0−TEK1−1)那么我们可以得到: v o T F v 1 = 0 \color{green} v_o^TFv_1=0 voTFv1=0这样,我相信大家就比较理解了,这里的 F F F 我们称为 Fundamental 矩阵,也就是基本矩阵。
六、结语
这样我们就推理出来了如下两个结论,Essential 矩阵:
E
=
t
∧
R
p
0
T
E
p
1
=
0
\color{green} E=t ^{\wedge} R~~~~~~~~~~~~~~~~~~~~\color{green} p_0^T Ep_1=0
E=t∧R p0TEp1=0与 Fundamental 矩阵:
F
=
(
K
0
−
T
E
K
1
−
1
)
v
o
T
F
v
1
=
0
\color{green} F=(K_0^{-T} EK_1^{-1}) ~~~~~~~~~~ \color{green} v_o^TFv_1=0
F=(K0−TEK1−1) voTFv1=0其上的
p
0
,
p
1
p_0,p_1
p0,p1 是图像坐标,
v
0
,
v
1
v_0,v_1
v0,v1 是像素坐标。这样我们就使用 对极约束 推理出来了 Essential矩阵以及Fundamental矩阵。并且可以得到,只要已知两个相机内参,我们把他们对应的 Essential 矩转换为 Fundamental矩阵。