ORB算法——特征提取特征匹配
特征提取
Abstract
ORB(Oriented Fast and Rotated Brief),可以用来对图像中的关键点快速创建特征向量,这些特征向量可以用来识别图像中的对象。
其中,Fast 和 Brief 分别是特征检测算法和向量创建算法。ORB 首先会从图像中查找特殊区域,称为关键点。关键点即图像中突出的小区域,比如角点,比如它们具有像素值急剧的从浅色变为深色的特征。然后 ORB 会为每个关键点计算相应的特征向量。ORB 算法创建的特征向量只包含 1 和 0,称为二元特征向量。1 和 0 的顺序会根据特定关键点和其周围的像素区域而变化。该向量表示关键点周围的强度模式,因此多个特征向量可以用来识别更大的区域,甚至图像中的特定对象。
ORB 的特点是速度超快,而且在一定程度上不受噪点和图像变换的影响,例如旋转和缩放变换等。
FAST 算法
ORB 特征检测的第一步是查找图像中的关键点,而关键点检测算法即使用 FAST 算法。
FAST 是 Features from Accelerated Segments Test 的简称,可以快速选择关键点,算法步骤如下:
给与一个像素点 p,FAST 比较目标 p 圆圈范围【3】中的 16 个像素,每个像素按高于 p,小于 p,或者与 p 相似,分为三类。
注意这里的比较是带有阈值 h 【iniThFAST】的。对于给定的阈值 h,更亮的像素将是亮度超过 Ip+h 的像素,更暗的像素将是亮度低于 Ip-h 的像素,相似像素将是亮度在这两个值之间的像素。在对像素分类后, 如果圈圈上有 8 个以上的相连像素,暗于或亮于 p 则将像素 p 选作关键点。
而 FAST 如此高效的原因是,仅将 p 与圆圈中的 4 个等距像素相比。这种方法已经证明和比较 16 个周围像素的效果相同。如果至少有一对连续像素的亮度高于或低于 p,则将 p 选作关键点。这种优化使得在整个图像中搜索关键点的时间缩短了四倍。
但是,这些关键点可以像我们提供什么样的信息?对比邻近像素的亮度有何意义?首先观察一下 FAST 算法标记关键点的图像。
可以看出关键点位于亮度有变化的区域,此类区域通常确定了某种边缘,例如猫的爪子。边缘定义了猫的界限,以及脸部区域的界限,因此这些关键点使我们能够识别这只猫,而不是图像中的任何其他对象或背景。
BRIEF 算法
我们已经知道 ORB 如何使用 FAST 确定图像中的关键点,下面我们将了解 ORB 如何使用 BRIEF 算法,并将这些关键点转换为特征向量。
ORB 算法的第二步是将第一个算法发现的关键点变成特征向量,这些特征向量可以共同表示一个对象。
要创建特征向量,ORB 会用到 BRIEF 算法。BRIEF 是 Binary Robust Independent Elementary Features 的简称,它的作用是根据一组关键点创建二元特征向量。正如在简介视频中看到的,二元特征向量又称为二元描述符,是仅包含 1 和 0 的特征向量。在 BRIEF 中 每个关键点由一个二元特征向量描述,该向量一般为 128-512 位的字符串,其中仅包含 1 和 0。
注意,这里的“位”是二进制位的简称,1 位只能存储一个二进制值,要么 1 要么是 0。位字符串是一组位,这些是位字符串示例。
计算机运行的是二进制或机器代码,因此使用二元特征向量的一大优势是可以非常高效地存储在内存中,并且可以快速计算。速度对实时应用来说极为关键,这些特性不仅使 BRIEF 速度非常快,而且使 BRIEF 能够在计算资源非常有限的设备(例如智能手机)上运行。
BRIEF 如何为每个点创建这些二元描述符?BRIEF 算法首先利用高斯核对给定图像进行平滑处理,以防描述符对高频噪点过于敏感。然后,对于给定关键点,例如猫爪上的这个点。
BRIEF 从该关键点周围界定好的邻域内随机选择一对像素,关键点周围的邻域称为 Patch【】,它是一个具有特定像素宽度和高度的正方形。
这里显示的随机对中的第一个像素,是一个蓝色正方形,它是从以关键点为中心的高斯分布中抽取的一个像素,标准偏差或分散趋势为 σ。
这里显示为黄色正方形的像素,是随机对中的第二个像素。它是从以该第一个像素为中心的高斯分布中抽取的像素,标准偏差为 σ/2,经验表明这种高斯选择提高了特征匹配率。
BRIEF 然后开始为关键点构建二元描述符,方法是如下所示地比较这两个像素的亮度【像素值越靠近255亮度越高】。如果第一个像素比第二个亮,则为描述符中的相应位分配值 1,否则分配值 0。
在这个示例中第二个像素比第一个亮,因此我们为特征向量的第一个位分配值 0。特征向量的第一个位对应的是这个关键点的第一个随机点对,然后 BRIEF 会针对同一关键点选择新的随机像素对比较它们的亮度并为特征向量中的下个位分配 1 或 0。
在上面新选取的随机像素中,我们看到现在第一个像素比第二个亮,因此为特征向量中的第二个位分配值 1。
对于 256 位向量,BRIEF 会针对同一关键点重复这一流程 256 次,然后转到下个关键点。接着将 256 个像素亮度比较结果放入该关键点的二元特征向量中。BRIEF 像这样为图像中的每个关键点创建一个向量。
缩放不变性和旋转不变性
ORB 使用 FAST 检测图像中的关键点,并且通过额外的几个步骤确保无论对象的大小或位置如何都能检测到图像中的对象。
给定一个图像 ORB 算法首先开始构建图像金字塔。
图像金字塔是单个图像的多尺度表示法,由一系列原始图像的不同分辨率版本组成。金字塔的每个级别都由上个级别的图像下采样版本组成。下采样是指图像分辨率被降低,比如图像按照 1/2 比例下采样。因此一开始的 4x4 正方形区域现在变成 2x2 正方形。图像的下采样包含更少的像素,并且以 1/2 的比例降低大小。
【】
这是一个包含 5 个【nlevels】级别的图形金字塔示例,在每个级别图像都以 1/2 的比例【scaleFactor】下采样。到了第四级别图像的分辨率是原始图像的 1/16。ORB 创建好图像金字塔后,它会使用 FAST 算法从每个级别不同大小的图像中快速找到关键点。因为金字塔的每个级别由原始图像的更小版本组成,因此原始图像中的任何对象在金字塔的每个级别也会降低大小。
通过确定每个级别的关键点 ORB 能够有效发现不同尺寸的对象的关键点,这样的话 ORB 实现了部分缩放不变性。这一点很重要,因为对象不太可能在每个图像中的大小都完全一样,尤其是像猫这样的对象某个时刻可能靠近相机,在另一个时刻离相机很远。
注:3为计算FAST特征点的时候建立的半径为3的圆
现在 ORB 获得了与这个图像金字塔每个级别相关的关键点。在发现金字塔所有级别中的关键点后,ORB 现在为每个关键点分配一个方向,例如朝左或朝右,取决于该关键点周围的强度是如何变化的。
ORB 首先选择金字塔Level 0 中的图像,对于该图像 ORB 将计算关键点的方向。
方法是首先计算以该关键点为中心的方框中的强度形心。强度形心可以看做给定 patch 中的平均像素强度的位置。计算强度形心后,通过画一条从关键点到强度形心的向量,获得该关键点的方向,如上图所示。这个关键点的方向是向下并朝左,因为这个区域的亮度朝着这个方向增强。
为金字塔级别 0 的图像中的每个关键点分配方向后,ORB 现在为所有其他金字塔级别的图像重复相同流程。需要注意的是,在每个图像金字塔级别,Patch 大小并没有缩减,因此相同 Patch 在每个金字塔级别覆盖的图像区域将更大,导致关键点的大小各不相同。
可以从此处看出这一点。在此图中,圆圈表示每个关键点的大小【关键点Patch范围内】,更高的金字塔级别中的关键点大小更大。
找到关键点并为其分配方向后,ORB 现在使用修改后的 BRIEF 版本创建特征向量【mDescriptors:特征点个数*列数(32)】,这个修改后的 BRIEF 版本称为 rBRIEF,即 Rotation-Aware BRIEF。无论对象的方向如何,它都可以为关键点创建相同的向量,使得 ORB 算法具有旋转不变性,意味着它可以在朝着任何角度旋转的图像中检测到相同的关键点。和 BRIEF 一样 rBRIEF 首先在给定关键点周围的已界定 patch 中随机选择 256 个像素对,以构建 256 位向量。然后根据关键点的方向角度旋转这些随机像素对,使随机点的方向与关键点的一致。最后, rBRIEF 对比随机像素对的亮度并相应地分配 1 和 0 创建对应的特征向量,为图像中的所有关键点创建的所有特征向量集合称之为 ORB 描述符。
特征匹配
假设我想在其他图像中检测到此人的面孔,例如在这个多人合影中,我们将第一张图像称为训练图像,第二张图像,即要对其进行人脸检测的图像,称为查询图像。
给定这个训练图像,我想在这个查询图像中查找相似的特征,第一步是计算训练图像的 ORB 描述符并将其存储到内存中。
ORB 描述符将包含二元特征向量,用于描述这个训练图像中的关键点。第二步是计算并保存查询图像的 ORB 描述符,获得训练和查询图像的描述符后,最后一步是使用相应的描述符对这两个图像进行关键点匹配,通常使用匹配函数来完成这一步。
匹配函数的目的是匹配两个不同图像的关键点,方法是比较这两个图像的描述符,看看它们是否很相近可以匹配。当匹配函数对比两个关键点时,它会根据某种指标得出匹配质量,这种指标表示关键点特征向量的相似性。可以将这个指标看作与两个关键点之间的标准欧几里得距离相似性。某些指标会直接检测特征向量是否包含相似顺序的 1 和 0。需要注意的是,不同的匹配函数使用不同的指标来判断匹配质量。对于 ORB 等使用的二元描述符来说,通常使用汉明指标,因为它执行起来非常快。
汉明指标通过计算二元描述符之间的不同位数量判断两个关键点之间的匹配质量。在比较训练图像和查询图像的关键点时,差异数最少的关键点对被视为最佳匹配。匹配函数对比完训练图像和查询图像中的所有关键点后,返回最匹配的关键点对。
我们的训练图像和查询图像之间的最匹配点显示在此处,可以清晰地看出训练图像和查询图像之间最匹配的点主要对应的是训练图像的面孔。有一两个特征不是太匹配,原因可能是该图像区域的强度模式比较相似。因为大部分点对应的是训练图像中的脸部,可以看出匹配函数能够在查询图像中正确地识别该面孔。
参考:ORB 特征提取算法(理论篇) - Alex777 - 博客园 (cnblogs.com)
代码:UZ-SLAMLab/ORB_SLAM3: ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM (github.com)
ORB算法——特征提取特征匹配相关推荐
- 计算机视觉学习2_局部图像描述子_SIFT算法_特征匹配_集美大学地标
文章目录 相关环境的搭建 原理部分 Harris角点检测算法 SIFT(尺度不变特征变换) 尺度不变性 实验部分 Harris和sift特征匹配处理 结果对比 集美大学小地图 相关环境的搭建 1.PC ...
- opencv经典算子原理总结+SIFT算法原理+特征匹配用于图像拼接
此文总结一下opencv中的一些常见算子,如SIFT.Canny.及霍夫变换等原理,可用于深度理解特征提取数学原理 1.SIFT(尺度不变性特征转换) SIFT算法的实质是在不同的尺度空间上查找关键点 ...
- 特征匹配中OpenCV Dmatch类的用法解析以及非常详细的ORB特征提取与匹配解析
首先说明一点,在SLAM中进行特征提取和匹配时,需要注意使用的OpenCV版本,在使用OpenCV2.x版本时,可以创建特征对象如下所示(省略了参数表): ORB orb; SURF surf; SI ...
- SLAM之特征匹配(一)————RANSAC-------OpenCV中findFundamentalMat函数使用的模型
目录 1.RANSAC原理 2. RANSAC算法步骤: 3. RANSAC源码解析 step one niters最初的值为2000,这就是初始时的RANSAC算法的循环次数,getSubset() ...
- 计算机视觉:特征提取与匹配
目录 1. 特征提取和匹配 1.1 背景知识 1.2 特征匹配基本流程 1.3 局部特征描述子 2. Harris角点检测 2.1 角点(corner points) 2.2 HARRIS角点检测基本 ...
- 【计算机视觉实验二】特征提取与匹配
一.特征匹配基本流程 根据特定准则,提取图像中的特征点 提取特征点周围的图像块,构造特征描述符 通过特征描述符对比,实现特征匹配 二.Harris角点 算法基本思想是使用一个固定窗口在图像上进行任意方 ...
- Python+OpenCV:特征匹配(Feature Matching)
Python+OpenCV:特征匹配(Feature Matching) Basics of Brute-Force Matcher Brute-Force matcher is simple. It ...
- Python计算机视觉 sift和Harris特征匹配处理对比
一.SIFT(尺度不变特征变换)原理分析 在过去的十年间,最成功的图像局部描述子之一是尺度不变特征变换(SIFT),它是由David Lowe发明的.SIFT是用于图像处理领域的一种描述,SIFT特征 ...
- SLAM从0到1——ORB特征提取及特征匹配
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 学习3D视觉核心技术,扫描查看介绍,3天内无条件退款 圈里有高质量教程资料.可答疑解惑.助你高效解决问 ...
最新文章
- struct stat结构体的详解和用法
- 解决Attempt to execute SCRIPT mexLasso as a function
- 原 iOS面试题收集
- opencv 学习笔记9:图像缩放与图像翻转
- 可持久化数据结构加扫描线_结构化光扫描
- git 基本使用教程
- 分区操作后索引的状态
- BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡
- Lingo软件的基本语法
- 深度linux升级,测试从Deepin Linux 15升级到Deepin Linux v20
- 节奏旋律音乐制作软件-Native Instruments Maschine 2 v2.14.1 WiN
- HDU 5773 (DP)
- Python: sys.path.append()用法
- 【odroid-xu3】 ODROID-XU3软件环境搭建记录
- Class org.datanucleus.api.jdo.JDOPersistenceManagerFactory was not found
- 《禅与摩托车维修艺术》摘录(二)
- java实现记账本功能_java基础实战项目一:实现家庭记账本的简易记账功能
- URL采集器-关键词采集
- 单例模式(饥汉式、懒汉式)
- 超声波测距仪编程_关于基于51单片机的超声波测距仪的汇编编程问题
热门文章
- Spelling Checker拼写检查错误提示(以及拼音提示功能)
- banner 获取当前指示物_Android轮播图图片的本地保存及读取
- 山石防火墙命令查看配置_hillstone防火墙配置实例介绍
- gui php,php-iup: 又一个php的gui扩展,基于iup框架。(仅打算支持PHP 7.2.x)
- 插画风唯美小学教学课件PPT模板
- 关注星辰大海的腾讯和热爱天文的马化腾
- Simscape入门指南1
- 有奖征集活动系列—— iOS游戏编程之旅 已结束
- COMODO杀毒软件Mac版下载
- Microsoft AppLocale 实用程序