ORB 特征点提取

FAST关键点

选取像素p,假设它的亮度为Ip   .  

设置一个阈值T(比如Ip20%);

以像素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)]

会导致下方采集点的时候绿色和黄色部分就是不同的像素

下面求圆内的坐标范围

umax1/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 计算技巧

在一个圆域中算出m10x坐标)和m01y坐标),计算步骤是先算出中间红线的m10,然后在平行于x轴算出m10m01 ,一次计算相当 于图像中的同个颜色的两个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,就再分裂成4node。如此,一直分裂。

.  终止条件为:node的总数量> [公式] ,或者无法再进行分裂。 .  然后从每个node里面选择一个质量最好的FAST点。

参考:https://zhuanlan.zhihu.com/p/61738607 ExtractorNode::DivideNode

高斯处理  

特征点去畸变

近点和远点

在双目或RGB-D模式下,特征点对应的深度值小于40倍的双目/RGB-D基线称之为近点,否则称之为远点。 近点特征点对三角化得到的三维点坐标比较准确,可以提供旋转、平移、尺度信息。

远点特征点仅能够提供相对准确的旋转信息,无法提供比较准确的尺度和平移信息。只有当多个视角下多次观测到的远点我们才会考虑三角 化。

  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江山如画,佳人北望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值