介绍
- 特征点法:提取图像特征点,计算特征点图像描述子(图像灰度/变化梯度等),通过描述子来匹配特征点,确定特征点的匹配关系,利用三角/对极几何/PnP等算法估算相机运动。计算精度高,但是耗时。
- 光流法:提取图像特征点,与特征点法不同的是,光流法通过图像灰度值(RGB)值匹配特征点,光流描述了像素在图像中的运动,再利用三角/对极几何/PnP等算法估算相机运动。减少特征点匹配所需的计算量,精度也有保证。
- 直接法:直接使用像素块,也可以提取图像角点(角点像素突出因此能够进行更好的匹配),通过计算灰度值(RGB)值直接解算得到运动估计(R,t)。利用像素移动直接计算得到相机的移动。一般需要位姿的初始估计,通过初始的位姿估计来得到匹配的图像特征点,通过灰度值(RGB)值优化位姿估计。运算速度快,但是由于灰度不变假设,过快的图像运动,容易陷入局部最优解。
- 半直接法:以SVO为代表,将图像分块来做匹配。指通过对图像中的特征点图像块进行直接匹配来获取相机位姿,而不像直接匹配法那样对整个图像进行匹配。
特征匹配解决了SLAM中的数据关联问题(data association),即确定当前看到的路标与之前看到的路标之间的对应关系。通过图像特征点像素级描述子进行准确的匹配。
光流法数学过程:
理解图像函数:用于表示图像灰度值与图像坐标[u,v]之间的关系,图像函数3维示例图如下:
取[u,v]中的一维,2维图像函数示例图如下:
当图像灰度及坐标变化都很小时,如上右图(已知上一帧某特征点的灰度与B相同,当相机运动缓慢,我们就可以估计上一帧的某特征点为B),我们假设匹配的特征点的灰度值不变,光流法就是利用灰度算出与上一帧特征点匹配的当前帧特征点的像素坐标。
光流法计算匹配点像素坐标过程:
设
t
t
t 时刻位于
(
u
,
v
)
(u,v)
(u,v)处像素点的灰度值为
I
(
u
,
v
,
t
)
I(u,v,t)
I(u,v,t):
设在
t
+
d
t
t+dt
t+dt时刻,该像素特征点运动到图像
(
u
+
d
u
,
v
+
d
v
)
(u+du, v+dv)
(u+du,v+dv)处,对应的图像灰度值为 。光流法计算:
d
u
,
d
v
du,dv
du,dv。
灰度不变假设:
将上式泰勒一阶展开:
由于灰度不变假设,得
两边同时除以
d
t
dt
dt,得 (*)
其中:
∂
I
∂
u
\frac{\partial I}{\partial u}
∂u∂I,
∂
I
∂
v
\frac{\partial I}{\partial v}
∂v∂I分别为在t时刻图像点[x,y]处的图像梯度;
∂
I
∂
t
\frac{\partial I}{\partial t}
∂t∂I为t时刻图像点
[
u
,
v
]
[u,v]
[u,v]处的灰度随时间的变化率,一般由两帧图像之间的差值得到,即
∂
I
∂
t
≈
I
(
u
,
v
,
t
+
Δ
t
)
−
I
(
u
,
v
,
t
)
Δ
t
\frac{\partial I}{\partial t}\approx\frac{I\left(u,v,t+\Delta t\right)-I\left(u,v,t\right)}{\Delta t}
∂t∂I≈ΔtI(u,v,t+Δt)−I(u,v,t)
利用(*)式得出特征点在[u, v]处的像素移动速度,继而可估计出特征点新的图像坐标【十四讲】。
由于图像灰度及图像梯度容易发生剧烈变化,因此在大运动下,利用灰度下降优化容易陷入局部最优,如下右图。B为全局最优,但是由于灰度变化剧烈导致,下降至C点,便结束迭代。
使用图像金字塔可以得到一定程度的改善。在计算光流时,先从顶层的图像开始计算,然后将上一层的追踪结果,作为下一层光流的初始值。也是SVO中的一个思路。
图像金字塔是只对一个图像进行不同程度缩放,得到不同分辨率下的图像。
直接法数学过程:
直接法一般需要初始估计,利用初始估计预估图像特征匹配点,然后利用灰度约束得到两帧图像之间的相机运动。
假设有两个帧,运动未知,但有初 始估计 R,t第1帧上看到了点P,投影为p1 按照初始估计,P在第2帧上投影为 p2。
投影关系:运动使用李代数
ξ
\xi
ξ来表示。
最小化光度误差:
m
i
n
f
(
ξ
)
∑
i
=
1
N
e
i
T
e
i
,
e
i
=
I
1
(
p
1
,
i
)
−
I
2
(
p
2
,
i
)
min\ f\left(\xi\right)\sum_{i=1}^{N}{e_i^Te_i},\ e_i=I_1\left(p_1,i\right)-I_2\left(p_2,i\right)
min f(ξ)i=1∑NeiTei, ei=I1(p1,i)−I2(p2,i)
待估计的量为相机运动
ξ
\xi
ξ,在迭代求解上式时,比如使用高斯牛顿,需要知道上式的雅可比矩阵。雅可比矩阵推导计算过程如下:
令:
得:
得雅可比矩阵:
J
=
∂
e
∂
ξ
=
−
∂
I
2
∂
u
∂
u
∂
q
∂
q
∂
ξ
J=\frac{\partial e}{\partial\xi}=-\frac{\partial I_2}{\partial u}\frac{\partial u}{\partial q}\frac{\partial q}{\partial\xi}
J=∂ξ∂e=−∂u∂I2∂q∂u∂ξ∂q
使用求导链式法则,也可得上式。注意:如果误差函数e的定义为:
e
=
I
2
(
p
2
)
−
I
1
(
p
1
)
e=I_2\left(p_2\right)-I_1\left(p_1\right)
e=I2(p2)−I1(p1)
则雅可比矩阵反号。
雅可比矩阵分为三部分:
第一部分:图像梯度;
第二部分:像素对投影点导数:
第三部分:投影点对位姿导数:(李代数左扰动模型)
综合得:
直接法示例程序
代码及数据地址:https://gitee.com/nie_xun/zhijiefa.git
使用:
mkdir build; cd build
cmake ..; make
./zhijiefa
摁任意键进行下一步运算。
结果示例:
参考
视觉十四讲-高翔