赞
踩
从图像中选取比较有代表性的点,这些点在相机视角发生少量变化后会保持不变,可以在各个图像中找到相同的点。在经典 SLAM 模型中,这些点称为路标( Landmark)。在视觉 SLAM 中,路标则是指图像特征( Feature)。特征点由关键点(key-point)和描述子(descriptor)两部分组成。
ORB:Oriented FAST and Rotated BRIEF
FAST 检测过程
- 在图像中选取像素 p p p,假设它的亮度为 I p I_p Ip。
- 设置一个阈值 T T T(比如, I p I_p Ip 的 20%)。
- 以像素 p p p 为中心,选取半径为 3 的圆上的 16 个像素点。
- 假如选取的圆上有连续的 N N N 个点的亮度大于 I p + T I_p + T Ip+T 或小于 I p − T I_p − T Ip−T,那么像素 p p p 可以被认为是特征点( N 通常取 12,即为 FAST-12)。
- 循环以上四步,对每一个像素执行相同的操作。
最简单的特征匹配方法就是暴力匹配( BruteForce Matcher)。即对每一个特征点
x
t
m
x_t^m
xtm 与所有的
x
t
+
1
n
x_{t+1}^n
xt+1n 测量描述子的距离,然后排序,取最近的一个作为匹配点。描述子距离表示了两个特征之间的相似程度。而对于二进制的描述子(如BRIEF),使用汉明距离作为度量——两个二进制串之间的汉明距离,指的是其不同位数的个数。
快速近似最近邻( FLANN) 算法更加适合于匹配点数量极多的情况。
匹配好点对后根据点对来估计相机的运动。
O
1
,
O
2
,
P
O_1,O_2,P
O1,O2,P 三点确定一个平面称为极平面
e
1
,
e
2
e_1,e_2
e1,e2 称为极点( Epipoles),
O
1
O
2
O_1O_2
O1O2 被称为基线,极平面与两个像平面
I
1
,
I
2
I_1,I_2
I1,I2 之间的相交线
l
1
,
l
2
l_1,l_2
l1,l2 为极线( Epipolar line)。
特征点
p
1
p_1
p1是
O
1
P
O_1P
O1P所在直线上所有点的投影,特征点
p
2
p_2
p2是
O
2
P
O_2P
O2P所在直线上所有点的投影,又应为
p
1
p_1
p1和
p
2
p_2
p2匹配,所以就能推断出 P 的空间位置,以及相机的运动
x 2 T t \pmb{x}_2^T\pmb{t} xxx2Tttt^ R x 1 = 0 \pmb{Rx}_1 = 0 RxRxRx1=0
p 2 T K − T t \pmb{p}_2^T\pmb{K}^{-T}\pmb{t} ppp2TKKK−Tttt^ R K − 1 p 1 = 0 \pmb{R}\pmb{K}^{-1}\pmb{p}_1 = 0 RRRKKK−1ppp1=0
令 E = t \pmb{E} = \pmb{t} EEE=ttt^ R \pmb{R} RRR :本质矩阵 E \pmb{E} EEE(Essential Matrix)
令 F = K − T E K − 1 \pmb{F} = \pmb{K}^{-T}\pmb{EK}^{-1} FFF=KKK−TEKEKEK−1 :基础矩阵 F \pmb{F} FFF( Fundamental Matrix)
简化得 x 2 T E x 1 = p 2 T F p 1 = 0 \pmb{x}_2^T \pmb{E} \pmb{x}_1 = \pmb{p}_2^T \pmb{F} \pmb{p}_1 = 0 xxx2TEEExxx1=ppp2TFFFppp1=0
对极约束简洁地给出了两个匹配点的空间位置关系。相机位姿估计问题变为以下两步
E = t \pmb{E} = \pmb{t} EEE=ttt^ R \pmb{R} RRR
t 1 \pmb{t}_1 ttt1^ = U R z ( π 2 ) Σ U T = \pmb{UR}_z(\frac{\pi}{2}) \pmb{\Sigma U}^T =URURURz(2π)ΣUΣUΣUT | R 1 = U R z T ( π 2 ) V T \pmb{R}_1= \pmb{UR}_z^T(\frac{\pi}{2}) \pmb{V}^T RRR1=URURURzT(2π)VVVT |
---|---|
t 2 \pmb{t}_2 ttt2^ = U R z ( − π 2 ) Σ U T = \pmb{UR}_z(-\frac{\pi}{2}) \pmb{\Sigma U}^T =URURURz(−2π)ΣUΣUΣUT | R 2 = U R z T ( − π 2 ) V T \pmb{R}_2= \pmb{UR}_z^T(-\frac{\pi}{2}) \pmb{V}^T RRR2=URURURzT(−2π)VVVT |
从 E \pmb{E} EEE 分解到 R , t \pmb{R,t} R,tR,tR,t 时,一共存在 4 个可能的解,只有第一种解中 P 在两个相机中都具有正的深度。因此,只要把任意一点代入 4 种解中,检测该点在两个相机下的深度,就可以确定哪个解是正确的了。
单应矩阵(Homography) H \pmb{H} HHH,它描述了两个平面之间的映射关系。若场景中的特征点都落在同一平面上(比如墙、地面等),则可以通过单应性来进行运动估计
E \pmb{E} EEE 具有尺度等价性,所以分解的 R , t \pmb{R,t} R,tR,tR,t 也具有尺度等价性,但因为 R ∈ S O ( 3 ) \pmb{R} \in SO(3) RRR∈SO(3) 自身具有约束,所以 t \pmb{t} ttt 具有一个尺度,分解过程中对 t \pmb{t} ttt 乘以任意非零常数分解都成立,因此常对t进行归一化,使其长度为1。这直接导致了单目视觉的尺度不确定性。例如,程序中输出的 t \pmb{t} ttt 第一维约为 0.822。这个 0.822 究竟是指 0.822 米还是 0.822 厘米,我们是没法确定的。
三角测量是指,通过在两处观察同一个点的夹角,从而确定该点的距离。理论上直线
O
1
p
1
O_1p_1
O1p1 与
O
2
p
2
O_2p_2
O2p2 在场景中会相交于一点
P
P
P,该点即两个特征点所对应的地图点在三维场景中的位置。然而由于噪声的影响,这两条直线往往无法相交。因此,可以通过最二小乘法求解。
三角测量的矛盾:增大平移,会导致匹配失效;而平移太小,则三角化精度不够
直接线性变换
P3P
Bundle Adjustment
我们可以把 PnP 问题构建成一个定义于李代数上的非线性最小二乘问题,是一个最小化重投影误差(Reprojection error)
考虑 n 个三维空间点
P
P
P 和它们的投影
p
p
p,我们希望计算相机的位姿
R
,
t
\pmb{R,t}
R,tR,tR,t,它的李代
数表示为
ξ
\pmb{ξ}
ξξξ。假设某空间点坐标为
P
i
=
[
X
i
Y
i
,
Z
i
]
T
P_i = [X_i Y_i, Z_i]^T
Pi=[XiYi,Zi]T ,其投影的像素坐标为
u
i
=
[
u
i
,
v
i
]
T
u_i = [u_i, v_i]^T
ui=[ui,vi]T 。根据像素点和空间点投影位置关系可得:
s
i
[
u
i
v
i
1
]
=
K
e
x
p
(
ξ
s_i\left[
中间隐含着的齐次坐标到非齐次的转换。由于相机位姿未知以及观测点的噪声,该等式存在一个误差,是将像素坐标与 3D 点按照当前估计的位姿进行投影得到的位置相比较得到的误差就是重投影误差
ξ
∗
=
arg
min
ξ
1
2
∑
i
=
1
n
∣
∣
u
i
−
1
s
i
K
e
x
p
(
ξ
>
)
P
i
∣
∣
2
\pmb{ξ}^* = \underset{ξ}{\arg\min}\frac{1}{2}\sum_{i=1}^n ||\pmb{u}_i-\frac{1}{s_i}\pmb{K} exp(\pmb{ξ}^>)\pmb{P}_i||^2
ξξξ∗=ξargmin21i=1∑n∣∣uuui−si1KKKexp(ξξξ>)PPPi∣∣2
可以构建无约束的优化问题,通过 G-N, L-M 等优化算法进行求解
优化位姿:根据链式法则
∂
e
∂
δ
ξ
=
lim
δ
ξ
→
0
e
(
δ
ξ
⨁
ξ
)
δ
ξ
=
∂
e
∂
P
′
∂
P
′
∂
δ
ξ
=
−
[
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
′
]
优化特征点:根据链式法则
∂
e
∂
P
=
∂
e
∂
P
′
∂
P
′
∂
P
=
−
[
f
x
Z
′
0
−
f
x
X
′
Z
′
2
0
f
y
Z
′
f
y
Y
′
Z
′
2
]
R
BA优化
节点:第二个相机的位姿节点
ξ
∈
S
E
(
3
)
\pmb{ξ} \in SE(3)
ξξξ∈SE(3),以及所有特征点的空间位置
P
∈
R
3
\bf{P} \in \R^3
P∈R3
边:每个 3D 点在第二个相机中的投影,以观测方程来描述:
z
j
=
h
(
ξ
,
P
j
)
z_j=h(\pmb\xi,\pmb{P}_j)
zj=h(ξξξ,PPPj)
假设有一组配对好的 3D 点 :
P
=
\pmb{P} =
PPP={
p
1
,
.
.
.
,
p
n
p_1,...,p_n
p1,...,pn},
P
′
=
\pmb{P}' =
PPP′={
p
1
′
,
.
.
.
,
p
n
′
p_1',...,p_n'
p1′,...,pn′}
现在,想要找一个欧氏变换
R
,
t
\pmb{R,t}
R,tR,tR,t,使得:
∀
i
,
p
i
=
R
p
i
′
+
t
\forall i,\pmb{p}_i = \pmb{Rp}_i'+\pmb{t}
∀i,pppi=RpRpRpi′+ttt
这个问题可以用迭代最近点(Iterative Closest Point, ICP)求解。
SVD方法(线性代数的求解)
非线性优化方法
目标函数为:
min
ξ
=
1
2
∑
i
=
1
n
∣
∣
p
i
−
exp
(
ξ
\underset{\pmb{\xi}}{\min} = \frac{1}{2}\sum_{i=1}^n ||\pmb{p}_i-\exp(\xi
ξξξmin=21∑i=1n∣∣pppi−exp(ξ^
)
p
i
′
∣
∣
2
2
)\pmb{p}_i'||_2^2
)pppi′∣∣22
单个误差项关于位姿导数:
∂
e
∂
δ
ξ
=
−
(
exp
(
ξ
\frac{\partial\pmb{e}}{\partial \delta\pmb{\xi}} = -(\exp(\xi
∂δξξξ∂eee=−(exp(ξ^
)
p
i
′
)
⨀
)\pmb{p}_i')^{\bigodot}
)pppi′)⨀
光流法可以加速基于特征点的视觉里程计算法,避免计算和匹配描述子的过程,但要求相机运动较慢(或采集频率较高)
稀疏光流 | 计算部分像素运动 | Lucas-Kanade |
---|---|---|
稠密光流 | 计算所有像素 | Horn-Schunck |
本节主要讲LK光流
已知某个空间点 P 的世界坐标为 [X,Y,Z]和它在两个相机上成像的非齐次像素坐标 p 1 , p 2 \pmb{p}_1,\pmb{p}_2 ppp1,ppp2。我们的目标是求第一个相机到第二个相机的相对位姿变换。
特征点法中,通过匹配描述子,知道
p
1
,
p
2
\pmb{p}_1,\pmb{p}_2
ppp1,ppp2的像素位置,就可以定位空间点然后计算重投影的位置。
直接法的思路是根据当前相机的位姿估计值,来寻找
p
2
\pmb{p}_2
ppp2 的位置。若相机位姿不够好,
p
2
\pmb{p}_2
ppp2 的外观和
p
1
\pmb{p}_1
ppp1 会有明显差别(没有用投影,而是用的亮度)。为了减小这个差别,我们优化相机的位姿,来寻找与
p
1
\pmb{p}_1
ppp1 更相似的
p
2
\pmb{p}_2
ppp2 。
推导
以第一个相机为参照系,设第二个相机旋转和平移为
R
,
t
\pmb{R,t}
R,tR,tR,t(对应李代数为
ξ
\pmb{\xi}
ξξξ)。相机的内参相同为
K
\pmb{K}
KKK,
Z
1
Z_1
Z1 是 P 的深度,
Z
2
Z_2
Z2 是 P 在第二个相机坐标系下的深度。投影方程:
p
1
=
[
u
v
1
]
1
=
1
Z
1
K
P
\pmb{p}_1 = \left[
p
2
=
[
u
v
1
]
2
=
1
Z
2
K
(
R
P
+
t
)
=
1
Z
2
K
(
exp
(
ξ
\pmb{p}_2 = \left[
解一个优化问题———最小化光度误差,也就是 P 的两个像的亮度误差: e = I 1 ( p 1 ) − I 2 ( p 2 ) e = \pmb{I}_1(\pmb{p}_1)-\pmb{I}_2(\pmb{p}_2) e=III1(ppp1)−III2(ppp2)——> min ξ J ( ξ ) = ∣ ∣ e ∣ ∣ 2 \underset{\pmb{\xi}}{\min} \pmb{J}(\pmb{\xi})=||e||^2 ξξξminJJJ(ξξξ)=∣∣e∣∣2
假设一个空间点在各个视角下,成像的灰度是不变的。N 个空间点
P
i
P_i
Pi的条件下整个相机位姿估计问题变为:
min
ξ
J
(
ξ
)
=
∑
i
=
1
N
e
i
T
e
i
,
e
i
=
I
1
(
p
1
,
i
)
−
I
2
(
p
2
,
i
)
\underset{\pmb{\xi}}{\min} \pmb{J}(\pmb{\xi})=\sum_{i=1}^Ne_i^Te_i,e_i = \pmb{I}_1(\pmb{p}_1,i)-\pmb{I}_2(\pmb{p}_2,i)
ξξξminJJJ(ξξξ)=i=1∑NeiTei,ei=III1(ppp1,i)−III2(ppp2,i)
优化变量是相机位姿 ξ \pmb{\xi} ξξξ
∂ e ∂ δ ξ = lim δ ξ → 0 e ( δ ξ ⨁ ξ ) δ ξ \dfrac{\partial\pmb{e}}{\partial \delta\pmb{\xi}} = \lim_{\delta\xi \to 0} \dfrac{\pmb{e}(\delta\pmb{\xi} \bigoplus\pmb{\xi})}{\delta\pmb{\xi}} ∂δξξξ∂eee=limδξ→0δξξξeee(δξξξ⨁ξξξ)
e
(
δ
ξ
⨁
ξ
)
=
I
1
(
1
Z
1
K
P
)
−
I
2
(
1
Z
2
K
exp
(
δ
ξ
∧
)
exp
(
ξ
∧
)
P
)
≈
I
1
(
1
Z
1
K
P
)
−
I
2
(
1
Z
2
K
(
1
+
δ
ξ
∧
)
exp
(
ξ
∧
)
P
=
I
1
(
1
Z
1
K
P
)
−
I
2
(
1
Z
2
K
exp
(
ξ
∧
)
P
+
1
Z
2
K
δ
ξ
∧
exp
(
ξ
∧
)
P
)
设
q
\pmb{q}
qqq 为
P
\pmb{P}
PPP 在扰动之后,位于第二个相机坐标系下的坐标,而
u
\pmb{u}
uuu 为它的像素坐标
q
=
δ
ξ
\pmb{q} = \delta\pmb{\xi}
qqq=δξξξ^
exp
(
ξ
\exp(\pmb{\xi}
exp(ξξξ ^
)
P
)\pmb{P}
)PPP,
u
=
1
Z
2
K
q
\pmb{u} = \dfrac{1}{Z_2}\pmb{Kq}
uuu=Z21KqKqKq
一阶泰勒展开得
e
(
δ
ξ
⨁
ξ
)
=
I
1
(
1
Z
1
K
P
)
−
I
2
(
1
Z
2
K
exp
(
ξ
∧
)
P
+
u
)
≈
I
1
(
1
Z
1
K
P
)
−
I
2
(
1
Z
2
K
exp
(
ξ
∧
)
P
)
−
∂
I
2
∂
u
∂
u
∂
q
∂
q
∂
δ
ξ
δ
ξ
=
e
(
ξ
)
−
∂
I
2
∂
u
∂
u
∂
q
∂
q
∂
δ
ξ
δ
ξ
∂ I 2 ∂ u \dfrac{\partial\pmb{I}_2}{\partial \pmb{u}} ∂uuu∂III2为 u \pmb{u} uuu 处的像素梯度;
∂ u ∂ q \dfrac{\partial\pmb{u}}{\partial \pmb{q}} ∂qqq∂uuu为投影方程关于相机坐标系下的三维点的导数;
∂ q ∂ δ ξ \dfrac{\partial\pmb{q}}{\partial \delta\pmb{\xi}} ∂δξξξ∂qqq为变换后的三维点对变换的导数;
后两项只与三维点
±
q
\pm{q}
±q 有关,而与图像无关,把它合并在一起:
∂
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
′
]
\dfrac{\partial\pmb{u}}{\partial \delta\pmb{\xi}} = \left[
-所以误差相对于李代数的雅可比矩阵:
J
=
−
∂
I
2
∂
u
∂
u
∂
δ
ξ
\pmb{J} = - \dfrac{\partial\pmb{I}_2}{\partial \pmb{u}}\dfrac{\partial\pmb{u}}{\partial \delta\pmb{\xi}}
JJJ=−∂uuu∂III2∂δξξξ∂uuu
对于 N 个点的问题,可以用这种方法计算优化问题的雅可比,然后使用 G-N 或L-M 计算增量,迭代求解
分类
P 是一个已知位置的空间点,它是怎么来的呢?
相比于特征点法,直接法完全依靠优化来求解相机位姿。像素梯度引导着优化的方向。如果我们想要得到正确的优化结果,就必须保证大部分像素梯度能够把优化引导到正确的方向。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。