前言
如有侵权,请告知删除
B站一位学姐的SLAM十四讲讲解的笔记.后续在此基础上继续完善.
问题引出:
特征点法
{
理解图像特征点的意义
,
掌握在单幅图像中提取特征点及多幅图像中匹配特征点的方法
理解对极几何的原理
,
利用对极几何的约束
,
恢复出图像之间的摄像机的三维运动
理解如何通过三角化
,
获得二维图像上对应的三维结构
理解
P
N
P
问题
,
及利用已知三维结构与图像的对应关系
,
求解摄像机的三维运动
.
理解
I
C
P
问题
.
及利用点云的匹配关系
,
求解摄像机的三维运动
.
⇓
特征点法问题
{
在图像中
提取
特征点并计算特征描述
非常耗时
通过计算描述子距离在不同图像中寻找
匹配
非常耗时
利用通过匹配点信息计算相机位姿
正常
\fbox{特征点法}\begin{cases}\color{#0FB}理解图像特征点的意义,掌握在单幅图像中提取特征点及多幅图像中匹配特征点的方法\\\color{#0FB}理解对极几何的原理,利用对极几何的约束,恢复出图像之间的摄像机的三维运动\\\color{#0FB} 理解如何通过三角化,获得二维图像上对应的三维结构\\\color{#0FB} 理解PNP问题,及利用已知三维结构与图像的对应关系,求解摄像机的三维运动.\\\color{#0FB} 理解ICP问题.及利用点云的匹配关系,求解摄像机的三维运动. \end{cases} \\~ \\ \Downarrow \\~\\ \fbox{特征点法问题}\begin{cases} \color{#F00} 在图像中 {\bf{提取}}特征点并计算特征描述 & \color{#F00}非常耗时\\ \color{#F00}通过计算描述子距离在不同图像中寻找{\bf匹配} & \color{#F00}非常耗时\\ 利用通过匹配点信息计算相机位姿&正常 \end{cases}
特征点法⎩
⎨
⎧理解图像特征点的意义,掌握在单幅图像中提取特征点及多幅图像中匹配特征点的方法理解对极几何的原理,利用对极几何的约束,恢复出图像之间的摄像机的三维运动理解如何通过三角化,获得二维图像上对应的三维结构理解PNP问题,及利用已知三维结构与图像的对应关系,求解摄像机的三维运动.理解ICP问题.及利用点云的匹配关系,求解摄像机的三维运动. ⇓ 特征点法问题⎩
⎨
⎧在图像中提取特征点并计算特征描述通过计算描述子距离在不同图像中寻找匹配利用通过匹配点信息计算相机位姿非常耗时非常耗时正常
改进: { 通过其他方式寻找匹配点 ( 描述子 ) 光流 1. 提取可能是随机点的特征点 ; 2. 不去进行匹配 , 直接进行位姿估计 直接法 \fbox{改进:}\begin{cases} 通过其他方式寻找匹配点(\cancel{描述子} )& \color{#00F}光流\\ 1.提取可能是随机点的特征点;2. 不去进行匹配,直接进行位姿估计 &\color{#00F}直接法 \end{cases} 改进:{通过其他方式寻找匹配点(描述子 )1.提取可能是随机点的特征点;2.不去进行匹配,直接进行位姿估计光流直接法
提示:以下是本篇文章正文内容,下面内容仅供参考
一、光流法
一种描述像素随时间在图像之间运动的方法, 本质上是估计像素在不同时刻图像中的运动。(希望解出像素到了下一刻的那个位置)
{
稀疏光流
L
K
光流为代表
稠密光流
H
S
光流为代表
\begin{cases}稀疏光流&{\color{#0F0}LK光流为代表}\\ 稠密光流&{\color{#0F0}HS光流为代表} \end{cases}
{稀疏光流稠密光流LK光流为代表HS光流为代表
在视觉SLAM中,可以用光流去追一些特征点,角点(一张图像上的部分像素),所以一般用的都是稀疏光流。
1.1、LK光流
- 设在t时刻位于(x,y)处的像素的灰度为I(x,y,t) ; 其中I(x,y,t)为 在t时刻,x,y坐标的灰度值
- 在t+Δt时刻运动了(x+dx,y+dy)处,其灰度值为:I(x+dx,y+dy,t+dt)
我们想计算dx,dy - 假设灰度不变I(x+dx,y+dy,t+dt)=I(x,y,t)
(是一个理想的假设,实际上可能会不成立)
多元函数 ( x k 1 , x k 2 , . . . . , x k n ) 处的泰勒展开公式 : f ( x 1 , x 2 , . . . . , x n ) = f ( x k 1 , x k 2 , . . . . , x k n ) + ∑ i = 1 n ( x i − x k i ) f x i ′ ( x k 1 , x k 2 , . . . . , x k n ) + 1 2 ! ∑ i , j = 1 n ( x i − x k i ) ( x j − x k j ) f i j ′ ′ ( x k 1 , x k 2 , . . . . , x k n ) + O n 多元函数(x_k^1,x_k^2,....,x_k^n)处的泰勒展开公式:\\ f(x^1,x^2,....,x^n)=f(x_k^1,x_k^2,....,x_k^n)+\sum_{i=1}^n(x^i-x_k^i)f_{x^i}'(x_k^1,x_k^2,....,x_k^n)\\ +\frac{1}{2!}\sum_{i,j=1}^n(x^i-x_k^i)(x^j-x_k^j)f_{ij}^{''}(x_k^1,x_k^2,....,x_k^n)+O^n 多元函数(xk1,xk2,....,xkn)处的泰勒展开公式:f(x1,x2,....,xn)=f(xk1,xk2,....,xkn)+i=1∑n(xi−xki)fxi′(xk1,xk2,....,xkn)+2!1i,j=1∑n(xi−xki)(xj−xkj)fij′′(xk1,xk2,....,xkn)+On
I ( x + d x , y + d y , t + d t ) = I ( x , y , t ) 对 t + d t 时刻的灰度进行泰勒一阶展开并保留一阶项 I ( x + d x , y + d y , t + d t ) ≈ I ( x , y , t ) + ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t 由灰度不变 ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t = 0 ⟹ ∂ I ∂ x d x d t + ∂ I ∂ y d y d t = − ∂ I ∂ t . ⇓ I x u + I y v = − I t ∂ I ∂ x : 图像在 x 方向上的梯度 I x . ∂ I ∂ y : 图像在 y 方向上的梯度 I y ∂ x ∂ t : x 方向的速度 u ∂ x ∂ t : y 方向的速度 v ∂ I ∂ t : 图像灰度关于时间的变化 I t I(x+dx,y+dy,t+dt)=I(x,y,t)\\ 对t+dt时刻的灰度进行泰勒一阶展开并保留一阶项\\ {\color{#F00} I(x+dx,y+dy,t+dt) ≈I(x,y,t)+\frac{\partial I }{\partial x}dx+\frac{\partial I }{\partial y}dy+\frac{\partial I }{\partial t}dt}\\~\\ 由灰度不变 \qquad \frac{\partial I }{\partial x}dx+\frac{\partial I }{\partial y}dy+\frac{\partial I }{\partial t}dt=0 \implies \frac{\partial I }{\partial x}\frac{dx}{dt}+\frac{\partial I }{\partial y}\frac{dy}{dt}=-\frac{\partial I }{\partial t}.\\ \Downarrow\\{\color{#F00} I_xu+I_yv=-I_t }\\ ~\\ \begin{matrix} \frac{\partial I}{\partial x}: 图像在x 方向上的梯度I_x.\\~\\ \frac{\partial I}{\partial y}: 图像在y 方向上的梯度I_y~\\ ~\\ \frac{\partial x}{\partial t}: x方向的速度u ~~~~~~~~~~~~~~~~~\\~\\ \frac{\partial x}{\partial t}: y方向的速度v ~~~~~~~~~~~~~~~~~\\~\\ \frac{\partial I}{\partial t}: 图像灰度关于时间的变化I_t\\ \end{matrix} I(x+dx,y+dy,t+dt)=I(x,y,t)对t+dt时刻的灰度进行泰勒一阶展开并保留一阶项I(x+dx,y+dy,t+dt)≈I(x,y,t)+∂x∂Idx+∂y∂Idy+∂t∂Idt 由灰度不变∂x∂Idx+∂y∂Idy+∂t∂Idt=0⟹∂x∂Idtdx+∂y∂Idtdy=−∂t∂I.⇓Ixu+Iyv=−It ∂x∂I:图像在x方向上的梯度Ix. ∂y∂I:图像在y方向上的梯度Iy ∂t∂x:x方向的速度u ∂t∂x:y方向的速度v ∂t∂I:图像灰度关于时间的变化It
I
x
u
+
I
y
v
=
−
I
t
{\color{#F00} I_xu+I_yv=-I_t }
Ixu+Iyv=−It
这里未知量是u和v, 上式为一个二元一次方程,使用一个像素点无法求出
–需要引用额外的约束
(不仅假设像素灰度值不变,而且要假定一个窗口内的像素具有相同的运动
)
考虑一个大小为w×w的窗口,则含有w2数量个像素
[
I
x
I
y
]
k
[
u
v
]
=
−
I
t
k
,
k
=
1
,
2
,
.
.
.
,
w
2
.
[I_x\quad I_y]_k\begin{bmatrix} u\\v \end{bmatrix}=-I_{tk}, \qquad k=1,2,...,w^2.
[IxIy]k[uv]=−Itk,k=1,2,...,w2.
超定方程,通过最小二乘解出来求得运动u,v
A
=
[
[
I
x
,
I
y
]
1
⋮
[
I
x
,
I
y
]
k
]
,
b
=
[
I
t
1
⋮
I
t
k
]
.
⟹
A
[
u
v
]
=
−
b
.
⟹
[
u
v
]
∗
=
−
(
A
T
A
)
−
1
A
T
b
.
A=\begin{bmatrix} [I_x,I_y]_1\\ \vdots[I_x,I_y]_k \end{bmatrix}, b=\begin{bmatrix} I_t1\\ \vdots \\I_{tk} \end{bmatrix}. \implies A\begin{bmatrix} u\\v \end{bmatrix}=-b. \implies \begin{bmatrix} u\\v \end{bmatrix}^*=-(A^TA)^{-1}A^Tb.
A=[[Ix,Iy]1⋮[Ix,Iy]k],b=
It1⋮Itk
.⟹A[uv]=−b.⟹[uv]∗=−(ATA)−1ATb.
最小二乘解 : A x = − b 则 e = A x + b min ∣ ∣ e ∣ ∣ 2 = min ( A x + b ) T ( A x + b ) = min ( x T A T A x + 2 x T A T b + b T b ) d ∣ ∣ e ∣ ∣ 2 d x = 2 A T A x + 2 A T b = 0 x = − ( A T A ) − 1 A T b 最小二乘解:Ax=-b \qquad则e=Ax+b \qquad \\ \min||e||_2=\min(Ax+b)^T(Ax+b)=\min(x^TA^TAx+2 x^TA^Tb+b^Tb)\\ \frac{d||e||_2}{dx}=2A^TAx+2A^Tb=0\\ x=-(A^TA)^{-1}A^Tb 最小二乘解:Ax=−b则e=Ax+bmin∣∣e∣∣2=min(Ax+b)T(Ax+b)=min(xTATAx+2xTATb+bTb)dxd∣∣e∣∣2=2ATAx+2ATb=0x=−(ATA)−1ATb
问题:我们把光流写成了非线性优化问题,就必须假设优化的初始值靠近最优解.才能在一定程度上保证算法的熟练。如果相机运动较快,两章图像差异较为明显,那么单层图像光流法容易达到一个局部最小值。这种情况可以通过图像金字塔来改善。
解决:图像金字塔
是指对不同一个图像进行缩放,得到不同分辨率的图像, 如图8-2所示.
流程图:
由粗至精的好处
在于,当原始图像的像素运动较大时,在金字塔顶层的图像看来,运动仍然在一个很小的范围内。例如,原始图像的特征点运动了20个像素,很容易由于图像非凸性导致优化困在极小值里。但现在假设没有缩放倍率0.5倍的金字塔,那么往上两层图像里,像素运动就只有5个像素了,这时结果就明显好于直接在原始图像上优化。
二、直接法
- 光流仅估计了像素间的平移,但是没有用到相机本身的集合结构(投影模型)以及考虑相机的旋转和图像的缩放
- 直接法考虑了这些信息
直接法的推导:
已知:三维点在第一个相机坐标系下的三维坐标
P
=
(
X
Y
Z
)
P=\begin{pmatrix} X\\Y\\Z \end{pmatrix}
P=
XYZ
两张图像的灰度值; 三维点投影在第一章图像上的像素坐标p1;
未知:图像1到图像2的位姿
假设:灰度不变假设 (光度不变)
目标:
min
T
J
(
T
)
=
∑
i
=
1
N
e
i
T
e
i
,
e
i
=
I
1
(
p
1.
i
)
−
I
2
(
p
2
,
i
)
.
\min_TJ(T)=\sum^N_{i=1}e_i^Te_i, \qquad e_i=I_1(p_{1.i})-I_2(p_{2,i}).
TminJ(T)=i=1∑NeiTei,ei=I1(p1.i)−I2(p2,i).
思想:先初始化一个不准确的位姿,计算p2,根据p2和p1的灰度值差异,不断迭代调整位姿
2.1 公式推导
像素坐标与相机坐标:
p 1 = [ u v 1 ] 1 = 1 Z 1 K P . p 2 = [ u v 1 ] 2 = 1 Z 2 K ( RP+t ⏟ q ) = 1 Z 2 K ( e x p ( ξ ∧ ) P ) 1 : 3 其中 q 是以 p 2 为相机坐标 p_1=\begin{bmatrix} u\\v\\1 \end{bmatrix}_1=\frac{1}{Z_1}KP.\\p_2=\begin{bmatrix} u\\v\\1 \end{bmatrix}_2=\frac{1}{Z_2}K(\underbrace{\fbox{RP+t}}_{\rm q} )=\frac{1}{Z_2}K(exp(\xi^\wedge)P)_{1:3}\\ 其中q是以p_2为相机坐标 p1= uv1 1=Z11KP.p2= uv1 2=Z21K(q RP+t)=Z21K(exp(ξ∧)P)1:3其中q是以p2为相机坐标
min
T
J
(
T
)
=
∑
i
=
1
N
e
i
T
e
i
,
e
i
=
I
1
(
p
1.
i
)
−
I
2
(
p
2
,
i
)
.
\min_TJ(T)=\sum^N_{i=1}e_i^Te_i, \qquad e_i=I_1(p_{1.i})-I_2(p_{2,i}).
TminJ(T)=i=1∑NeiTei,ei=I1(p1.i)−I2(p2,i).
q为了p在第二个相机坐标系下的坐标,u为它的像素坐标
e
(
T
)
=
I
1
(
p
1
)
−
I
2
(
u
)
,
e(T)=I_1(p_1)-I_2(u),
e(T)=I1(p1)−I2(u),
我们关心误差e是如何随着相机位姿T变化的,需要分析他们的导数关系
∂
e
∂
T
=
−
∂
I
2
∂
u
∂
u
∂
q
∂
q
∂
δ
ξ
\frac{\partial e}{\partial T}=-\frac{\partial I_2}{\partial u}\frac{\partial u}{\partial q}\frac{\partial q}{\partial \delta\xi}
∂T∂e=−∂u∂I2∂q∂u∂δξ∂q
- (1) ∂ I 2 ∂ u 为 u 处的像素梯度 \frac{\partial I_2}{\partial u}为u处的像素梯度 ∂u∂I2为u处的像素梯度
- (2)
∂
u
∂
q
为
投影方程
关于
相机坐标系下的三维点
的导数
,
记
q
=
(
X
Y
Z
)
\frac{\partial u}{\partial q}为{\color{#00F}投影方程}关于{\color{#00F}相机坐标系下的三维点}的导数,记q=\begin{pmatrix}X\\Y\\Z \end{pmatrix}
∂q∂u为投影方程关于相机坐标系下的三维点的导数,记q=
XYZ
u = f x X + c x Z , v = f y Y + c y Z ⟹ ∂ u ∂ q = [ ∂ u ∂ X ∂ u ∂ Y ∂ u ∂ Z ∂ v ∂ X ∂ v ∂ Y ∂ v ∂ Z ] = [ f x Z 0 − f x X Z 2 0 f y Z − f y Y Z 2 ] u=\frac{f_xX+c_x}{Z}, v=\frac{f_yY+c_y}{Z}\Longrightarrow\frac{\partial u}{\partial q}=\begin{bmatrix} \frac{\partial u}{\partial X} &\frac{\partial u}{\partial Y}&\frac{\partial u}{\partial Z}\\~\\ \frac{\partial v}{\partial X} &\frac{\partial v}{\partial Y}&\frac{\partial v}{\partial Z} \end{bmatrix}=\begin{bmatrix} \frac{f_x}{Z} &0&-\frac{f_xX}{Z^2}\\~\\ 0&\frac{f_y}{Z}&-\frac{f_yY}{Z^2} \end{bmatrix} u=ZfxX+cx,v=ZfyY+cy⟹∂q∂u= ∂X∂u ∂X∂v∂Y∂u∂Y∂v∂Z∂u∂Z∂v = Zfx 00Zfy−Z2fxX−Z2fyY
(3) ∂ q ∂ δ ξ 为变换后的三维点对变换的导数 : ∂ q ∂ δ ξ = [ I , − q ∧ ] . \frac{\partial q}{\partial \delta \xi}为变换后的三维点对变换的导数:\\ \frac{\partial q}{\partial \delta \xi}=[I,-q^\wedge]. ∂δξ∂q为变换后的三维点对变换的导数:∂δξ∂q=[I,−q∧].
由(2)和(3)上式可知:
∂ u ∂ δ ξ = [ f x Z 0 − f x X Z 2 − f x X Y Z 2 f x + f x X 2 Z 2 − f x Y Z 0 f y Z − f y Y Z 2 − f y − f y Y 2 Z 2 f y X Y Z 2 f y X Z ′ ] \frac{\partial u}{\partial \delta \xi}=\begin{bmatrix} \frac{f_x}{Z} & 0&-\frac{f_xX}{Z^2}&-\frac{f_xXY}{Z^2}&f_x+\frac{f_xX^2}{Z^2}&-\frac{f_xY}{Z}\\~\\ 0 & \frac{f_y}{Z} & -\frac{f_yY}{Z^2} &-f_y-\frac{f_yY^2}{Z^2}&\frac{f_yXY}{Z^2}&\frac{f_yX}{Z'} \end{bmatrix} ∂δξ∂u= Zfx 00Zfy−Z2fxX−Z2fyY−Z2fxXY−fy−Z2fyY2fx+Z2fxX2Z2fyXY−ZfxYZ′fyX
误差相对于李代数的雅可比矩阵:
J = − ∂ I 2 ∂ u ∂ u ∂ δ ξ . \color{#F00}J=-\frac{\partial I_2}{\partial u}\frac{\partial u}{\partial \delta \xi}. J=−∂u∂I2∂δξ∂u.
— 根据使用的图像信息不同,可以分为:
稀疏直接法: 只处理稀疏角点或关键点
半稠密直接法: 使用部分梯度明显的像素
稠密直接法: 使用所有像素
总结
引用:
视觉SLAM十四讲_视觉里程计