其中,
p
,
q
p,q
p,q取0或1;
I
(
x
,
y
)
I(x,y)
I(x,y)表示在像素坐标
(
x
,
y
)
(x,y)
(x,y)处图像的灰度值;
m
p
q
m_{pq}
mpq表示图像的矩。 在半径为
R
R
R的圆形图像区域,沿两个坐标轴
x
,
y
x,y
x,y方向的图像矩分别为: 圆形区域内所有像素的灰度值总和为:
第2步:求出图像的质心为:
第3步:然后关键点的“主方向”就可以表示为从圆形图像形心
O
O
O 指向质心
C
C
C的方向向量
O
C
⃗
\vec{OC}
OC,于是关键点的旋转角度记为:
B
R
I
E
F
BRIEF
BRIEF 是一种二进制描述子,它的描述向量由许多个 0 和 1 组成,这里的 0 和 1 编码了关键点附近两个像素(比如说
p
p
p 和
q
q
q)的大小关系:如果
p
p
p 比
q
q
q 大,则取 1,反之就取 0。
B
R
I
E
F
BRIEF
BRIEF算法的核心思想是在关键点
P
P
P的周围以一定模式选取
N
N
N个点对,把这
N
N
N个点对的比较结果组合起来作为描述子。 那么,具体的两个像素
p
p
p、
q
q
q该怎么选呢? 为了保持踩点固定,工程上采用特殊设计的固定的
p
a
t
t
e
r
n
pattern
pattern来做。下面是几种
p
a
t
t
e
r
n
pattern
pattern:
原始的 BRIEF 描述子是不具有旋转不变性的,因此在图像发生旋转时容易丢失。而 ORB 在 FAST 特征点提取阶段计算了关键点的方向,所以可以利用方向信息,计算了旋转之后的“Steer BRIEF”特征,使 ORB 的描述子具有较好的旋转不变性。
毋庸置疑,特征匹配的准确性决定了视觉SLAM的位姿估计性能,然而由于图像特征的局部特性,误匹配的情况广泛存在,而且长期以来一直没有得到有效解决,目前已经成为视觉 SLAM 中制约性能提升的一大瓶颈。比如在ORB-SLAM中作者就花费了大量的计算和技巧去剔除误匹配。 描述子距离表示了两个特征之间的相似程度,不过在实际运用中还可以取不同的距离度量范数。对于二进制的描述子,使用汉明距离(Hamming distance)做为度量。两个二进制串之间的汉明距离,指的是它们不同位数的个数。 对应在 SLAM 中的实时性需求,基于快速近似最近邻(FLANN)算法可以实时匹配大量的特征点。可以通过
O
p
e
n
C
V
OpenCV
OpenCV实现。 效果图:
注意:这里是通过两张图象的二维图像点恢复相机运动。(2D-2D) 假设我们从两张图像中,得到了一对配对好的特征点
p
1
,
p
2
p_1,p_2
p1,p2,假定匹配完全正确,那么
p
1
,
p
2
p_1,p_2
p1,p2就是
P
P
P分别在两帧上的投影,如下图,这就是我们熟悉的对极几何约束。 假设相机从
O
1
O_1
O1运动到
O
2
O_2
O2,我们求解两帧之间的运动
R
,
t
R,t
R,t。
接下来的问题是如何根据已经估得的本质矩阵
E
E
E,恢复出相机的运动
R
,
t
R, t
R,t。这个过程是由奇异值分解(SVD)得到的。 设
E
E
E的
S
V
D
SVD
SVD 分解形式为:
其中
U
,
V
U,V
U,V 为正交阵,
Σ
Σ
Σ 为奇异值矩阵。 在
S
V
D
SVD
SVD 分解中,对于任意一个
E
E
E,存在两个可能的
t
,
R
t, R
t,R 与之对应:
其中
R
Z
(
π
/
2
)
R_Z(\pi/2)
RZ(π/2) 表示沿
Z
Z
Z 轴旋转
90
90
90 度得到的旋转矩阵。同时,由于
−
E
−E
−E 和
E
E
E 等价,所以对任意一个
t
t
t 取负号,也会得到同样的结果。这使得通过
S
V
D
SVD
SVD 分解可以得到四组解,分别对应下方四种情况。