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的更多相关文章

  1. OpenCV特征点检测------ORB特征

    OpenCV特征点检测------ORB特征 ORB是是ORiented Brief的简称.ORB的描述在下面文章中: Ethan Rublee and Vincent Rabaud and Kurt ...

  2. opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较

    opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较 参考: http://wenku.baidu.com/link?url=1aDYAJBCrrK-uk2w3sSNai7h52x_ ...

  3. ORB特征点检测

    Oriented FAST and Rotated BRIEF www.cnblogs.com/ronny   这篇文章我们将介绍一种新的具有局部不变性的特征 -- ORB特征,从它的名字中可以看出它 ...

  4. Corba概念(GIOP、IIOP、IOR、ORB、IDL)

    CORBA公用对象请求代理(调度)程序体系结构(Common Object Request Broker Architecture),缩写为 CORBA,是对象管理组织(Object Manageme ...

  5. 学习OpenCV——ORB简化版&Location加速版

    根据前面surf简化版的结构,重新把ORB检测的代码给简化以下,发现虽然速度一样,确实能省好多行代码,关键是有 BruteForceMatcher<HammingLUT>matcher的帮 ...

  6. ORB:新一代 Linux 应用

    Orbital Apps 给我们带来了一种新的软件包类型 ORB,它具有便携软件.交互式安装向导支持,以及离线使用的能力. 便携软件很方便.主要是因为它们能够无需任何管理员权限直接运行,也能够带着所有 ...

  7. 特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)

    一.基本概念: 作用:特征点提取在"目标识别.图像拼接.运动跟踪.图像检索.自动定位"等研究中起着重要作用: 主要算法: •FAST ,Machine Learning forHi ...

  8. (二)ORB描述子提取源码思路与实现

    ORBSLAM2中ORB特征提取的特点 ORBSLAM2中通过对OpenCV中的ORB特征点提取类进行修改,对图像进行分块提取,而后划分节点,使得每个节点中保存的特征点性能是该节点所有特征点中最好的. ...

  9. (一)ORB描述子提取

    ORBSLAM2中使用ORB描述子的方法 经典的视觉SLAM系统大体分为两种:其一是基于特征点法的,其二是基于直接法的.那么本文主要就讲特征点法的SLAM. 基于特征点法的视觉SLAM系统典型的有PT ...

随机推荐

  1. caffe安装过程中遇到的问题以及解决方法

    1. 在安装依赖库的时候,遇到: @gxjun-Latitude-E5440:~$ sudo apt-get install libatlas-base-dev 正在读取软件包列表... 完成 正在分 ...

  2. mac OS.NE开发环境搭建

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入,申请备注填写姓名+技术+工作年限) Q  Q:408365330     E-Mail:eg ...

  3. 实际项目中的一个angularjs 应用

    实际需求:通过下拉框,选择自己需要的类型,创建元素(要求必须是输入点击保存了才能出现对应的类型块) html代码: <div class="list-panel-data"& ...

  4. CSS3让一段文字多余的用省略号表示,当鼠标移动上去的时候显示全部文字

    <style type="text/css"> div { width:100px; overflow:hidden; white-space:nowrap; text ...

  5. php学习笔记之wamp安装配置

    一.下载apache.php.mariadb apache 下载地址:http://www.apachehaus.com/cgi-bin/download.plx VC9版本分为:32位版.64位版. ...

  6. networkcomms 相关文章(转载)

    介绍开源的.net通信框架NetworkComms框架之一 首字节验证 介绍开源的.net通信框架NetworkComms框架之二 传递类 介绍开源的.net通信框架NetworkComms框架之三 ...

  7. 字符编码笔记:ASCII,Unicode和UTF-8(转载)

    作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...

  8. CentOS 7 Mysql yum源

    CentOS 7 安装Mysqlrpm -ivh http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpmyum install m ...

  9. Xcode7免证书真机调试

    最近一直忙于项目,对于Xcode7的一些新功能还没去尝试,今天尝试了下挺好用的!避免了以前真机调试繁琐的配置,很是爽啊.又可以节约很多小伙伴的时间了.废话不多说咱们一起来配置一下. 第一步 打开需要真 ...

  10. leetcode6

    好吧,今天晚上赶项目确实是做不了三道题目了,最近项目在网络编程方面有些进步,学到了东西,有时间再积累下来,很深的体会就是,和别人一起写代码,虽然蛋疼但是比自己一个人写要好点,不过发现自己对链表和排序什 ...