ORB特征笔记

news2024/9/28 20:29:06

简介  

      ORB = Oriented FAST  + Rotated BRIEF

        前面的Oriented FAST说明的是它的关键点的选取是一种改良过的FAST,在FAST的基础上加了方向信息;后面的Rotated BRIEF是指特征描述符使用BRIEF描述子(Binary Robust Independent Elementary Feature),是一种速度极快的二进制描述子。

改良的FAST角点检测

        在前面笔记中已经记录了FAST角点检测的基本原理。oFAST主要改良的点是增加了关键点的方向描述,还有就是增加了图像金字塔。

        1. 构造高斯金字塔

            ORB中的图像金字塔和SIFT中的多尺度高斯金字塔不同,每层只有一副图。金字塔共有n层,第s层的尺度为:\sigma_s = \sigma_0^s

        \sigma_0是初始尺度,默认值1.2。原图在第0层。第s层的图片尺寸为:(H/\sigma_s)*(W/\sigma_s)

        2. 特征点检测

            在不同尺度的图像上使用FAST算法检测特征点 。FAST在边缘上有较大的响应,ORB中利用了Harris角点响应度量来排序FAST的关键点。对于目标为N个关键点的情况,首先将阈值设置得足够低以获取比N多的关键点,然后根据Harris角点响应值排序,选取前N个关键点。

        3. 计算特征点主方向

             使用灰度质心法计算出以特征点中心O为圆心,半径为r的圆形区域内的质心点C。 特征点的主方向是从O到C的向量\overrightarrow{OC}的方向。

                灰度质心的位置点C为:

C = (\frac{m_{10}}{m_{00}},\frac{m_{01}}{m_{00}})

                其中,m_{pq}的计算方法为:

m_{pq} = \sum\limits_{x,y}x^py^qI(x,y)\ \ \ \ p,q = \{0,1\}

                因此:

m_{00} = \sum \limits_{x,y}I(x,y)

m_{10} = \sum \limits_{x,y}xI(x,y)

m_{01} = \sum \limits_{x,y}yI(x,y)

                特征点的主方向角度\theta为:

\theta = tan^{-1}(\frac{m_{01}}{m_{10}}) 

构建rBRIEF描述符

        经过oFAST得到了关键点和其主方向后,接下来就要构建出关键点的特征描述符了。ORB有旋转不变性,在构建BRIEF描述符之前,会将特征点的邻域旋转到特征点的主方向上。

BRIEF特征描述符

        BRIEF的核心思想是在关键点P的周围选取N个点对,然后把这N个点对的边角结果组合起来作为该关键点的描述子。Brief算法生成的是一种二值化的描述子,匹配的时候只需要使用简单的汉明距离比对即可,使用bits之间的异或操作就能完成。因此它的时间空间代价都比较低,效果也还不错。

         1. 滤波:对原图滤波,去除部分噪声。

         2. 选取点对:以关键点为中心,选取一定大小的图像窗口p,在窗口内选择一对点,比较两者像素值的大小,进行赋值,二值测试函数\tau定义如下:

        \tau(p;x,y) = \left\{\begin{matrix} 1 : p(x) < p(y)\\ 0:p(x) \geq p(y) \end{matrix}\right.

                其中,p(x)表示像素x在窗口p内的像素值。

         3. 在窗口p中随机选取N(128,256,512,默认为256) 对随机点对,重复第2步进行二进制赋值,最后得到一个N维的二进制描述子,这个结果向量被定义为:

f_n(p) := \sum \limits_{1\leq i \leq n}2^{i-1}\tau(p;x_i,y_i)

         这个式子其实直白理解就是,每一个bit表示了一个点对的对比结果。

Brief算法中点对的选取方法

        对于SxS的区域内选取点对,原始Brief论文中做了5种方法:

        1.(X,Y) ~ i.i.d(独立同分布)。服从均匀分布U(-\frac{S}{2},\frac{S}{2})(x_i,y_i)位置均匀分布在块内。

        2. (X,Y) ~ i.i.d(独立同分布)。服从高斯分布G(0, \frac{1}{25}S^2):采样带内服从各向同性的高斯分布。

        3. X ~ i.i.d(独立同分布),服从高斯分布G(0, \frac{1}{25}S^2);Y~ i.i.d(独立同分布),服从高斯分布G(x_i, \frac{1}{100}S^2)。 采样分两步,第一步以原点为中心的高斯分布中采样出x_i,然后再以x_i为中心,采样得到第二个位置。超出块的范围的位置会被钳在块的边缘处。

        4. 在空间量化极坐标下的离散位置随机采样;

        5.  \forall i: x_i = (0,0)^Tx_i固定为原点,y_i采样自粗粒度的极坐标网格的离散位置上。

        上述5种采样方式的示意图如下:

         在旋转不是非常厉害的图像里,用BRIEF生成的描述子的匹配质量非常高。

Steered BRIEF

           原始的BRIEF算法,不具有旋转不变性,当平面发生非常小角度的旋转后,其匹配质量会大幅下降。下图是各种描述子在平面旋转角度和算法对应的正常有效点(inliers)的百分比示意图:

         Steered BRIEF会根据关键点的方向进行旋转,然后再计算Biref描述符。对于特征点邻域内的n个点对的集合:

S = \begin{pmatrix} x_1,...,x_n\\ y_1,...,y_n \end{pmatrix}

        通过一个旋转角度为\theta对应的旋转矩阵R_\theta做变换,定义出旋转后的点对集合S_\theta:

S_\theta = R_\theta S

         因此steered BRIEF算子变成了:

g_n(p,\theta) := f_n(p)|(x_i,y_i) \in S_\theta

         这个函数定义实际就是对旋转后的点对儿进行对比生成Biref描述符的计算过程。

rBRIEF

        steered BRIEF解决了BRIEF不具有旋转不变性的问题,但它在描述符的可区分性上。描述符本身是关键点的特征信息,在匹配的时候可以用来区分不同的关键点。如果描述符的可区分性变差,则不同的关键点相似度会变高,不容易找到对应的关键点,误匹配率会变大。论文中对100K个采样的关键点用不同的方法生成的特征描述符的均值分布:

         图中X轴表示到均值0.5的距离。y轴则是对应BRIEF描述符中的特征bits数量。

        注:网上参考的所有文章几乎都是说y轴是特征点数量,这点我持保留意见,虽然最终要表达的意思是差不多的。论文中描述这个图表的原话是:

        “the spread of means for a typical Gaussian BRIEF pattern of 256 bits over 100k sample keypoints”。

        个人感觉应该是根据100K个采样点统计后按照概率所计算的描述符中某个bit feature列计算均值,然后按照这个均值到0.5的距离进行分段统计。假设距离为0的有140个,表示的是这256个列中,有140 bit feature列的均值就是0.5。如下图所示:

        以上仅为个人理解,大家可以去看看原始论文,或者去参看一下“参考资料”中最后一个链接。

        为什么X轴要用到均值0.5的距离?因为我们得到的描述符都是二值的(0,1),对于多个0和1组成的串。如果计算出的均值是0.5,则表示这个串中0和1的数量是相等的。如果0更多,则均值偏向0;如果1更多,则均值偏向1。后面两种情况计算距离都会偏离0.5,表示这一组数据中的0或1更多,因此对应的特征值就越相似,越难以区分。

        为了解决steered BRIEF的这个问题,ORB中引入了rBRIEF。它不使用BRIEF原始论文中选取点对儿的5种方式的任何一种,而是通过统计学习得到一种比较好的选取点集的方法。

        首先创建一个300K个关键点的训练集。然后在一个31x31大小的块中做二值测试。每个点对儿是块内部两个5x5的子窗口,一个子窗口相当于一个像素,其灰度值是这个子窗口内所有像素灰度值的均值,可以通过积分图像快速求得。我们记块的宽度w_p = 31,子窗口的宽度w_t = 5

        因此,子窗口总数量为N = (w_p - w_t +1) * (w_p * w_t + 1) = 729,计算得到不同的选取点对儿的方式为:M = C_N^2 = 265356

        注:原始论文中N = (w_p - w_t)^2M = 205590。原始论文中N的值并没有覆盖全子窗口,M的值,论文中是有去除一些重叠的区域,但没有找到重叠区域是如何定义的。如果哪位大神清楚请帮忙说明一下。本文中的N和M来自网上的参考资料,更容易理解一点,N取的是全部子窗口(会加1),M按照组合方式计算(不考虑去掉重叠区域)。

        rBRIEF算法的最终目的是从这M种选取点对儿方式中找出最优的256中选择方法。算法的流程如下:

        1. 在每个样本点的31x31的邻域内,用不同的点对儿选取方式做二值测试,每个样本点对应M个结果。结果是一个300K * M的矩阵,对矩阵每一列计算均值:

        2. 根据每一列的均值到0.5的距离对列进行重新排序,得到T(下图为一种可能出现的示意图):

         3. 贪心搜索:

                a. 将T的第一列取出放到R中;

                b. 从T中取下一列,将它和R中的所有的列进行比较。如果相关性大于某个阈值则丢弃,否则将这一列放入R中。

                c. 重复b步骤,直到R中选出了256个列。如果最终结果少于256个,则修改阈值再试一次。

        经过这几步,最终就能得到256个点对儿的选取方法,结果就是rBREIF。

 参考资料

https://www.researchgate.net/publication/221111151_ORB_an_efficient_alternative_to_SIFT_or_SURFhttps://www.researchgate.net/publication/221111151_ORB_an_efficient_alternative_to_SIFT_or_SURFhttps://web.stanford.edu/class/cs231m/references/harris-stephens.pdfhttps://web.stanford.edu/class/cs231m/references/harris-stephens.pdfhttps://www.researchgate.net/publication/222485725_Measuring_Corner_Propertieshttps://www.researchgate.net/publication/222485725_Measuring_Corner_Propertieshttps://www.researchgate.net/publication/221304115_BRIEF_Binary_Robust_Independent_Elementary_Featureshttps://www.researchgate.net/publication/221304115_BRIEF_Binary_Robust_Independent_Elementary_Features02-p2-rbrief_哔哩哔哩_bilibili02-p2-rbrief是02-ORB特征提取的第2集视频,该合集共计2集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1PW411M73t?p=2&vd_source=474bff49614e62744eb84e9f8340d91ahttp://media.ee.ntu.edu.tw/courses/cv/21S/slides/cv2021_lec03.pdfhttp://media.ee.ntu.edu.tw/courses/cv/21S/slides/cv2021_lec03.pdf

特征点匹配——ORB算法介绍_orb匹配算法_lhanchao的博客-CSDN博客《ORB: an efficient alternative to SIFT or SURF》是Rublee等人在2011年的ICCV上发表的一篇有关于特征点提取和匹配的论文,这篇论文介绍的方法跳出了SIFT和SURF算法的专利框架,同时以极快的运行速度赢得了众多青睐。下面我简单介绍一下ORB算法的流程。ORB算法的主要贡献如下: (1)为FAST算法提取的特征点加上了一个特征点方向; (2)使_orb匹配算法https://blog.csdn.net/lhanchao/article/details/52612954

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/803503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

赋能医院数字化转型,医院拍摄VR全景很有必要

医院有没有必要拍摄制作VR全景呢&#xff1f;近期也有合作商问我们这个问题&#xff0c;其实VR智慧医院是趋势、也是机遇。现在外面很多的口腔医院、医美机构等都开始引入VR全景技术了&#xff0c;力求打造沉浸式、交互式的VR智慧医院新体验&#xff0c;通过VR全景展示技术来助…

c# 此程序集中已使用了资源标识符

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS1508 此程序集中已使用了资源标识符“BMap.NET.WindowsForm.BMapControl.resources” BMap.NET.WindowsForm D:\MySource\Decompile\BMap.NET.WindowsForm\CSC 1 活动 运行程序时&a…

javascript 模板引擎

使用场景 在实际开发中&#xff0c;一般都是使用动态请求数据来更新页面&#xff0c;服务器端通常返回json格式的数据&#xff0c;正常操作是我们手动的去拼装HTML&#xff0c;但麻烦且容易出错&#xff0c;因此出现了一些用模版生成HTML的的框架叫js模板引擎如&#xff1a;jq…

成本中心修改或者创建保存时增强的实现

成本中心修改或者创建保存时增强 用户出口程序为&#xff1a;EXIT_SAPLKMA1_003。 可以通过SMOD 或者 CMOD来添加增强代码。 CMOD->COOMKS02 ->EXIT_SAPLKMA1_003 按公司要求&#xff0c;写了段代码检查 创建利成本中心时&#xff0c;业务范围要规范输入。 data PRCTR…

对Windows应用程序进行代码签名

Windows上发布桌面应用程序&#xff0c;您可以看到带有“发布者&#xff1a;未知”的未正确签名的应用程序。 没有被签名的软件 因此&#xff0c;这里有一个有关经验教训的快速指南&#xff0c;可能会帮助您从一开始就正确签署安装程序。请注意&#xff0c;这些说明适用于对已…

环境搭建-Ubuntu18.04.6系统TensorFlow BenchMark的GPU测试

1. 下载Ubuntu18.04.6镜像 登录阿里云官方镜像站&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 2. 测试环境 Server OS&#xff1a;Ubuntu 20.04.6 LTS Kernel: Linux 5.4.0-155-generic x86-64 Docker Version&#xff1a;24.0.5, build ced0996 docker-com…

数据结构之常见排序算法

文章目录 1.排序概念2.10种排序比较3.排序算法3.1直接插入排序&#xff08;元素越有序&#xff0c;越高效&#xff09;3.2希尔排序序( 缩小增量排序 )3.3直接选择排序3.5堆排序3.6冒泡排序3.8快速排序 递归实现&#xff08;无序使用最好&#xff09;3.8.1挖坑法 &#xff08;建…

yo!这里是STL::string类简单模拟实现

目录 前言 常见接口模拟实现 默认成员函数 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值运算符重载 迭代器 简单接口 1.size() 2.c_str() 3.clear() 操作符、运算符重载 1.操作符[] 2.运算符 3.运算符> 扩容接口 1.reserve() 2.resize() 增删查改接口 …

JS常用操作数组的方法整理

JavaScript提供了许多用于操作数组的方法。以下是其中一些常见的方法&#xff1a; 1. push() : 将一个或多个元素添加到数组的末尾&#xff0c;并返回新数组的长度。 2. pop() : 移除并返回数组的最后一个元素。 3. unshift() : 将一个或多个元素添加到数组的开头&#xff0…

一做PPT就抓耳挠腮?老码农掏心分享,选对工具才能事半功倍

今天老陈闲来无事摸个鱼&#xff0c;逛社区的时候看到一条有趣的帖子&#xff0c;HR怒喷UI设计师垃圾&#xff0c;说他们还不如应届生毕业生有能力&#xff0c;设计能力菜的惊人&#xff0c;给老陈平淡的生活增加了不少乐趣。 底下的评论也很有意思&#xff0c;有人说视觉表现…

JavaScript正则表达式之座机号/手机号验证校验规则

引用:https://www.bilibili.com/read/cv18300539/ 本文对利用正则表达式对手机号码进行了验证 支持格式&#xff1a; 座机 &#xff1a;xxx-xxxxxxxx、xxxxxxxxxxxx …座机区号的横杠可有可无 手机&#xff1a;xxxxxxxxxxx JavaScript&#xff1a; var: checkPhone (rule,…

想要理解Linux内核是什么

我们可以思考一下进程何时才能感知到内核的存在。例如&#xff0c;在进行内存分配时&#xff0c;最终需要调用内核的sys_mmap系统调用来申请虚拟内存空间&#xff1b;在创建子进程时&#xff0c;最终需要调用内核的sys_fork来复制父进程&#xff1b;在打开文件时&#xff0c;最…

10家国外直播加速CDN厂商PK2023版

以下是针对流媒体加速的10家主要CDN厂商的比较&#xff0c;我们将根据每家公司发展史、他们提供的功能以及他们的CDN定价比较&#xff0c;这样您就可以选择最适合您需求的 CDN。 1.Akamai Akamai Technologies是一家美国CDN厂商&#xff0c;它是全球领先的媒体和软件交付CDN…

dbscan

dbscan Density-based spatial clustering of applications with noise (DBSCAN), 基于密度的聚类方法。 算法的阈值只有两个&#xff0c;距离阈值eps&#xff0c; 最小点个数minPts。如果一个点在eps为半径的园内&#xff0c;包含点的个数>minPts,那么这个点以及这个圆内的…

JavaWeb教程笔记

JavaWeb Java Web 1、基本概念 1.1、前言 web开发&#xff1a; web&#xff0c;网页的意思 &#xff0c; www.baidu.com静态web html&#xff0c;css提供给所有人看的数据始终不会发生变化&#xff01; 动态web 淘宝&#xff0c;几乎是所有的网站&#xff1b;提供给所有人…

VBA_MF系列技术资料1-133

MF系列VBA技术资料 为了让广大学员在实际VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属…

【LeetCode热题100】打卡第45天:倒数第24~20题

文章目录 【LeetCode热题100】打卡第45天&#xff1a;倒数第24~20题⛅前言 最佳卖股票时机含冷冻期&#x1f512;题目&#x1f511;题解 戳气球&#x1f512;题目&#x1f511;题解 零钱兑换&#x1f512;题目&#x1f511;题解 打家劫舍III&#x1f512;题目&#x1f511;题解…

【高级数据结构】并查集

目录 修复公路&#xff08;带扩展域的并查集&#xff09; 食物链&#xff08;带边权的并查集&#xff09; 修复公路&#xff08;带扩展域的并查集&#xff09; 洛谷&#xff1a;修复公路https://www.luogu.com.cn/problem/P1111 题目背景 A 地区在地震过后&#xff0c;连接…

ReactRouterv5在BrowserRouter和HashRouter模式下对location.state的支持

结论&#xff1a;HashRouter不支持location.state 文档&#xff1a;ReactRouter v5 从文档可看到history.push()方法支持2个参数&#xff1a;path, [state] state即是location.state&#xff0c;常用于隐式地传递状态参数 但文档未提的是&#xff0c;仅适用于BrowserRouter&am…

面试-杨辉三角python递归实现,二进制转换

杨辉三角 def yang_hui(x,y):xint(x)yint(y)assert x>y,列数不应该大于行数# x 表示行&#xff0c;y表示列if y1 or yx:return 1else:return yang_hui(x-1,y-1)yang_hui(x-1,y)xinput(输入第几行) yinput(输入第几列) resultyang_hui(int(x),int(y)) print(result) #inclu…