ORB Feature

前言

ORB-SLAM系列的工作都是在ORB特征点上建立的,本身截止到目前2021-7-11,ORB paper 引用量高达8300+;

本文总结ORB特征点的基本原理、流程、在ORB-SLAM上的流程以及它和其他特征点对比的表现。

基本原理

Note:一般认为特征点包括关键点描述子,比如下面的FAST角点就是关键点的一种(但并不是所有的关键点都是角点,比如SIFT就不是角点)

通常情况下,图像上的点可以分为:平坦的点、边缘上的点、角点

概述

ORB:Oriented FAST and Rotated BRIEF

从ORB的全称可以看到,ORB特征点本身基于FAST角点和BRIEF描述子;并且改进了FAST角点,使其具有一定的尺度不变性;改进了BRIEF,使其具有旋转不变性。

关键点的作用是 确定这个点的位置,即图像坐标;

描述子的作用是 如何唯一(算法上是不可能唯一的)标识这个关键点;

关键点和描述子组成的特征点能确定点的位置和信息(标识),经常用在image match上;

下面先分开聊一下FAST和BRIEF,再说ORB;

FAST角点

概述

FAST(Features from Accelerated Segment Test)是2006年提出的,优点是计算速度快,具有较高的精确度

角点本身的定义是:两条直线的交叉;

考虑到算法的实际检测效果以及实际图像上的点和像素的对应情况(一条线在实际像素上并不是直的,而且暂用很多像素);

作者Rosten的想法是:若某像素点与其周围领域内足够多的像素点处于不同的区域,则该像素点可能为角点。也就是某些属性与众不同,考虑灰度图像,即若该点的灰度值比其周围领域内足够多的像素点的灰度值大或者小,则该点可能为角点;

以上即为FAST角点的定义。

算法流程

流程:

  • 从图像中选取一个像素 **P **,下面我们将判断它是不是一个特征点。我们首先把它的灰度值为 lp ;

  • 设定一个合适的阈值 t (比如 lp 的20%);

  • 以该像素点为中心的一个半径等于3像素的离散化的像素圆,这个圆的边界上有16个像素;

  • 如果像的圆上有n个连续的像素点,他们的像素值要么都比 lp+ t大,要么都比 **lp**− t小,那么他就是一个角点。n的值可以设置为12或者9,实验证明选择9可能会有更好的效果;

  • 用这种方法遍历图像上的所有点;

Note:对于图像边缘提取不了16的点的地方,实际算法其实是直接舍弃了这些不能判断的点;

目前Opencv中已经有集成的FAST角点提取函数:FastFeatureDetector();

总结

FAST角点总结如下:

优点:

  • 速度快;

缺点:

  • 不具尺度不变性(图像缩放会影响一个点是否能提取到);
  • 当 n<12 时它不会丢弃很多候选点 (获得的候选点比较多);
  • 像素的选取不是最优的,因为它的效果取决与要解决的问题和角点 的分布情况;
  • 高速运动的图像(发生模糊)效果非常差;
  • 检测到的很多特征点都是连在一起的(这个可以用非极大值抑制方法解决);

BRIEF描述子

概述

前面有说到,描述子的作用在于利用关键点周围像素信息,从而使该关键点有较高的标识性(理想情况下肯定是唯一,但是不是做不到嘛);

Brief: Binary robust independent elementary features

BRIEF算法的核心思想:在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果(0和1)组合起来作为描述子。BRIEF最后输出的是二进制的描述符;

算法流程

流程:

  • 为减少噪声干扰,先对图像进行高斯滤波(方差为2,高斯窗口为9x9);

  • 以特征点为中心,取SxS的邻域窗口;

  • 在这个像素窗口中按照一定的pattern选取N对随机点,(按照最后所需的数据位确定N,比如要做256位((OpenCV中用32个字节存储256对))的描述子,应该选取512个点,随机选择两个并记录下来,然后从剩下的510个点中随机选两个并记录下来);

  • 对于任意一对点,比较这两者像素的大小(x>y赋0,?其实都可以),形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子。

  • 关于pattern的选择:实验证明:这些点服从均值为0,方差为S²/25的二维高斯分布 效果最好(图2);为了保持踩点固定,工程上采用特殊设计的固定的pattern来做;

关于匹配是用汉明距离判断的(二元描述符的相似性可以通过汉明距离来衡量):

  • 两个特征编码对应bit位上相同元素的个数小于128的,一定不是配对的;
  • 一幅图像上特征点与另一幅图上特征编码对应bit位上相同元素的个数最多的特征点配成一对;

关于pattern:

  • 算法里的高斯分布是指什么:二维高斯分布是指在二维图像平面的;
  • 固定pattern的取点:取点是按照位置来的(以当前关键点为坐标系原点);

总结

优点:

  • 使用相对较少的比特,高度区分;
  • 构建和匹配都非常快;
  • 识别性能好;
  • 描述符有多种bit选择,简短的描述符可以加快匹配、减少内存消耗;
  • 算法简单而且计算复杂度低,计算速度很快;

缺点:

  • 不具有旋转不变性;
  • 不具备尺度不变性;
  • 对噪声敏感;

Note:

  • BRIEF在关键点周围需要31*31的点,那些不能计算描述子的点就直接不要(并且在特征金字塔上层的图像,本身面积就小也要去除这些点):这样看来BRIEF描述子去掉了很多的图像边缘信息

  • 边缘点丢弃不计算描述子

ORB

以下内容为ORB特征点算法本身内容,参考资料[1];

ORB采用了FAST角点作为关键点,以及BRIEF描述子,但是应用在Image match上其,FAST特征点判断是利用了圆的特征16个点判断,所以其具有旋转不变性,但是如果像素缩放,FAST提取的点还是不一样;BRIEF原文 在一个正方形提取点,本身不具有旋转不变性和尺度不变性;所以如果直接用FAST和BRIEF组合,其特征点方法旋转不变性和尺度不变性都会比较差;

以下是ORB对于这些问题的改进;

尺度不变性

FAST不具有尺度不变性,使用特征金字塔(缩放,即降采样)的方法让其具有一定的尺度不变性;

原理大致如下:在金字塔每一层检测角点,在对于同一图像进行尺度缩放的时候,较小的图像就可以看作远处看到的图像。在特征匹配算法中,我们可以匹配不同层上的图像,从而实现尺度不变性。例如,当相机倒退的时候,我们就可以再上一个位姿处的相机的金字塔上层找到与当前位姿金字塔下层的匹配图像。

具体流程如下:

  • 设置一个比例因子scaleFactor(通常取1.2)

  • 设置一个金字塔的层数nlevels(通常取8):

  • 将原图像按比例因子缩小成nlevels幅图像;

  • nlevels幅不同比例的图像提取特征点总和作为这幅图像的FAST特征点;

**按道理说:缩放的图如果本身相对于原图就是缩小了的,再用特征金字塔缩放,岂不是效果更差?**不是这样的,特征点之间可以在两幅图像上不同金字塔层之间匹配。

旋转不变性

BRIEF描述子不具备旋转不变性,因为BRIEF本身是通过正方形取pattern;这里使用灰度质心法解决这个问题;

ORB这里使用了圆的区域取点,这样就解决了这个问题;具体做法就是:以特征点和取点区域的质心的连线为X轴建立2维坐标系;

灰度质心计算方法:

Note:Pattern具有尺度不变性吗:是的,这里关于尺度不变性统一用特征金字塔解决,对于特征金字塔每层的特征点都计算描述子;

流程

一般流程
在ORB-SLAM中的具体流程

Note:这里参考的是ORB-SLAM2的代码;

1、构造金字塔:每一层分配特征点,层数越高,面积越小,分配的特征点就越少;

2、提取FAST角点:这里检测用了小技巧(首先检测12点、3点、6点和9点钟的像素);以及非极大值抑制;

3、使用四叉树均匀分布特征点(ORB里面独家添加的方法):效果参考[6],效果证明可以提高精度;

4、利用灰度质心法,计算旋转角度:圆的半径取为15,因为整个patch一般取的是31×31的

5、计算旋转后的BRIEF描述子:选择一个31×31的块

ORB Feature的表现

ORB特征:

  • 一定的尺度不变性:利用图像金子塔实现,由于金字塔层数有限,因此只能在一定范围保证尺度的不变性
  • 旋转不变性:首先利用灰度质心法计算出特征的方向,然后计算旋转后的BRIEF描述子。
  • 抗噪能力:计算BRIEF的时候不是使用一个点的灰度,而是使用了点周围5×5区域的灰度。
  • 应该也有一定的光照不变性:因为FAST提取的时候是比较灰度,rBRIEF的计算也是比较灰度。
  • 速度快:使用了FAST角点,BRIEF描述子,二者均很快。速度是SIFT的100倍,SURF的10倍。

ORB其实是效率精度的一种中间选择;

Reference

[1]、ORB: an efficient alternative to SIFT or SURF (ICCV 2011)

[2]、https://www.cnblogs.com/eilearn/p/9403878.html

[3]、BRIEF: Binary Robust Independent Elementary Features (ECCV 2010)

[4]、https://www.cnblogs.com/wyuzl/p/7838103.html

[5]、https://www.zhihu.com/search?type=content&q=BRIEF%E6%8F%8F%E8%BF%B0%E5%AD%90

[3]、BRIEF: Binary Robust Independent Elementary Features (ECCV 2010)

[4]、https://www.cnblogs.com/wyuzl/p/7838103.html

[5]、https://www.zhihu.com/search?type=content&q=BRIEF%E6%8F%8F%E8%BF%B0%E5%AD%90

[6]、https://zhuanlan.zhihu.com/p/57235987

ORB Feature相关推荐

  1. OpenCV-Python Feature2D 特征点检测(含SIFT/SURF/ORB/KAZE/FAST/BRISK/AKAZE)

    对于OpenCV-Python,OpenCV2.x和OpenCV3.x的函数使用方式有很大不同.网上很多教程都还是基于OpenCV2.x,此版本已经逐渐被弃用. 本教程针对特征点检测,分析OpenCV ...

  2. OpenCV-Python Feature2D 特征点检测(含ORB/KAZE/FAST/BRISK/AKAZE)

    代码在git link Open3.x-Python 特征点检测方法 对于OpenCV3.x-Python,特征点检测及显示方法如下: 下面就重点介绍OpenCV3.x-Python中的各种特征点检测 ...

  3. ORB+GMS、FREAK+GMS、BRISK+GMS、AKAZE+GMS特征点结合使用方法

    关于ORB.FREAK.BRISK.AKAZE的具体原理参考原文,最近没时间翻译,后续会花时间把原文翻译放在博客里面.这些特征点提取方法都可以在opencv里面调用函数实现. 特征点提取与匹配原文论文 ...

  4. ORB/BRISK/AKAZE特征点提取、特征匹配的性能比较

    写在前面 局部特征相关算法在过去二十年期间风靡一时,其中代表的有SIFT.SURF算法等(广泛应用于目标检测.识别.匹配定位中),这两种算法是用金字塔策略构建高斯尺度空间(SURF算法采用框滤波来近似 ...

  5. (一次性搞定)ORB_SLAM2地图保存与加载

    (一次性搞定)ORB_SLAM2地图保存与加载 本文记录了ORB_SLAM2中地图保存与加载的过程. 参考博客: https://blog.csdn.net/qq_34254510/article/d ...

  6. 纹理对象的实时姿态估计

    如今,增强现实技术是计算机视觉和机器人领域的热门研究课题之一.The most elemental problem in augmented reality is the estimation of ...

  7. ORB-SLAM2 地图加载2

    补充SystemSetting和InitKeyFrame两个类的代码.实际上,由于是通过SystemSetting来读取的相机内参以及ORB特征参数,所以就可以将Tracking.cc中关于读取内参的 ...

  8. skimage 学习第二天:ski官网示例程序总结(1)

    skimage官网的示例.总结一下,作为以后研究的基础. http://scikit-image.org/docs/stable/auto_examples/index.html#examples-g ...

  9. Visual SLAM笔记

    本文转自https://blog.csdn.net/mulinb/article/details/53421864,如有需要请查看原博主. https://blog.csdn.net/MulinB/a ...

最新文章

  1. 注意:阿里Druid连接池监控的两个坑
  2. onedrive目录PHP源码,另一个OneDrive目录索引应用 OLAINDEX
  3. mappingResources、mappingLocations、mappingDirectoryLocations、mappingJarLocations配置映射文件时的区别
  4. 如何判断真假“中台”?
  5. android 拼图小游戏
  6. 为什么会存在乱码?什么是编解码?为什么会有这么多字符集?
  7. 如何在水经注会员中心购买流量下载地图
  8. flutter框架优缺点,flutter开发的app有哪些
  9. 计算机网络管理员路由与交换深圳积多少分,2020年深圳积分入户,哪些加分的证书总结?...
  10. 网站刷IP?活不过三秒
  11. Spring bean销毁的过程
  12. 如何在word文档里复选框里打勾?
  13. 一周肝出Linux之远程服务详解(ssh远程登录、scp远程复制、sftp安全下载、TCP Wrappers访问控制)
  14. 阅读开源Python脚本学习笔记1,之python异常
  15. 算法(Java实现)-算法的时间复杂度和空间复杂度
  16. 利用IntelliJ IDEA与Maven开始你的Scala之旅
  17. 深受程序员鄙视的外行语录!
  18. AMCL 激光测量模型
  19. 一个简单仓库管理系统的设计与实现--需求篇
  20. Python软件编程等级考试一级——20210905

热门文章

  1. 龙芯3号_龙芯3号首次成功移植Deepin深度系统!
  2. 【总结】1415- 如何在繁重的工作中持续成长?
  3. WINDOWS无法配置此无线连接,如果您已经启用其他程序管理此无线连接,
  4. Bootstrap框架常用组件
  5. 各种ADSL猫的密码
  6. html人头小图标,echart 人头
  7. stm32学习(二)STM32F103ZET6内部资源讲解
  8. Bootstrapping算法
  9. Process的waitFor死锁问题以及解决方案
  10. TCP拥塞控制(CC),让我不得开心颜