【特征检测】BRIEF特征点描述算法

来源:互联网 发布:阿里云主机多少钱 编辑:程序博客网 时间:2024/05/16 18:07

http://blog.csdn.net/hujingshuang/article/details/46910259

简介

         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代码

[cpp] view plain copy
  1. #include <opencv2/core/core.hpp>   
  2. #include <opencv2/highgui/highgui.hpp>   
  3. #include <opencv2/imgproc/imgproc.hpp>   
  4. #include <opencv2/features2d/features2d.hpp>  
  5.   
  6. using namespace cv;  
  7.   
  8. int main(int argc, char** argv)   
  9. {   
  10.     Mat img_1 = imread("img1.png");   
  11.     Mat img_2 = imread("img2.png");  
  12.   
  13.     // -- Step 1: Detect the keypoints using STAR Detector   
  14.     std::vector<KeyPoint> keypoints_1,keypoints_2;   
  15.     StarDetector detector;   
  16.     detector.detect(img_1, keypoints_1);   
  17.     detector.detect(img_2, keypoints_2);  
  18.   
  19.     // -- Stpe 2: Calculate descriptors (feature vectors)   
  20.     BriefDescriptorExtractor brief;   
  21.     Mat descriptors_1, descriptors_2;   
  22.     brief.compute(img_1, keypoints_1, descriptors_1);   
  23.     brief.compute(img_2, keypoints_2, descriptors_2);  
  24.   
  25.     //-- Step 3: Matching descriptor vectors with a brute force matcher   
  26.     BFMatcher matcher(NORM_HAMMING);   
  27.     std::vector<DMatch> mathces;   
  28.     matcher.match(descriptors_1, descriptors_2, mathces);   
  29.     // -- dwaw matches   
  30.     Mat img_mathes;   
  31.     drawMatches(img_1, keypoints_1, img_2, keypoints_2, mathces, img_mathes);   
  32.     // -- show   
  33.     imshow("Mathces", img_mathes);  
  34.   
  35.     waitKey(0);   
  36.     return 0;   
  37. }  

实验结果


代码分析

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

[cpp] view plain copy
  1. class CV_EXPORTS BriefDescriptorExtractor : public DescriptorExtractor  
  2. {  
  3. public:  
  4.     static const int PATCH_SIZE = 48;   //S为48即窗口为48x48  
  5.     static const int KERNEL_SIZE = 9;   //高斯滤波器窗口为9x9  
  6.   
  7.     // bytes is a length of descriptor in bytes. It can be equal 16, 32 or 64 bytes.  
  8.     BriefDescriptorExtractor( int bytes = 32 );//保存特征的空间为32字节,即32x8=256bit  
  9.     ...  
  10.     ...  
  11.     ...  
  12. }  
对于参数的解释,写在参数定义后面。
在运行调试时,在观察窗口可以看到,在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.



原创粉丝点击