ORB算法与opencv实现
Posted 落樱弥城
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORB算法与opencv实现相关的知识,希望对你有一定的参考价值。
摘要:本文主要描述ORB算法原理以及opencv中ORB算法的实现。
关键字:ORB,FAST,BRIEF
ORB算法ICCV论文:ORB:an efficient alternative to sift or surf。
1 ORB算法简介
ORB(Oriented Fast and Rotated BRIEF)是一种快速局部特征点提取和快速计算局部特征点描述子算法。该算法分为两个部分:特征点提取和特征点描述子提取。其中特征掉提取是根据FAST改进而来的oFAST;而特征点描述子提取是根据BRIEF(Binary Robust IndependentElementary Feature)特征描述算法改进而来。
O R B = O r i e n t e d F a s t ( k e y p o i n t ) + R o t a t e d B R I E F ( d e s c r i p t o r ) ORB=Oriented\\quad Fast(keypoint)+Rotated\\quad BRIEF(descriptor) ORB=OrientedFast(keypoint)+RotatedBRIEF(descriptor)
2 算法原理
2.1 oFAST: FAST Keypoint Orientation
FAST
FAST算法计算性能比较好但是不具备尺度不变性,旋转不变性以及检测到的特征点没有旋转方向。oFAST正是针对这些缺点改进FAST而来。
FAST:Features from Accelerated Segment Test
FAST在进行特征点提取是根据当前点邻域内的点的差值作为特征点的筛选标准,它假定如果一个点与周围邻域内足够多的点的差值够大则认为是一个特征点:
- 选择像素 p p p,该像素的像素值为 I p I_p Ip,确定一个筛选的阈值 T T T(测试集参考值20%);
- 计算以像素
p
p
p为圆心3为半径确定16个像素点的灰度值和圆心
p
p
p的灰度值
I
p
I_p
Ip的差值,如果存在连续
n
n
n个点(算法的第一个版本的n取值为12)满足
I
x
−
I
p
>
∣
t
∣
I_x-I_p>|t|
Ix−Ip>∣t∣(
I
x
I_x
Ix表示以
p
p
p为圆心的点的灰度值,
t
t
t为根据
T
T
T计算出的偏移量),则认为点
p
p
p可以作为一个候选点,否则剔除;
- 对于16个点都计算差值时间复杂度过高,因此FAST采用即特征点过滤的方式:先判断圆上1,5,9,13号4个点中如果至少3个点满足特征点初选的要求在进行逐个计算,否则终止计算; - 遍历图像中每一个像素,重复上述操作,直到遍历结束;
上面的筛选方式是FAST初版的筛选方式,但是该方式有一些基本的缺陷:
- 邻域内点数量 n n n过小,容易导致筛选的点过多,降低计算效率;
- 筛选的点完全取决于图像中点的分布情况;
- 筛选出的点部分点集中在一起。
问题1,2可以通过机器学习的方式来解决,问题3通过极大值抑制解决。
机器学习的解决方式是针对应用场景训练一个决策树,利用该决策树进行筛选:
- 确定训练集;
- 对于训练集中每一张图像运行FAST算法筛选出图像中的特征点构成集合 P P P;
- 对于筛选出的每一个特征点,将其邻域内的16个像素存储为一个一维向量;
- 对于每一个一维的邻域向量中的像素值
I
p
→
x
,
x
∈
1
,
.
.
.
,
16
I_p\\rightarrow x,x\\in1,...,16
Ip→x,x∈1,...,16将其通过下面的规则映射到3中状态 darker than
I
p
I_p
Ip, brighter then
I
p
I_p
Ip或者和
I
p
I_p
Ip相似;
S p → x d , I p → x ≤ I p − t ( d a r k e r ) s , I p − t < I p → x < I p + t ( s i m i l a r ) b , I p + t ≤ I p → x ( b r i g h t e r ) \\beginequation S_p\\rightarrow x\\left\\ \\beginarrayll d,I_p\\rightarrow x&\\le I_p - t\\quad(darker)\\\\ s,I_p-t&\\lt I_p\\rightarrow x\\lt I_p+t\\quad(similar)\\\\ b,I_p+t&\\le I_p\\rightarrow x\\quad (brighter) \\endarray\\right. \\endequation Sp→x⎩ ⎨ ⎧d,Ip→xs,Ip−tb,Ip+t≤Ip−t(darker)<Ip→x<Ip+t(similar)≤Ip→x(brighter) - 对于给定的 x x x可以将集合 P P P分为三类 P d , P s , P b P_d,P_s,P_b Pd,Ps,Pb,即 P b = p ∈ P : S p → x = b P_b=\\p\\in P:S_p\\rightarrow x=b\\ Pb=p∈P:Sp→x=b;
- 定义一个布尔变量 K p K_p Kp,表示如果 p p p为角点则真,否则为假(由于有训练集所以GT我们都是已知的);
- 使用ID3决策树分类器以
K
p
K_p
Kp查询每个子集,以训练出正确特征点的分类器;
- 决策树使用熵最小化来逼近,类似交叉熵。
H ( P ) = ( c + c ‾ ) l o g 2 ( c + c ‾ ) − c l o g 2 c − c ‾ l o g 2 c ‾ c = ∣ p ∣ K p i s t r u e ∣ (角点数量) c ‾ = ∣ p ∣ K p i s f a l s e ∣ (非角点的数量) \\beginequation \\beginaligned H(P)&=(c+\\overlinec)log_2(c+\\overlinec)-clog_2c-\\overlineclog_2\\overlinec\\\\ c&=|\\p|K_p\\quad is\\quad true\\|(角点数量)\\\\ \\overlinec&=|\\p|K_p\\quad is\\quad false\\|(非角点的数量) \\endaligned \\endequation H(P)cc=(c+c)log2(c+c)−clog2c−clog2c=∣p∣K以上是关于ORB算法与opencv实现的主要内容,如果未能解决你的问题,请参考以下文章
- 决策树使用熵最小化来逼近,类似交叉熵。