本质矩阵 基础矩阵 单应矩阵 (1)

本质矩阵 基础矩阵 单应矩阵

基本概念:

本质矩阵E(Essential Matrix):反映【空间一点P的像点】在【不同视角摄像机】下【摄像机坐标系】中的表示之间的关系。

基础矩阵F(Fundamental Matrix):反映【空间一点P的像素点】在【不同视角摄像机】下【图像坐标系】中的表示之间的关系。

ORB-SLAM点云地图中相机的位姿初始化,无论算法工作在平面场景,还是非平面场景下,都能够完成初始化的工作。其中主要是使用了适用于平面场景的单应性矩阵H和适用于非平面场景的基础矩阵F,程序中通过一个评分规则来选择适合的模型,恢复相机的旋转矩阵R平移矩阵t

对极几何(Epipolar Geometry)描述的是两幅视图之间的内在射影关系,与外部场景无关,只依赖于摄像机内参数和这两幅视图之间的相对位姿

1.当相机为单目时,我们只知道2D的像素坐标,因而问题是根据两组2D点估计运动。该问题用对极几何来解决。
2.当相机为双目、RGB-D时,或者我们通过某种方法得到了距离信息,那问题就是根据两组3D点估计运动。该问题通常用ICP来解决。
3.如果我们有3D点和它们在相机的投影位置,也能估计相机的运动。该问题通过PnP求解。

2D-2D: 对极几何

现在,假设我们从两张图像中,得到了一对配对好的特征点。

如果我们有若干对这样的匹配点,就可以通过这些二维图像点对应关系恢复出在两帧之间摄像机的运动。

这里“若干对”具体是多少对呢?我们会在下文介绍。先来看看两个图像当中的匹配点有什么几何关系吧。
本质矩阵 基础矩阵 单应矩阵 (1)_第1张图片
我们希望求取两帧图像 I 1 , I 2 I1,I2 I1,I2 之间的运动,设第一帧到第二帧的运动为 R , t R,t R,t。两个相机中心分别为 O 1 , O 2 O1, O2 O1,O2。现在,考虑 I 1 I1 I1 中有一个特征点 p 1 p1 p1,它在 I 2 I2 I2 中对应 特征点 p 2 p2 p2。我们知道这俩是通过特征匹配得到的。如果匹配正确,说明它们确实是同一个空间点在两个成像平面上的投影

这里我们需要一些术语来描述它们之间的几何关系。

极平面: 首先,连线 O 1 p 1 → \overrightarrow{O_{1} p_{1}} O1p1 和连线 O 2 p 2 → \overrightarrow{O_{2} p_{2}} O2p2 在三维空间中会相交于点 P P P。这时候点 O 1 , O 2 , P O1,O2,P O1,O2,P 三个点可以确定一个平面,称为极平面(Epipolar plane) 。

O 1 O 2 O1O2 O1O2 连线与像平面 I 1 , I 2 I1, I2 I1,I2 的交点分别为 e 1 , e 2 e1, e2 e1,e2 e 1 , e 2 e1, e2 e1,e2称为极点(Epipoles), O 1 O 2 O1O2 O1O2 被称为基线(Baseline) 。

极平面与两个像平面 I 1 , I 2 I1,I2 I1,I2 之间的相交线 l 1 , l 2 l1, l2 l1,l2极线(Epipolar line) 。

直观上讲,从第一帧的角度上看,射线 O 1 p 1 → \overrightarrow{O_{1} p_{1}} O1p1 是某个像素可能出现的空间位置——因为该射线上的所有点都会投影到同一个像素点。同时,如果不知道 P 的位置,那么当我们在第二个图像上看时,连线 e 2 p 2 → \overrightarrow{e_{2} p_{2}} e2p2 (也就是第二个图像中的极线)就是 P P P 可能出现的投影的位置,也就是射线 O 1 p 1 → \overrightarrow{O_{1} p_{1}} O1p1 在第二个相机中的投影。

现在,由于我们通过特征点匹配,确定了 p 2 p2 p2 的像素位置,所以能够推断 P P P 的空间位置,以及相机的运动。要提醒读者的是, 这都是多亏了正确的特征匹配。如果没有特征匹配,我们就没法确定 p 2 p2 p2 到底在极线的哪个位置了。那时,就必须在极线上搜索以获得正确的匹配。

本质矩阵 基础矩阵 单应矩阵 (1)_第2张图片

现在,我们从代数角度来看一下这里出现的几何关系。在第一帧的坐标系下,设 P P P 的空间位置为:

P = [ X , Y , Z ] T \boldsymbol{P}=[X, Y, Z]^{T} P=[X,Y,Z]T

根据针孔相机模型,我们知道两个像素点 p 1 , p 2 p_{1},p_{2} p1,p2的像素位置为

s 1 p 1 = K P , s 2 p 2 = K ( R P + t ) s_{1} \boldsymbol{p}_{1}=\boldsymbol{K} \boldsymbol{P}, \quad s_{2} \boldsymbol{p}_{2}=\boldsymbol{K}(\boldsymbol{R P}+\boldsymbol{t}) s1p1=KP,s2p2=K(RP+t)

这里 K K K 为相机内参矩阵, R , t R, t R,t 为两个坐标系的相机运动(如果我们愿意,也可以写成李代数形式)。具体来说,这里计算的是 R 21 , t 21 R_{21},t_{21} R21,t21 s 1 , s 2 s_{1},s_{2} s1,s2代表尺度。

有时,我们会用齐次坐标表示像素点。在使用齐次坐标时,一个向量将等于它自身乘上任意的非零常数。这通常用于表达一个投影关系。例如, s 1 p 1 s_{1}p_{1} s1p1 p 1 p_{1} p1 成投影关系,它们在齐次坐标的意义下是相等的。我们称这种相等关系为尺度意义下相等(equal up to a scale), 记作:

s p ≃ p s p \simeq p spp

那么,上述两个投影关系写为:

p 1 ≃ K P , p 2 ≃ K ( R P + t ) \boldsymbol{p}_{1} \simeq K P, \quad p_{2} \simeq K(R P+t) p1KP,p2K(RP+t)

现在,取:

x 1 = K − 1 p 1 , x 2 = K − 1 p 2 \boldsymbol{x}_{1}=\boldsymbol{K}^{-1} \boldsymbol{p}_{1}, \quad \boldsymbol{x}_{2}=\boldsymbol{K}^{-1} \boldsymbol{p}_{2} x1=K1p1,x2=K1p2

这里的 x 1 , x 2 x1, x2 x1,x2 是两个像素点的归一化平面(相当于相机坐标系 Z = 1 Z = 1 Z=1平面上的点)上的坐标。代入上式,得:

x 2 ≃ R x 1 + t x_{2} \simeq R x_{1}+t x2Rx1+t

两边同时左乘 t ∧ t^{\wedge} t。回忆 ∧ {\wedge} 的定义,这相当于两侧同时与 t 做外积:

t ∧ x 2 = t ∧ R x 1 \boldsymbol{t}^{\wedge} \boldsymbol{x}_{2}=\boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}_{1} tx2=tRx1

然后,两侧同时左乘 x 2 T \boldsymbol{x}_{2}^{T} x2T

x 2 T t ∧ x 2 = x 2 T t ∧ R x 1 \boldsymbol{x}_{2}^{T} \boldsymbol{t}^{\wedge} \boldsymbol{x}_{2}=\boldsymbol{x}_{2}^{T} \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}_{1} x2Ttx2=x2TtRx1

观察等式左侧, t ∧ x 2 \boldsymbol{t}^{\wedge} \boldsymbol{x}_{2} tx2 是一个与 t t t x 2 \boldsymbol{x}_{2} x2垂直的向量。把它再和 x 2 \boldsymbol{x}_{2} x2 做内积时,将得到 0。由于等式左侧严格为0,乘以任何非零常数之后也为0,于是我们可以把 ≃ \simeq 写成通常的符号。因此,我们就得到了一个简洁的式子:

x 2 T t ∧ R x 1 = 0 \boldsymbol{x}_{2}^{T} \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}_{1} = 0 x2TtRx1=0

重新代入 p 1 p_{1} p1, p 2 p_{2} p2

p 2 T K − T t ∧ R K − 1 p 1 = 0 \boldsymbol{p}_{2}^{T} \boldsymbol{K}^{-T} \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{K}^{-1} \boldsymbol{p}_{1}=0 p2TKTtRK1p1=0

这两个式子都称为对极约束,它以形式简洁著名。它的几何意义是 O 1 , P , O 2 O1, P, O2 O1,P,O2 三者共
面。对极约束中同时包含了平移旋转

我们把中间部分记作两个矩阵:基础矩阵(Fundamental Matrix) F 和本质矩阵(Essential Matrix) E,可以进一步简化对极约束:

E = t ∧ R , F = K − T E K − 1 , x 2 T E x 1 = p 2 T F p 1 = 0 \boldsymbol{E}=\boldsymbol{t}^{\wedge} \boldsymbol{R}, \quad \boldsymbol{F}=\boldsymbol{K}^{-T} \boldsymbol{E} \boldsymbol{K}^{-1}, \quad \boldsymbol{x}_{2}^{T} \boldsymbol{E} \boldsymbol{x}_{1}=\boldsymbol{p}_{2}^{T} \boldsymbol{F} \boldsymbol{p}_{1}=0 E=tR,F=KTEK1,x2TEx1=p2TFp1=0

对极约束简洁地给出了两个匹配点的空间位置关系。于是,相机位姿估计问题变为以下两步:

  1. 根据配对点的像素位置,求出 E E E 或者 F F F
  2. 根据 E E E 或者 F F F,求出 R , t R, t R,t

由于 E E E F F F 只相差了相机内参,而内参在 SLAM 中通常是已知的,所以实践当中往往使用形式更简单的 E E E

https://www.zhihu.com/question/27581884
https://www.cnblogs.com/YongQiVisionIMAX/p/9711273.html
视觉SLAM十四讲
https://www.pianshen.com/article/2772299087/
https://www.guyuehome.com/34324

1.已知一幅图像中一点,如何寻找另一幅图像中这个点的对应点(可用光流法、特征点匹配法)

2.已知两幅图像中两点是对应关系,如何求解两相机的相对位置和姿态【R|t】

3.已知多幅图像中同一3D点的对应点,如何求解该3D点的3D坐标

这种极线约束的外点检测方法在动态场景下的SLAM中尤为常见,可以有效地检测出运动物体上的外点,具体做法为:

  1. 用RANSAC算法计算两帧图像的基础矩阵F;
  2. 对于第一帧图像每一特征点p1,利用基础矩阵计算其投影后的极线e2p2所在直线的参数;
  3. 计算对应特征点p2到该极线的距离,若过大,则为外点。
    当然这种算法也有不足之处,当物体沿着极线运动时,到该极线的距离始终为0,无法反映出其真是误差。这种弊端在检测高速公路上行驶的汽车时尤为明突出。

你可能感兴趣的:(相机,线性代数,算法)