基本概念:
本质矩阵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: 对极几何
现在,假设我们从两张图像中,得到了一对配对好的特征点。
如果我们有若干对这样的匹配点,就可以通过这些二维图像点的对应关系,恢复出在两帧之间摄像机的运动。
这里“若干对”具体是多少对呢?我们会在下文介绍。先来看看两个图像当中的匹配点有什么几何关系吧。
我们希望求取两帧图像 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 到底在极线的哪个位置了。那时,就必须在极线上搜索以获得正确的匹配。
现在,我们从代数角度来看一下这里出现的几何关系。在第一帧的坐标系下,设 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 sp≃p
那么,上述两个投影关系写为:
p 1 ≃ K P , p 2 ≃ K ( R P + t ) \boldsymbol{p}_{1} \simeq K P, \quad p_{2} \simeq K(R P+t) p1≃KP,p2≃K(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=K−1p1,x2=K−1p2
这里的 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 x2≃Rx1+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} t∧x2=t∧Rx1
然后,两侧同时左乘 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} x2Tt∧x2=x2Tt∧Rx1
观察等式左侧, t ∧ x 2 \boldsymbol{t}^{\wedge} \boldsymbol{x}_{2} t∧x2 是一个与 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 x2Tt∧Rx1=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 p2TK−Tt∧RK−1p1=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=t∧R,F=K−TEK−1,x2TEx1=p2TFp1=0
对极约束简洁地给出了两个匹配点的空间位置关系。于是,相机位姿估计问题变为以下两步:
由于 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中尤为常见,可以有效地检测出运动物体上的外点,具体做法为: