特征点的检测

图像的特征点可以简单的理解为图像中比较显著的点,如轮廓点,较暗区域中的亮点,较亮区域中的暗点等。

原图

轮廓线(可能的特征点)

ORB采用FAST(features from accelerated segment test)算法来检测特征点。FAST核心思想就是找出那些卓尔不群的点,即拿一个点跟它周围的点比较,如果它和其中大部分的点都不一样就可以认为它是一个特征点。

FAST特征点检测

备注:每个小方格代表一个像素,方格内的颜色只是为了便于区分,不代表该像素点的颜色。

FAST具体计算过程:

  1. 从图片中选取一个像素点P,下面我们将判断它是否是一个特征点。我们首先把它的密度(即灰度值)设为Ip。
  2. 设定一个合适的阙值t :当2个点的灰度值之差的绝对值大于t时,我们认为这2个点不相同。
  3. 考虑该像素点周围的16个像素。(见上图)
  4. 现在如果这16个点中有连续的n个点都和P点不同,那么它就是一个角点。 这里n设定为12。
  5. 【个人认为作者这个方法有问题】我们现在提出一个高效的,来快速排除一大部分非特征点的点。该测试仅仅检查在位置1、9、5和13四个位置的像素(首先检查1和9,看它们是否和P点相同。如果是,再检查5和13)。如果是一个角点,那么上述四个像素点中至少有3个应该和P点相同。如果都不满足,那么不可能是一个角点。

图中红色的点为使用FAST算法找到的特征点。

特征点的描述

2.1计算特征描述子

得到特征点后我们需要以某种方式描述这些特征点的属性。这些属性的输出我们称之为该特征点的描述子(Feature Descritors).ORB采用BRIEF算法来计算一个特征点的描述子。BRIEF算法的核心思想是在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果组合起来作为描述子。

选取N个点对

BRIEF的具体步骤

1.以关键点P为圆心,以d为半径做圆O。

2.在圆O内某一模式选取N个点对。这里为方便说明,N=4,实际应用中N可以取512.

假设当前选取的4个点对如上图所示分别标记为:

3.定义操作T

4.分别对已选取的点对进行T操作,将得到的结果进行组合。

假如:

则最终的描述子为:1011

2.2理想的特征点描述子应该具备的属性

在现实生活中,我们从不同的距离,不同的方向、角度,不同的光照条件下观察一个物体时,物体的大小,形状,明暗都会有所不同。但我们的大脑依然可以判断它是同一件物体。理想的特征描述子应该具备这些性质。即,在大小、方向、明暗不同的图像中,同一特征点应具有足够相似的描述子,称之为描述子的可复现性(鲁棒性)。

当以某种理想的方式分别计算上图中红色点的描述子时,应该得出同样的结果。即描述子应该对光照(亮度)不敏感,具备尺度一致性(大小 ),旋转一致性(角度)等。

上面我们用BRIEF算法得到的描述子并不具备以上这些性质。因此我们得想办法改进我们的算法。ORB并没有解决尺度一致性问题,在OpenCV的ORB实现中采用了图像金字塔来改善这方面的性能。ORB主要解决BRIEF描述子不具备旋转不变性的问题。

回顾一下BRIEF描述子的计算过程:在当前关键点P周围以一定模式选取N个点对,组合这N个点对的T操作的结果就为最终的描述子。当我们选取点对的时候,是以当前关键点为原点,以水平方向为X轴,以垂直方向为Y轴建立坐标系。当图片发生旋转时,坐标系不变,同样的取点模式取出来的点却不一样,计算得到的描述子也不一样,这是不符合我们要求的。因此我们需要重新建立坐标系,使新的坐标系可以跟随图片的旋转而旋转。这样我们以相同的取点模式取出来的点将具有一致性。

打个比方,我有一个印章,上面刻着一些直线。用这个印章在一张图片上盖一个章子,图片上分处直线2头的点将被取出来。印章不变动的情况下,转动下图片,再盖一个章子,但这次取出来的点对就和之前的不一样。为了使两次取出来的点一样,我需要将章子也旋转同一个角度再盖章。(取点模式可以认为是章子上直线的分布情况)

ORB在计算BRIEF描述子时建立的坐标系是以关键点为圆心,以关键点和取点区域的质心的连线为X轴建立二维坐标系。

在图1中,P为关键点。圆内为取点区域,每个小格子代表一个像素。现在我们把这块圆心区域看做一块木板,木板上每个点的质量等于其对应的像素值。根据积分学的知识我们可以求出这个密度不均匀木板的质心Q。计算公式如下。其中R为圆的半径。

我们知道圆心是固定的而且随着物体的旋转而旋转。当我们以PQ作为坐标轴时(图2),在不同的旋转角度下,我们以同一取点模式取出来的点是一致的。这就解决了旋转一致性的问题。

特征点的匹配

ORB算法最大的特点就是计算速度快 。 这首先得益于使用FAST检测特征点,FAST的检测速度正如它的名字一样是出了名的快。再次是使用BRIEF算法计算描述子,该描述子特有的二进制串的表现形式不仅节约了存储空间,而且大大缩短了匹配的时间。

例如特征点A、B的描述子如下。

A:10101011

B:10101010

我们设定一个阈值,比如80%。当A和B的描述子的相似度大于90%时,我们判断A,B是相同的特征点,即这2个点匹配成功。在这个例子中A,B只有最后一位不同,相似度为87.5%,大于80%。则A和B是匹配的。

我们将A和B进行异或操作就可以轻松计算出A和B的相似度。而异或操作可以借组硬件完成,具有很高的效率,加快了匹配的速度。

特征点的匹配

总结

本文只对ORB算法核心思想做一个解读。在具体的实现中还涉及到很多的细节及优化问题。了解更多的细节请参考下面一些资料。
http://download.csdn.NET/detail/yang843061497/7785917
http://www.cvchina.info/2011/07/04/whats-orb/ 
http://blog.sina.com.cn/s/blog_916b71bb0100w9al.html

作者:潘凌昀
链接:https://www.jianshu.com/p/9ee6b2145eaa
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

ORB特征原理(浅显易懂)相关推荐

  1. ORB特征描述原理、python实现及基于opencv实现

    写在前面: 黄宁然,看你看过的算法系列*,不如,就到此吧. 参考文献镇楼: [1]汪洋,扫地机器人定位算法设计与嵌入式系统实现 [2]王雯涛,ORB图像特征提取算法的FPGA设计与实现 [3]房亮,基 ...

  2. VSLAM系列原创04讲 | 四叉树实现ORB特征点均匀化分布:原理+代码

    本文系ORB-SLAM2原理+代码实战系列原创文章,对应的视频课程见: 如何真正搞透视觉SLAM? 大家好,从今天开始我们陆续更新ORB-SLAM2/3系列的原创文章,以小白和师兄对话的形式阐述背景原 ...

  3. ORB-SLAM中的ORB特征(提取)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:小葡萄 https://zhuanlan.zhihu.com/p/61738607 本文仅做学术 ...

  4. opencv上gpu版surf特征点与orb特征点提取及匹配实例

    opencv上gpu版surf特征点与orb特征点提取及匹配实例 标签: gpu版surfgpu orbsurf和orbgpu surf及orbsurf orb gpu 2016-09-25 23:4 ...

  5. ORB特征点提取与均匀化——ORBSLAM2源码讲解(一)

    文章目录 前言 一.基础知识 二.ORB特征均匀化策略对性能的影响 三.ORB特征金字塔 四.ORB提取扩展图像 五.ORB特征均匀化 总结 前言 本博客结合哔哩大学视频ORBSLAM2[ORBSLA ...

  6. ORB2单目读代码笔记5--利用灰度质心计算ORB特征点方向,实现旋转不变性

    5.利用灰度质心计算ORB特征点方向,实现旋转不变性 ComputeKeyPointOctTree 跳转 computeOrientation computeOrientation 跳转 IC_Ang ...

  7. java opencv orb_OpenCV提取ORB特征并匹配

    一.什么是特征? 图像的特征(Feature),是图像上最具代表性的一些点.所谓最具代表性,就是说这些点包含了图像表述的大部分信息.即使旋转.缩放,甚至调整图像的亮度,这些点仍然稳定地存在,不会丢失. ...

  8. ORB特征均匀提取策略对性能的提升有多大?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:计算机视觉life 在ORB-SLAM(2)的论文中,作 ...

  9. ORB算法原理解读【不错】

    ORB算法原理解读        这篇写得很好 ORB特征提取.匹配及位置估计   里面对匹配的讲解比较好 两个不同二进制之间的汉明距离指的是两个二进制串不同位的个数.两个二进制不同位的个数是越少越好 ...

最新文章

  1. teamviewer 可用设备上限_2020推荐香河气压罐专业供水设备
  2. 继承 WebMvcConfigurationSupport类后无法访问Swagger页面问题
  3. js整理 03-18
  4. Linux中Redis的安装
  5. 使用dumpbin查看dll有哪些函数
  6. 故障恢复 stm32_77条STM32知识,千万不能错过!干货
  7. 基于auto.js的网课自动签到软件以及facerig控制摄像头内容及auto.js新手教学
  8. 连续型随机变量单点概率为0以及不可能事件
  9. 浅谈常见浏览器缓存方法(前端缓存)
  10. arnold ass standin 代理模型批量查询 与替换工具发布1.0
  11. Go语言的流程结构简单介绍
  12. 靶机渗透----bulldog2
  13. 3月27日下午上完毛概后是一节体育课,这学期要考篮球和跳绳
  14. 源码免杀教程 源码免杀思路详解
  15. Qt编写可视化大屏电子看板系统8-调整间距
  16. python自动填写腾讯文档_腾讯文档自动填充工具(工具),填写
  17. 微信小程序中进行公共数据的存储使用
  18. 输出1-100之内的所有质数
  19. bootstrap table 中自定义样式 隐藏一列,能够同过jQuery获取隐藏列
  20. sourceforge镜像站

热门文章

  1. 前端之css引入方式/长度及颜色单位/常用样式
  2. Android初学第36天
  3. PyTorch 笔记(18)— torch.optim 优化器的使用
  4. 如何让图片开口说话 3DMeNow教程
  5. PCB的EMC设计之PCB叠层结构
  6. Android WebView使用与JavaScript使用
  7. 乌鲁木齐网络赛J题(最小费用最大流模板)
  8. 手写java_手写JAVA虚拟机(二)——实现java命令行
  9. 如何提高服务器响应的数据速度_如何提高攻牙速度
  10. java编程游戏飞机旋转问题_用JAVA写的一个飞机游戏