BRIEF特征点描述算法

简介

BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度直方图描述特征点的传统方法,大大的加快了特征描述符建立的速度,同时也极大的降低了特征匹配的时间,是一种非常快速,很有潜力的算法。

BRIEF具体算法

由于BRIEF仅仅是特征描述子,所以事先要得到特征点的位置,可以利用FAST特征点检测算法Harris角点检测算法或SIFT、SURF等算法检测特征点的位置。接下来在特征点邻域利用BRIEF算法建立特征描述符。

算法步骤如下:

1、为减少噪声干扰,先对图像进行高斯滤波(方差为2,高斯窗口为9x9)。

2、以特征点为中心,取SxS的邻域大窗口。在大窗口中随机选取一对(两个)5x5的子窗口,比较子窗口内的像素和(可用积分图像完成),进行二进制赋值。(一般S=31)

其中,p(x),p(y)分别随机点x=(u1,v1),y=(u2,v2)所在5x5子窗口的像素和。

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中定义了BRIEAF算法的函数及参数:

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特征点配成一对,最终匹配效果见上面的实验结果图。

参考资料

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

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

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 06:01:27

BRIEF特征点描述算法的相关文章

【OpenCV入门教程之十八】OpenCV仿射变换 &amp; SURF特征点描述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

OpenCV4Android 提取特征点描述符(Feature Descriptor)

OpenCV4Android 提取特征点描述符(Feature Descriptor) 在得到keypoints之后(参考前面),通过使用相应的FeatureDescriptor就可计算得到关键点处的描述子. Native Code: JNIEXPORT void JNICALL Java_com_example_test_NativeUtil_computeDescripors( JNIEnv *env, jclass thiz, jlong mGrayAddr, jlong mRgbaAdd

OpenCV仿射变换 &amp; SURF特征点描述合辑

OpenCV仿射变换 & SURF特征点描述合辑 转载地址:http://blog.csdn.net/poem_qianmo/article/details/33320997?utm_source=tuicool&utm_medium=referral

基于特征的推荐算法【转】

http://in.sdo.com/?p=2779 推荐算法准确度度量公式: 其中,R(u)表示对用户推荐的N个物品,T(u)表示用户u在测试集上喜欢的物品集合. 集合相似度度量公式(N维向量的距离度量公式): Jaccard公式: 其中,N(u)表示用户u有过正反馈的物品集合. 余弦相似度公式: UserCF公式: 其中,S(u,k)表示和用户u兴趣最接近的K个用户集合:N(i)表示对物品i有过正反馈的用户集合:w(u,v)表示用户u和用户v的兴趣相似度:r(v,i)表示用户v对物品i的兴趣.

关于描述算法复杂度的一些说明

描述算法复杂度时,常用o(1), o(n), o(logn), o(nlogn)表示对应算法的时间复杂度,是算法的时空复杂度的表示.不仅仅用于表示时间复杂度,也用于表示空间复杂度. O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系.其中的n代表输入数据的量. 比如时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍.比如常见的遍历算法.再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度.比如冒泡排序,就是典型的O(

蚂蚁金服核心技术:百亿特征实时推荐算法揭秘

本文来自蚂蚁金服人工智能部认知计算组的基础算法团队,文章提出一整套创新算法与架构,通过对TensorFlow底层的弹性改造,解决了在线学习的弹性特征伸缩和稳定性问题,并以GroupLasso和特征在线频次过滤等自研算法优化了模型稀疏性,在支付宝核心推荐业务获得了uvctr的显著提升,并较大地提升了链路效率. 0.综述 在线学习(Online learning)由于能捕捉用户的动态行为,实现模型快速自适应,进而成为提升推荐系统性能的重要工具.然而它对链路和模型的稳定性,训练系统的性能都提出了很高的

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资料都可以查到,简单来说,就是将图像分成一个cell,通过对每个cell的像素进行梯度处理,进而根据梯度方向和梯度幅度来得到cell的图像特征.随后,将每个cell的图像特征连接起来,得到一个BLock的特征,进而得到一张图片的特征.Opencv当中自带HOG算法,可以直接调用,进行图像的特征提取.但

Paxos算法细节详解(一)--通过现实世界描述算法

最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bitbucket.org/sciascid/libpaxos 下载.对paxos算法有初步了解之后,再看此文的效果会更好:如果你也想分析libpaxos3的话,此文应该会对你有不小帮助:关于paxos的历史这里不多做介绍,关于描述paxos算法写的最好的一篇文章应该就是维基百科了,地址戳这里:http://zh.wik

JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度. 2.处理方式 1).记录数组一共有几行几列,有多少个不同的值 2).把具有不同值的元素的行列及值记录在稀疏数组中,可以缩小程序代码的复杂度. 3.图解描述 稀疏数组表示 [0] 3 4 4 二维数组,3行,4列,4个非0的值: [1] 1 2 2 一行