文章目录
前言
欢迎浏览我的SLAM专栏,一起加油淦穿SLAM!
一、关键点和描述子
1.FAST关键点:
2.FAST 描述子:
论文:BRIEF: Binary Robust Independent Elementary Features
BRIEF算法的核心思想是在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果组合起来
作为描述子。为了保持踩点固定,工程上采用特殊设计的固定的pattern来做
二、 灰度质心法
原始的FAST关键点没有方向信息,这样当图像发生旋转后,brief描述子也会发生变化,使得特征点对旋
转不鲁棒
解决方法:orientated FAST
使用灰度质心法计算特征点的方向,
1.什么是灰度质心法?
下面重点说一下如何计算灰度质心。
- 我们定义该区域图像的矩为:
式中, 取0或者1; , 表示在像素坐标 处图像的灰度值; 表示图像的矩。 在半径为 的圆形图像区域,沿两个坐标轴 方向的图像矩分别为:
圆形区域内所有像素的灰度值总和为:
- 图像的质心为:
- 然后关键点的“主方向”就可以表示为从圆形图像形心 指向质心 的方向向量 ,于是关键 点的旋转角度记为
以上是灰度质心法求关键点旋转角度的原理。
2.在一个圆内计算灰度质心
下图P为几何中心,Q为灰度质心
下面求圆内的坐标范围
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;
}
参考:
https://blog.csdn.net/liu502617169/article/details/89423494
https://www.cnblogs.com/wall-e2/p/8057448.html
三、 特征点角度计算
1.steer brief
点v 绕 原点旋转θ 角,得到点v’,假设 v点的坐标是(x, y) ,那么可以推导得到 v’点的坐标(x’, y’)
参考:
https://www.cnblogs.com/zhoug2020/p/7842808.html
2.IC_Angle 计算技巧
在一个圆域中算出m10(x坐标)和m01(y坐标),计算步骤是先算出中间红线的m10,然后在平行于
x轴算出m10和m01,一次计算相当于图像中的同个颜色的两个line。
为什么要重载小括号运算符 operator() ?
可以用于仿函数(一个可以实现函数功能的对象)
仿函数(functor)又称为函数对象(function object)是一个能行使函数功能的类。仿函数的语法几乎
和我们普通的函数调用一样,不过作为仿函数的类,都必须重载operator()运算符
1.仿函数可有拥有自己的数据成员和成员变量,这意味着这意味着仿函数拥有状态。这在一般函数中是
不可能的。
2.仿函数通常比一般函数有更好的速度。
扩展阅读:
https://blog.csdn.net/jinzhu1911/article/details/101317367
四、金字塔的计算
图像金字塔对应函数为:ORBextractor::ComputePyramid
五、特征点数量的分配计算
图像金字塔层数越高,对应层数的图像分辨率越低,面积(高 宽)越小,所能提取到的特征点数量就
越少。所以分配策略就是根据图像的面积来定,将总特征点数目根据面积比例均摊到每层图像上。
我们假设需要提取的特征点数目为 ,金字塔总共有 层,第 0 层图像的宽为 ,高为 ,对应的面
积 ,图像金字塔缩放因子为 ,,在 ORB-SLAM2 中 。
那么整个金字塔总的图像面积是:
假设我们需要一千个特征点,我们需要把这一千个特征点分别分配到每一层上。
单位面积应该分配的特征点数量为:
在ORB-SLAM2 的代码里,不是按照面积均摊的,而是按照面积的开方来均摊特征点的,也就是将上述
公式中的 换成 即可。
参考:https://zhuanlan.zhihu.com/p/61738607
六、使用四叉树均匀分布特征点
ORB特征提取策略对ORB-SLAM2性能的影响:ORB-SLAM2中的ORB特征提取方法相对于OpenCV中的
方法,提高了ORB-SLAM2的轨迹精度和鲁棒性。增加特征提取的均匀性可以提高系统精度,但是似乎会
降低特征提取的重复性。
对应函数 DistributeOctTree:
- 如果图片的宽度比较宽,就先把分成左右w/h份。一般的640×480的图像开始的时候只有一个 node。
- 如果node里面的点数>1,把每个node分成四个node,如果node里面的特征点为空,就不要了, 删掉。
- 新分的node的点数>1,就再分裂成4个node。如此,一直分裂。
- 终止条件为:node的总数量> [公式] ,或者无法再进行分裂。
- 然后从每个node里面选择一个质量最好的FAST点
参见:https://zhuanlan.zhihu.com/p/57235987
ExtractorNode::DivideNode
节点分裂顺序:后加的先分裂
七、高斯处理
1.高斯模糊
高斯公式:
2.高斯模糊常用的高斯模板
中间权重最大:
八、特征点去畸变
去畸变效果:
九、近点和远点
在双目或RGB-D模式下,特征点对应的深度值小于40倍的双目/RGB-D基线称之为近点,否则称之为远点。
近点特征点对三角化得到的三维点坐标比较准确,可以提供旋转、平移、尺度信息。
远点特征点仅能够提供相对准确的旋转信息,无法提供比较准确的尺度和平移信息。只有当多个视角下多次观测到的远点我们才会考虑三角
化。