ORB
http://wenku.baidu.com/link?url=R4Ev8aJNxwmjV0egSUqVBjmnt1KT_llzp8Oy2NbHnwa7Me9UAIHkiMG2Vwucu3RSDKwy_WaYO_5o1RFMWeQ-7gqbFzCEv30sJpoMzjv1dj_
http://wenku.baidu.com/link?url=nzhQ4CVu3Qprvjx2KBVz9XOqDScMIsmLgfbqLlwdxjIcQa1zYIc0iB-kS2MnGaCCUUcAs6oXkETLn1qftT0YR-epNiXKOMg-EIVkVCnflxK
预备知识
高斯滤波器 (Gaussian Filter)
最有用的滤波器 (尽管不是最快的)。 高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。
还记得1维高斯函数的样子吗?
假设图像是1维的,那么观察上图,不难发现中间像素的加权系数是最大的, 周边像素的加权系数随着它们远离中间像素的距离增大而逐渐减小。
Note
2维高斯函数可以表达为 :
其中 为均值 (峰值对应位置), 代表标准差 (变量 和 变量 各有一个均值,也各有一个标准差)
BRIEF是2010年一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出的。BRIEF是对已经检测到的特征点进行描述,它是一种二进制编码的描述子,摒弃了利用区域灰度直方图描述特征点的传统方法,大大滴加快了特征描述符的建立速度,同时也大大降低了特征匹配的时间,是一种非常快速非常有潜力的算法。由于BRIEF只是特征描述子,所以实现要得到特征点的位置,可以利用FAST特征点检测算法或者Harris脚点检测算法或SIFT,SURF等算法检测特征点的位置,
FAST: 假定特征点周围的图像强度,通过检测获选像素周围一圈像素来确定是否接收一个特征点。与中心点差异较大的像素如果组成连续的圆弧,并且弧长大于圆周长的3/4,那么认为找到一个特征点。优点:算法可以获得非常快速的特征点检测。
特征点 在计算机视觉中,我们通常需要寻找两张图片上的关键点,因为我们一旦知道了两张图是相关的。就像一个美女脸上面有一个大大的麻子一样。匹配关键点是指在场景中可以很容易辨识出来的特征,这些特征就是这里所指的特征点,图像的特征类型有 :边缘,脚点,半点
灰度直方图 是灰度级的函数(灰度级越多层级越明显也就越清晰。现在的灰度分256级也就是8个bit)
非极大值抑制 在物体检测方面非极大值抑制应用十分广泛,主要的目的是为了消除多余的框框找到最佳的物体检测的位置. 如图虽然几个框框都检测到了人脸但是我不需要这么多的框框我只需要一张最能表达人脸的框框如图所示我只需要最能表达汽车的框框。其原理:非极大值抑制可以理解为局部最大搜索, 即搜索领域范围内的最大值,行人检测后期,对检测出的窗口要执行非极大值抑制进行窗口的融合,从而过滤掉一些内部窗口等,达到窗口融合效果,从而使检测的准确率更高。
ORB 可以看出ORB就是先用FAST检测出来特征点然后用BRIEF对特征点进行描述。
详细介绍 :
FAST特征检测:在局部特征点快速发展的时候,人们对特征的认识也越来越深入,近几年来许多学者提出了许许多多的特征检测算法改进其算法,在众多的特征提取算法中,不乏涌现佼佼者。而在一个系统中,特征提取仅仅是一部分,还要进行诸如配准、提纯、融合等后续算法。这使得实时性不好,降系了统性能。这就是为什么有ORB的原因,为了速度。
FAST的提出者讲FAST角点定义为:若某像素与其周围邻域内足够多的像素点相差较大,则该像素点可能是角点。
可见 点 p 和其周围较多(阈值)的点相差较大则可以认为p就是角点。
1, 上图所示,一个以像素p为中心,半径为3的圆上有16个像素点
2, 定义一个阈值。计算p1, p9, 和中心p的像素差, 若他们的绝对值都小于阈值则p不可能是特征点, 否则当做候选点等待进一步考察
3, 若p是候选点则计算p1, p9, p5, p13和中心p的西欧按摩后四车间啊,若他们的绝对值至少有三个超过阈值, 当做候选点有待下一步考察, 否则pass
4, 若p是候选点则计算p1到p16折16个点和中心点p的像素差, 如果他们至少有9个超过阈值,则是特征点否则pass.
5, 对图像进行非极大值抑制:计算特征点出的FAST得分值, 即socre值,判断以特征点p为中心的一个领域(如3*3或5*5), 计算若有多个特征点,则判断每个特征点的值(16个点和中心差值的绝对值的总和)若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点(角点),则保留。得分计算公式如下(公式中用V表示得分,t表示阈值):
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.h>
#include <vector> using namespace cv;
using namespace std; int main()
{
Mat frame=imread("lena.jpg", );
double t = getTickCount();//当前滴答数
std::vector<KeyPoint> keyPoints;
FastFeatureDetector fast(); // 检测的阈值为50 fast.detect(frame, keyPoints); // 输入图片和装载特征点的容器
drawKeypoints(frame, keyPoints, frame, Scalar(,,), DrawMatchesFlags::DRAW_OVER_OUTIMG); t = ((double)getTickCount() - t)/getTickFrequency();
cout<<"算法用时:"<<t<<"秒"<<endl; imshow("FAST特征点", frame);
cvWaitKey(); return ;
}
BRIEF特征描述
1,解决噪声敏感
BRIEF中采用9*9的高斯算子进行滤波,可以在一定程度上解决噪声敏感的问题,但是一个滤波显然是不够的ORB中提出,利用积分图像来解决在31*31的窗口中,产生一堆随机点之后,以随机点为中心,取5*5的子窗口,比较两个子窗口内的像素和的大小进行二进制编码。而非仅仅由两个随机点决定二进制编码。(这一步用积分图像完成)
2,解决旋转不变形
利用FAST中求出的特征点的主方向 sitar ,对特征点领域进行旋转,Calonder建议现将每块旋转之后,在进行BRIEF描述子的提取,将其进行旋转后进行判别,在二进制编码。
BRIEF具体算法
由于BRIEF仅仅是特征描述子,所以事先要得到特征点的位置,可以利用FAST特征点检测算法或Harris角点检测算法或SIFT、SURF等算法检测特征点的位置。接下来在特征点邻域利用BRIEF算法建立特征描述符。
算法步骤如下:
1、为减少噪声干扰,先对图像进行高斯滤波(方差为2,高斯窗口为9x9)。
2、以特征点为中心,取SxS的邻域窗口。在窗口内随机选取一对(两个)点,比较二者像素的大小,进行如下二进制赋值。
其中,p(x),p(y)分别是随机点x=(u1,v1),y=(u2,v2)的像素值。
3、在窗口中随机选取N对随机点,重复步骤2的二进制赋值,形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子。(一般N=256)
以上便是BRIEF特征描述算法的步骤。
关于一对随机点的选择方法,原作者测试了以下5种方法,其中方法(2)比较好。
这5种方法生成的256对随机点如下(一条线段的两个端点是一对):
利用BRIEF特征进行配准
经过上面的特征提取算法,对于一幅图中的每一个特征点,都得到了一个256bit的二进制编码。接下来对有相似或重叠部分的两幅图像进行配准。
特征配对是利用的汉明距离进行判决:
1、两个特征编码对应bit位上相同元素的个数小于128的,一定不是配对的。
2、一幅图上特征点与另一幅图上特征编码对应bit位上相同元素的个数最多的特征点配成一对。
实验
opencv代码
ORB的更多相关文章
- OpenCV特征点检测------ORB特征
OpenCV特征点检测------ORB特征 ORB是是ORiented Brief的简称.ORB的描述在下面文章中: Ethan Rublee and Vincent Rabaud and Kurt ...
- opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较
opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较 参考: http://wenku.baidu.com/link?url=1aDYAJBCrrK-uk2w3sSNai7h52x_ ...
- ORB特征点检测
Oriented FAST and Rotated BRIEF www.cnblogs.com/ronny 这篇文章我们将介绍一种新的具有局部不变性的特征 -- ORB特征,从它的名字中可以看出它 ...
- Corba概念(GIOP、IIOP、IOR、ORB、IDL)
CORBA公用对象请求代理(调度)程序体系结构(Common Object Request Broker Architecture),缩写为 CORBA,是对象管理组织(Object Manageme ...
- 学习OpenCV——ORB简化版&Location加速版
根据前面surf简化版的结构,重新把ORB检测的代码给简化以下,发现虽然速度一样,确实能省好多行代码,关键是有 BruteForceMatcher<HammingLUT>matcher的帮 ...
- ORB:新一代 Linux 应用
Orbital Apps 给我们带来了一种新的软件包类型 ORB,它具有便携软件.交互式安装向导支持,以及离线使用的能力. 便携软件很方便.主要是因为它们能够无需任何管理员权限直接运行,也能够带着所有 ...
- 特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)
一.基本概念: 作用:特征点提取在"目标识别.图像拼接.运动跟踪.图像检索.自动定位"等研究中起着重要作用: 主要算法: •FAST ,Machine Learning forHi ...
- (二)ORB描述子提取源码思路与实现
ORBSLAM2中ORB特征提取的特点 ORBSLAM2中通过对OpenCV中的ORB特征点提取类进行修改,对图像进行分块提取,而后划分节点,使得每个节点中保存的特征点性能是该节点所有特征点中最好的. ...
- (一)ORB描述子提取
ORBSLAM2中使用ORB描述子的方法 经典的视觉SLAM系统大体分为两种:其一是基于特征点法的,其二是基于直接法的.那么本文主要就讲特征点法的SLAM. 基于特征点法的视觉SLAM系统典型的有PT ...
随机推荐
- (转抄:人人都是产品经理——iamsujie)如何提高产品规划PPT的能力
做产品几年之后,不可避免的要碰到写规划这件事儿,虽说不少人,不乏大牛,对规划持“无用论”的观点, 但大多数人其实还是更相信这个段子: 在一个公司里,看一个人的地位,主要看他平时写的文档类型——写wor ...
- 安卓xml文件中常见的问题
1.EditText显示不完全
- 《精通MVC5.0》路由笔记
MVC使用路由系统处理请求的URL.路由系统主要功能 检查请求的URL,并理解该URL对应的控制器和方法 生成URL地址 在MVC程序中有两种方式创建路由:convention-based routi ...
- WebApi系列~基于RESTful标准的Web Api
微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码 ...
- GestureDetectorl监听
package com.example.gesturedetectorinterface; /** * write by harvic * 2014-9-25 * blog.csdn.net/harv ...
- Hibernate2
计应134(实验班) 杨伟 Hibernate 中提供了两级Cache(高速缓冲存储器),第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存由hibernate管理的,一 ...
- Leetcode 给一个数a和一个向量b,找出该向量b中的2个数相加等于a,并输出这两个数在向量中的位置
看C++primer Plus看的无聊,第一次做Leetcode的练习,本来想做二维向量的,结果始终通不过,查了原因,必须用一维的... 一维的答案: class Solution { public ...
- [转]bash快捷键
生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率. 编辑命令 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按字符前移(右向) ...
- hypermesh2flac3d
hypermesh2ansys2flac3d 目的: 将hypermesh中划分的网格输出到flac3d中.过程是hypermesh12.0-ansys13.0-flac3d3.0. 视频教程详见:h ...
- 2013年最棒的4个PHP框架
PHP 框架可以帮你编写简洁可重用的代码,遵循 MVC 模式,确保应用逻辑和展现分离.有很多很多的框架各有千秋,有的性能好,有的文档全,还有的提供大量的内建功能等等. 这里我们罗列的 2013 年最好 ...