FAST关键点
选取像素p,假设它的亮度为Ip; .
设置一个阈值T(比如Ip的20%);
以像素p为中心,选取半径为3的圆上的16个像素点;
假如选取的圆上,有连续的N个点的亮度大于Ip+T或小于Ip-T,那么像素p可以被认为是特征点;
循环以上4步,对每一个像素执行相同操作。
FAST 描述子
论文:BRIEF: Binary Robust Independent Elementary Features
BRIEF算法的核心思想是在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果组合起来作为描述子。为了保持踩点固定,工 程上采用特殊设计的固定的pattern来做
灰度质心法
原始的FAST关键点没有方向信息,这样当图像发生旋转后,brief描述子也会发生变化,使得特征点对旋转不鲁棒
解决方法:orientated FAST
使用灰度质心法计算特征点的方向,
什么是灰度质心法?
下面重点说一下如何计算灰度质心。
以上是灰度质心法求关键点旋转角度的原理。
在一个圆内计算灰度质心
下图P为几何中心,Q为灰度质心
思考:为什么是圆?不是正方形?
ORBSLAM里面是先旋转坐标再从图像中采点提取,并不是先取那块图像再旋转,见computeOrbDescriptor函数里的这个表达式
#define GET_VALUE(idx) \ center[cvRound(pattern[idx].xb + pattern[idx].ya)step + \ //y'step cvRound(pattern[idx].xa -
pattern[idx].yb)]
会导致下方采集点的时候绿色和黄色部分就是不同的像素
下面求圆内的坐标范围
umax:1/4圆的每一行的u轴坐标边界(下图中橙色线段FG)
vmax = cvFloor(HALF_PATCH_SIZE * sqrt(2 .f) / 2 + 1) ; vmin = cvCeil(HALF_PATCH_SIZE * sqrt(2 .f) / 2) ;
// 对应从D到B的红色弧线,umax坐标从D到C for (v = 0 ; v <= vmax; ++v)
umax[v] = cvRound(sqrt(hp2 - v * v)) ;
// 对应从B到E的蓝色弧线,umax坐标从C到A
for (v = HALF_PATCH_SIZE , v0 = 0 ; v >= vmin ; --v) {
while (umax[v0] == umax[v0 + 1]) ++v0 ;
umax[v] = v0 ;
++v0 ;
}
参考:
认真的虎ORBSLAM2源码解读(四):图解ORB特征提取ORBextractor_orbextractor 提取特征-CSDN博客
https://www.cnblogs.com/wall-e2/p/8057448.html
特征点角度计算
steer brief
点v 绕 原点旋转θ 角,得到点v’,假设 v点的坐标是(x, y) ,那么可以推导得到 v’点的坐标(x’, y’)
参考:
https://www.cnblogs.com/zhoug2020/p/7842808.html
IC_Angle 计算技巧
在一个圆域中算出m10(x坐标)和m01(y坐标),计算步骤是先算出中间红线的m10,然后在平行于x轴算出m10和m01 ,一次计算相当 于图像中的同个颜色的两个line。
为什么要重载小括号运算符 operator() ?
可以用于仿函数(一个可以实现函数功能的对象)
仿函数(functor)又称为函数对象(function object)是一个能行使函数功能的类。仿函数的语法几乎和我们普通的函数调用一样,不过作 为仿函数的类,都必须重载operator()运算符
1.仿函数可有拥有自己的数据成员和成员变量,这意味着这意味着仿函数拥有状态。这在一般函数中是不可能的。 2.仿函数通常比一般函数有更好的速度。
扩展阅读
C++operator()(重载小括号运算符)_c++的bool operator()-CSDN博客
金字塔的计算
图像金字塔对应函数为:ORBextractor::ComputePyramid
特征点数量的分配计算
参考:https://zhuanlan.zhihu.com/p/61738607
使用四叉树均匀分布特征点
ORB特征提取策略对ORB-SLAM2性能的影响:ORB-SLAM2中的ORB特征提取方法相对于OpenCV中的方法,提高了ORB-SLAM2的轨迹精 度和鲁棒性。增加特征提取的均匀性可以提高系统精度,但是似乎会降低特征提取的重复性。
参见:https://zhuanlan.zhihu.com/p/57235987 对应函数 DistributeOctTree
. 如果图片的宽度比较宽,就先把分成左右w/h份。一般的640×480的图像开始的时候只有一个node。
. 如果node里面的点数>1,把每个node分成四个node,如果node里面的特征点为空,就不要了,删掉。 . 新分的node的点数>1,就再分裂成4个node。如此,一直分裂。
. 终止条件为:node的总数量> [公式] ,或者无法再进行分裂。 . 然后从每个node里面选择一个质量最好的FAST点。
参考:https://zhuanlan.zhihu.com/p/61738607 ExtractorNode::DivideNode
高斯处理
特征点去畸变
近点和远点
在双目或RGB-D模式下,特征点对应的深度值小于40倍的双目/RGB-D基线称之为近点,否则称之为远点。 近点特征点对三角化得到的三维点坐标比较准确,可以提供旋转、平移、尺度信息。
远点特征点仅能够提供相对准确的旋转信息,无法提供比较准确的尺度和平移信息。只有当多个视角下多次观测到的远点我们才会考虑三角 化。