简单介绍

BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,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代码

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp> using namespace cv; int main(int argc, char** argv)
{
Mat img_1 = imread("img1.png");
Mat img_2 = imread("img2.png"); // -- Step 1: Detect the keypoints using STAR Detector
std::vector<KeyPoint> keypoints_1,keypoints_2;
StarDetector detector;
detector.detect(img_1, keypoints_1);
detector.detect(img_2, keypoints_2); // -- Stpe 2: Calculate descriptors (feature vectors)
BriefDescriptorExtractor brief;
Mat descriptors_1, descriptors_2;
brief.compute(img_1, keypoints_1, descriptors_1);
brief.compute(img_2, keypoints_2, descriptors_2); //-- Step 3: Matching descriptor vectors with a brute force matcher
BFMatcher matcher(NORM_HAMMING);
std::vector<DMatch> mathces;
matcher.match(descriptors_1, descriptors_2, mathces);
// -- dwaw matches
Mat img_mathes;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, mathces, img_mathes);
// -- show
imshow("Mathces", img_mathes); waitKey(0);
return 0;
}

实验结果

代码分析

在头文件features2d.hpp中定义了BRIEF算法的函数及參数:

class CV_EXPORTS BriefDescriptorExtractor : public DescriptorExtractor
{
public:
static const int PATCH_SIZE = 48; //S为48即窗体为48x48
static const int KERNEL_SIZE = 9; //高斯滤波器窗体为9x9 // bytes is a length of descriptor in bytes. It can be equal 16, 32 or 64 bytes.
BriefDescriptorExtractor( int bytes = 32 );//保存特征的空间为32字节,即32x8=256bit
...
...
...
}

对于參数的解释,写在參数定义后面。

在执行调试时,在观察窗体能够看到,在img1中检測到14个特征点,img2中检測到76个:

以img1为例,14个特征点,每一个特征点用一个32字节(256bit)的二进制编码描写叙述,则有:

进一步查看上图中第二个红框的信息,这表明特征描写叙述子存放的位置,起始地址是:0x01c08030。结束地址为:0x01c081f0。

能够看到,这就是终于提取到的特征点描写叙述编码了。一行32个字节。共14行,刚好相应img1的14个特征点。同理可知img2中得到了76个特征编码。假如以img1中的特征为准。在img2中寻找与其匹配的特征点,结果例如以下:

能够看到,img1中的14个特征点依次与img2中的第74、47、... 、29特征点配成一对,终于匹配效果见上面的实验结果图。

BRIEF算法优劣

长处

1、计算速度快

缺点

1、对噪声敏感(由于二进制编码是通过比較详细像素值来判定的)

2、不具备旋转不变性

3、不具备尺度不变性

參考资料

1、BRIEF:Binary Robust Independent Elementary Features[J].2010 ECCV.

2、基于ORB特征的检測检測与跟踪的研究[硕士论文],谢成明,2013.

3、基于ORB特征和粒子滤波的目标跟踪算法研究[硕士论文],章杰,2014.

4、基于ORB和改进RANSAC算法的图像拼接技术[J],2015.

【特征检測】BRIEF特征点描写叙述算法的更多相关文章

  1. Chromium网页输入事件捕捉和手势检測过程分析

    连续的输入事件可能会产生一定的手势操作.比如滑动手势和捏合手势. 在Chromium中,网页的输入事件是在Browser进程中捕捉的.Browser进程捕获输入事件之后,会进行手势操作检測.检測出来的 ...

  2. 目标检測的图像特征提取之(一)HOG特征

    1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检測的特征描写叙述子.它通过计算和统计图像局部区 ...

  3. 【OpenCV新手教程之十八】OpenCV仿射变换 &amp; SURF特征点描写叙述合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)  ...

  4. 【OpenCV新手教程之十七】OpenCV重映射 &amp; SURF特征点检測合辑

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨)  ...

  5. OpenCV特征点检測------Surf(特征点篇)

    Surf(Speed Up Robust Feature) Surf算法的原理                                                              ...

  6. OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)

    收入囊中 拉普拉斯算子 LOG算子(高斯拉普拉斯算子) OpenCV Laplacian函数 构建自己的拉普拉斯算子 利用拉普拉斯算子进行图像的锐化 葵花宝典 在OpenCV2马拉松第14圈--边缘检 ...

  7. 操作系统栈溢出检測之ucosII篇

    操作系统栈溢出检測之uc/osII篇 Author               :       David Lin (林鹏) E-mail               :       linpeng1 ...

  8. 行人检測之HOG特征(Histograms of Oriented Gradients)

    之前的文章行人计数.计次提到HOG特征这个概念,这两天看了一下原版的论文,了解了一下HOG特征的原理,并依据自己的理解将这种方法的流程写了下来,假设有不正确的地方欢迎指正. HOG(Histogram ...

  9. 【从零学习openCV】IOS7下的人脸检測

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

随机推荐

  1. Leetcode 400.第n个数

    第n个数 在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字. 为整形范围内 ( n < 231). 示例 1: 输入: 3 输出 ...

  2. Leetcode 336.回文对

    回文对 给定一组唯一的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串. 示例 1: 输入: ["abcd&quo ...

  3. TOJ3039: 材质贴图

    3039: 材质贴图  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 46       ...

  4. RSA工作原理

    摘自:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html 一.基础数论 1.互质关系 如果两个正整数,除了1以外,没有 ...

  5. P1168 中位数 (优先队列,巧解)

    题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. 输入 ...

  6. Gdb学习笔记1

    其实,从很早就开始接触gdb程序,gdb调试程序伴我成长,现在对其用法记录以下: 当程序的运行结果和预期结果不一致,或者程序出现运行错误时,gdb就可以派上大用处了.调试的基本过程是:  -> ...

  7. 学习linux之 rwx对于目录和档案的意义(节选自鸟哥)

    權限對檔案的重要性 檔案是實際含有資料的地方,包括一般文字檔.資料庫內容檔.二進位可執行檔(binary program)等等. 因此,權限對於檔案來說,他的意義是這樣的: r (read):可讀取此 ...

  8. 多线程之 Volatile 变量 详解

    Java 理论与实践: 正确使用 Volatile 变量 原文:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html 总结: volati ...

  9. css3 画半圆和1/4圆

    半圆: #circle1 { width: 100px; height: 200px; background-color: #a72525; -webkit-border-radius: 100px ...

  10. JFinal Weixin 1.6发布【转】

    原文:http://www.oschina.net/news/69495/jfinal-weixin-1-6-released#rd 继JFinal 2.1发布之后,再来一发JFinal Weixin ...