ORB:Orinted FAST+Rotated BRIEF
顾名思义:ORB特征是基于FAST特征的一个改进算法,它改进了FAST检测子不具有方向性的问题,在FAST特征提取的基础上加入了特征点的主方向。从而为后续的BRIEF描述子增添旋转不变的特征,同时构建图像金字塔实现尺度不变性。这样一来,图像帧与帧之间的特征匹配就变得容易许多,减少了特征点丢失,不匹配或误匹配的现象。
ORB特征提取采用速度极快的二进制描述子BRIEF,使得图像特征提取的速度大大提升。由原论文的测试数据可知(图1),每检测同一帧图像,ORB约要花费15.3ms,而SURF要花费217.3ms,SIFT特征提取则要花费5228.7ms,三者的差距是数量级的。因此基于其速度快的优势,ORB非常适合运用在如SLAM这样的实时系统。
ORB特征提取总体分为两个步骤:
提取思想:如果一个像素与邻域的像素灰度差别较大(过亮或过暗),那么它更可能是角点。
检测过程:
值得一提的是,图像中绝大多数像素点并不是角点,为了更高效的排除它们,我们可以添加一项预操作来优化检测算法。
具体操作为:对于每个像素,直接检测邻域圆上第1,5,9,13个像素点的灰度(如图2),只有当其中三个像素满足I_p+T或小于I_p-T时,当前像素才可能是一个角点。否则直接排除(这样一来对于每个像素的平均检测数便由6减少到了2)。
图二:
此外,原始的FAST角点经常出现扎堆现象,所以在第一遍检测之后,还需要用非极大值抑制(Non-maximal suppression,NMS),在一定区域内仅保留响应极大值的角点(这里具体细节到时候再细看),避免角点集中的问题。
BRIEF是一种二进制描述子,其N维描述向量仅由0和1组成,这里的0和1则描述了关键点周围随机选取的各像素对的灰度值的大小关系。
描述过程:
最后在进行特征匹配时,例如特征点A、B的描述子如下:
A: 10101011
B: 10101010
我们设定一个阈值,比如80%。当A和B的描述子的相似度大于90%时,我们判断A, B是相同的特征点,即这2个点匹配成功。在这个例子中A, B只有最后- -位不同,相似度为87.5%,大于80%。则A和B是匹配的。
我们将A和B进行异或操作就可以轻松计算出A和B的相似度。而异或操作可以借组硬件完成,具有很高的效率,加快了匹配的速度。
注:由于在计算比较的两个特征点的BRIEF特征点时,需要保持用同一组高斯随机点对(所以需要提前定义好,作为模板),所以假如图像发生旋转,BRIEF描述子就会改变,原来的特征点和旋转后的特征点就有极大可能匹配不上。因此说经典的BRIEF描述子不具备旋转不变性。
ORB通过构建图像金字塔,在金字塔每一层图像上进行特征点检测,这样一来便涵盖了不同尺度的特征点。
具体实现:
在ORB_SLAM2中,对原始图形(第0层)依次进行1/1.2缩放比例进行下采样得到共计8张图片(包括原始图像)然后分别对得到的图像进行特征提取,并记录特征所在金字塔的第几层,这样就得到一帧图像不同尺度的特征点:
在特征点匹配时,两幅不同尺度下的图像便可以通过匹配相近尺度图像金字塔的特征点来维持尺度不变性(仅个人理解),
参考博客:https://blog.csdn.net/RobotLife/article/details/87194017
灰度质心法(Intensity Centroid):
假设我们选取图2这样的图像块,我们可以把图像块当作是平面上质量分布不均的扁平物体,它的质量分布就对应图像块上每一像素的灰度值,所以灰度质心法本质上就是求解图像块”灰度重心”的过程。
求解过程(对于单通道图像):
1.在一小的图像块B中,定义图像块的矩m为:
I(x,y)为像素灰度值,
当p=1,q=0时,m10为图像块x方向的加权和,权重为对应像素的灰度值,
当p=0,q=1时,m01为图像块y方向的加权和,权重为对应像素的灰度值,
当p=0,q=0时,m00为图像块的权值之和。
2.通过矩,可以找到图像的灰度质心坐标:
个人理解:灰度质心公式可以理解为求数学期望,只不过期望的对象成了坐标:即
对于B内每一个像素来说:
概率P:
概率P就是当前像素的灰度值占B所有灰度值总和的几分之几,假如B内所有像素点的灰度值相等,则每个像素点的概率都相等,求得的灰度质心也变为图像块的形心。
3.连接图像块的几何中心O与质心C,得到一个方向向量OC,于是特征点的方向可以定义为
参考博客:https://blog.csdn.net/Edgar_U/article/details/78483505
在提取了Orinted FAST关键点后,我们对每个点计算其描述子,由于我们计算了关键点的主方向向量,因此在计算描述子的过程中,我们将主方向设为x轴正方向,将旋转后的图像通过坐标变换变换为与主方向坐标系一致,这样一来最初的关键点和旋转后的关键点便建在了相同的坐标系上。再通过原始的BRIEF描述,得到的BRIEF描述子便具有了旋转不变性。
坐标变换:
θ是主方向角,S表示随机点位置(2xn的矩阵),Sθ表示旋转后的随机点的位置(2xn的矩阵),x1=(u1,v1)是一个坐标向量,其余类同,Rθ为旋转矩阵。
参考https://mp.weixin.qq.com/s/u5gSCwQ3XahF0fe19biAyQ
参考https://blog.csdn.net/gaotihong/article/details/78712017
前面提到FAST特征对角点数目的优化,ORB算法在这方面也做了改进:即指定要提取的角点数量N,对原始FAST角点分别计算Harris响应值,然后选取N个具有最大响应值的角点作为最终的角点集合,若图像中的特征点不足N个,则将响应值降低为原来的1/2。
具体操作:
此外,为了方便接下来的特征点匹配,ORB还将每帧图像分为64*48个格子,匹配时只需取出对应格子的关键点和描述子即可,缩小搜索范围,避免遍历整张图像。
·SearchForInitialization
·SearchByBow
(2种)
·SearchByProjection
(4种)
·SearchForTriangulation
·Fuse
(2种)
·SearchBySim3
会用到特征匹配的部分:
Initial Pose Estimation(初始位姿估计)
Relocalisation(重定位)
Track Local Map(局部地图跟踪)
New Points Creation(特征点构建)
Compute Sim3(计算相似矩阵)
Loop Fusion(地图点的回环融合)
初始化的特征匹配:利用初始化的ORB匹配点来初始化地图:
·Tracking->MonocularInitialization
·寻找ORB匹配点,利用匹配点初始化地图
·设图像size(1920,1080),取宽高的1/8:
设上一帧有一特征点p,如何在当前帧匹配这一特征点呢?
p
所在上一帧的坐标对应到当前帧,即p
在当前帧为p’
p’
为中心的100*100区域寻找匹配点,计算p
与区域内特征点的汉明距离(Hamming distance)注:
5. 匹配点要大于100个才能进行初始化
2. 初始化的匹配过程仅在金字塔第0层(原始图像)搜索特征点进行匹配
3. 剔除那些在所选格子内但不属于搜索范围内的点
4. 最优距离要小于50,计算最优和次优距离的比值(假设最优距离是30,次优距离是40,如果他们的比值小于给定的某个阈值,则最优距离的特征点便认为具有高区分度)。
匹配完成后如何计算特征点的主方向?
由于初始化过程中有太多的未知量,上述SearchForInitialization的匹配策略便是最优的,但当我们提取并匹配了帧与帧之间的特征点后,在接下来的帧与帧之间,如何利用初始化的参数提高匹配效率便成了关键:
·Tracking->TrackWithModel(跟踪模型1)
·根据匀速模型计算初始位姿,然后通过投影的方式搜索匹配点
匀速模型:
基于初始化或前一帧的位姿参数(通过上一帧与上上帧图像的位姿变换,我们可以计算出变换参数T
),我们假设相机的运动是匀速的(帧与帧之间的时间间隔极小),则有当前帧与上一帧的位姿变换T’
=T
,这样我们便通过参数T
将上一帧的特征点投影到当前帧,并在投影点的小范围内进行特征点匹配(跟踪),匹配过程和初始化一样。
·Tracking->TrackReferenceKeyFrame(跟踪模型2)/Relocalization
·在不知道位姿变换(缺少T)的情况下通过特征向量寻找匹配点(同样适用于跟丢后的重定位)
推荐参考:
https://mp.weixin.qq.com/s/r5bSPRSWBcOqi8LYPC6XyQ
https://blog.csdn.net/lwx309025167/article/details/80524020
·Tracking->Relocalization(重定位)
·利用EPnP(Efficient Perspective-n-Point)计算位姿然后进行位姿优化(motion-only BA),如果内点不足则通过投影(TrackWithMode)的方式搜索更多匹配点。
·Tracking->TrackLocalMap->SearchLocalPoints
·搜索局部地图点,不包含前面三个步骤匹配过的地图点
搜索当前帧的共视图(Covisibility Graph),将局部地图上的特征点投影到当前帧,从而进一步搜索更多的先前丢失的匹配点:
·LocalMapping->Run->CreateNewMapPoint
·在跟踪线程中没有跟踪到的特征点在参考关键帧中搜索匹配点,进行三角测量(Triangulation)
·LocalMapping->Run->SearchInNeighbors
·处理最近一个关键帧时,要对先前产生的重复特征点进行融合
·LoopClosing->Run->ComputeSim3
·搜索匹配点计算相似矩阵Sim3
·LoopClosing->Run->ComputeSim3
·通过Sim3进一步搜索匹配点(投影到当前帧),进一步对Sim3进行优化
·LoopClosing->Run->ComputeSim3
将回环关键帧的共视关键帧地图点投影到回环关键帧中搜索匹配点如果匹配点足够,说明找到回环了。
·LoopClosing->Run->CorrectLoop->SearchAndFuse
·通过Sim3把共视关键帧的位姿矫正过来,并将矫正后的地图点融合
由于博主水平有限,一些细节一时无法完全解析,博主将再今后的学习总结中逐步完善。
ORB源码待分析完成后献上!!!
【详解】ORB特征提取与匹配
高翔《视觉SLAM十四讲》