作者丨卢涛@知乎

来源丨https://zhuanlan.zhihu.com/p/355441452

编辑丨3D视觉工坊

非完整版注释:https://github.com/smilefacehh/ORB-SLAM3-Note

本文介绍ORB相关的一些概念,FAST特征点、BRIEF描述子、ORB如何改进得到旋转不变性,然后从工程实践上介绍金字塔图像每层特征分配数量如何计算、四叉树如何精简特征点。如果有理解上的错误,请您指正。

FAST特征点

FAST特征点,半径3,16个像素

提取流程:

1.以P为中心,选取半径为3的圆,共16个像素

2.判断1、9位置与P灰度差值(同正负)是否均超过阈值,如果没有,则不是角点

3.再判断1、9、5、13位置与P灰度差值(同正负)是否至少三个超过阈值,如果没有,则不是角点

4.设定阈值,如果超过连续9(或者12)个像素与P的灰度差值(分正负的)大于阈值,则认为P为角点

5.非极大值抑制。这一步是在提取了所有角点之后执行的,前面4步提取的角点会堆积,相邻的两个角点,删除灰度差值和(16个点与P的灰度差的和)更小的角点。

几种特征点的效率对比(来自网络)

特征点 SIFT SURF ORB FAST
单帧耗时(ms) 244 197 11 2.8

ORB-SLAM给出的时间统计,ORB提取单帧耗时11ms,基本能达到30fps。

ORB-SLAM耗时统计

BRIEF描述子

在特征点邻域随机选择(高斯分布)256对点坐标,比较点1与点2大小,小于取1,大于取0,构成256位二进制,即为描述子。通常用uchar*存储二进制描述子,16个字节,8位。

ORB(Oriented FAST and Rotated BRIEF)

这里给FAST、BRIEF都加上旋转不变性。解释一下旋转不变性,如果没有,那么图像旋转一下,同一个位置可能不是FAST点了,计算的BRIEF跟原来的也不一样了。

FAST特征点,蓝色为灰度质心,theta为角度

在特征点周围取半径15的圆形邻域,计算灰度质心,点到质心的连线与水平方向夹角记为该特征点的方向,存angle属性。灰度质心计算公式:

FAST特征点有了方向,BRIEF的方向就好办了,256对点的参考坐标系是水平向右x,竖直向上y,把这个参考系旋转一下,x正向与上面红色箭头对齐。然后计算BRIEF描述子(steered BRIEF)就可以了。这样即便图像旋转了,BRIEF算出来还是一样的。但是steered BRIEF改变了一些性质,orb作者给出了下面这幅图。

先说说横纵坐标的含义。对100k个描述子按位(256位)相加计算均值,得到256个均值,记做变量x = {0.5, 0.5, 0.1, 0, 1, ...},再与0.5相减得到变量x' = |x - 0.5| = {0, 0, 0.4, 0.5, 0.5, ...},那么横坐标就是这里的x',纵坐标就是对应计数。再看直方图,BRIEF的横坐标集中在0处,也就是变量x集中在0.5处。意思就是对于描述子上的每一位的平均值大多数都非常接近0.5,也有平均值为0或者1的,只不过非常少,这些值就构成了一个高斯分布。直方图等价于对折之后的高斯分布,留一半。方差一目了然,BRIEF方差最大,而steered BRIEF所有描述子在各个位上的平均的分布则比较平均。至于为什么方差小,区分能力比较差,没太明白,有兴趣可以看看论文。

那么作者提出了rotated BRIEF,用大量的数据,选择出效果最好的256个点对位置,以后每次计算描述子都使用这256个坐标。

备注SIFT(来自网络):

1.高斯金字塔,尺度

2.相邻高斯金字塔减法,得到高斯差分图像,边缘特征显现

3.在高斯差分图像上检测特征点,像素点比周围8个,相邻高斯差分图像上9*2=18个像素点灰度值都大或都小,认为是特征点

4.像素梯度直方图,计算主方向

5.描述子,尺度*方向

每层特征点数量分配

接下来是实际提取特征点的操作。首先计算图像金字塔,假设我们总共需要提取N个特征点,每层金字塔分配多少呢。很简单,根据图像面积比例分配,ORB-SLAM3实际是按图像边长比例来分配。第0层图像面积设为1,第1层根据尺度比例(逆尺度,0<s<1)面积为  ,以此类推,可以计算每层金字塔图像面积所占比例。

第  层应该分配的特征点数量为

四叉树精简特征点

简要说明一下特征点提取流程:

1.划分图像金字塔

2.对每层金字塔图像,划分网格,在网格中提取FAST特征点

3.利用四叉树对每层特征点精简,选择最优的若干个特征点,数量不得超过每层分配数额

四叉树精简的步骤可以参考:https://zhuanlan.zhihu.com/p/61738607

原理很简单,递归对图像一分为四进行划分,直到子空间数量超过配额,每个子空间都落入了若干个特征点,对每个子空间取一个最好的,加起来就够数了。四叉树划分,将扎堆的特征点用一个点代替(非极大值抑制),同时又保证空间上所有位置都有特征点(均匀分布),最终达到精简特征点的目的。

几点经验总结

1.计算图像金字塔的时候,先扩展图像边界,镜像对称扩展,然后双线性插值缩放图像,目的是边界上的点也可以正常插值,最后取中间的原始部分为最终需要的金字塔图像

2.计算BRIEF描述子之前,先对图像进行高斯模糊,平滑噪声

3.特征点与 灰度质心连线,同x轴正向夹角范围  ,保存在keypoint->angle属性中

4.对于尺度s,焦距f这种频繁做除法的量,计算一次倒数,1/s,1/f保存起来,做乘法

参考

1.小葡萄:[ORB-SLAM2] ORB-SLAM中的ORB特征(提取)

2.FAST特征点检测 - ☆Ronny丶 - 博客园

3.Zhang Bin:传统计算机视觉中图像特征匹配方法的原理介绍(SIFT 和 ORB)

4.lowkeyway:(四十二)特征点检测-ORB

5.ORB-SLAM(一)简介 - 路游侠 - 博客园

6.特征点匹配--ORB算法介绍 - 程序园

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近3000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

ORB-SLAM3中的ORB提取相关推荐

  1. Part-1 ORB SLAM3初始化-1

    初始化 ORB SLAM3的初始化主要是创建ORB词袋.关键帧数据库.多地图等对象,其步骤如下: 检测配置文件能否打开 加载ORB词袋(ORBVocabulary) 创建关键帧数据库(KeyFrame ...

  2. SLAM: Orb_SLAM中的ORB特征

    原文链接:什么是ORB 关于Orb特征的获取:参考 最新版的OpenCV中新增加的ORB特征的使用 ORB是是ORiented Brief 的简称,对Brief的特定性质进行了改进. ORB的描述在下 ...

  3. python的特征提取实验一_在opencv3中使用ORB进行特征提取实验-Python版

    ORB (Oriented FAST and Rotated BRIEF) 分为两部分: 特征点提取 -由FAST(Features from Accelerated Segment Test)算法发 ...

  4. ORB SLAM3——IMU优化部分精读-VertexPose(ImuCamPose)的更新量到底是什么?

    ORB SLAM3--IMU优化部分精读-VertexPose(ImuCamPose)的更新量到底是什么? 先说答案 void ImuCamPose::Update(const double *pu) ...

  5. ORB-SLAM中的ORB特征提取

    ORB-SLAM中的ORB特征提取 0.提取流程概览 1.构造金字塔 2.提取FAST角点 3.利用灰度质心法,计算旋转角度 [公式] 4.计算旋转后的BRIEF描述子 1.构造金字塔 2.提取FAS ...

  6. orb-slam中的orb特征

    1.ORB特征简介 ORB是Oriented FAST and Rotated BRIEF(oFAST and rBRIEF)的简称,ORB的名字已经说明了其来源,其实ORB特征是采用FAST方法来检 ...

  7. ORB SLAM3加载Vocabulary更快ORBvoc.bin

    最近ORB SLAM3刚开源,跑了跑,发现源代码加载词袋还是ORBvoc.txt,加载时间比较慢,这里教你修改成ORBvoc.bin加载,1秒内完成加载. 1. 将ORBvoc.bin拷贝到Vocab ...

  8. SLAM中的 ORB特征检测与匹配(理论篇)

    <SLAM十四讲>视觉里程计第一部分的实践便是ORB特征检测 下面来讲讲ORB的理论: ORB算法分为两部分,第一部分是特征提取算法即FAST算法,第二部分是特征描述子BRIEF,BRIE ...

  9. 一段把mp4中的音频提取并保存在原目录的python脚本

    一段把mp4中的音频提取为mp3并保存在原目录的python脚本 需要提前安装好ffmpeg 转换为单线程,耗时较长 github: https://github.com/cuifeiran/extr ...

最新文章

  1. Python 之 杂谈(迭代器iter)、偏函数
  2. 【项目管理】Project使用
  3. MYSQL max_user_connections back_log max_connections参数和Max_used_connections
  4. 浅谈网络协议(一) 为什么要学网络协议
  5. 学python最好的方式-你们都是怎么学 Python 的?
  6. JAVA中的Hashset类
  7. node+koa2+mysql搭建博客后台
  8. js原生带缩略图的图片切换效果
  9. LeetCode 31. 下一个排列(线性扫描)
  10. mysql被更新失败_更新mysql出错:出错原因 You are using safe update mode
  11. 搜索日志文件的linux,linux日志查找
  12. 安卓3d游戏引擎_3D球闯关游戏-3D球闯关游戏安卓官方版预约 v1.2.5
  13. mysql进程线程_MySQL 内核线程简要分析
  14. 博客开园了~~~~~~
  15. 《Spring微服务实战》读书笔记——通过配置服务器来管理配置
  16. AquaFold.Data.Studio.v6.5
  17. No module named swigfaiss
  18. 阿里云商标注册入口/查询/买卖/分类表/撤三/续展/驳回复审入口汇总一键直达
  19. 第三章 标准单元库(上)
  20. LSTM股票预测模型

热门文章

  1. Crypto API
  2. 集团信息化管控型模式
  3. VMware虚拟机三种联网方法及原理
  4. 极客新闻——16、数据库设计中的5个常见错误
  5. Leangoo阶段式硬件产品开发流程
  6. 阿里面试这样问:Nacos配置中心交互模型是 push 还是 pull ?(原理+源码分析)...
  7. 图文详解 23 种设计模式
  8. 网络DevOps探索与实践
  9. 快手突然宣布取消大小周,改为按需加班,给加班工资!字节被打脸,员工吵翻天!...
  10. 排名第一的安全软件,为啥会变成流氓软件?