BRIEF 特征描述子

Binary Robust Independent Elementary Features

1. BRIEF的基本原理

我们已经知道SIFT特征采用了128维的特征描述子,由于描述子用的浮点数,所以它将会占用512 bytes的空间。类似地,对于SURF特征,常见的是64维的描述子,它也将占用256bytes的空间。如果一幅图像中有1000个特征点(不要惊讶,这是很正常的事),那么SIFT或SURF特征描述子将占用大量的内存空间,对于那些资源紧张的应用,尤其是嵌入式的应用,这样的特征描述子显然是不可行的。而且,越占有越大的空间,意味着越长的匹配时间。

但是实际上SFIT或SURF的特征描述子中,并不是所有维都在匹配中有着实质性的作用。我们可以用PCA、LDA等特征降维的方法来压缩特征描述子的维度。还有一些算法,例如LSH,将SIFT的特征描述子转换为一个二值的码串,然后这个码串用汉明距离进行特征点之间的匹配。这种方法将大大提高特征之间的匹配,因为汉明距离的计算可以用异或操作然后计算二进制位数来实现,在现代计算机结构中很方便。下面来们提取一种二值码串的特征描述子。

BRIEF[1]应运而生,它提供了一种计算二值串的捷径,而并不需要去计算一个类似于SIFT的特征描述子。它需要先平滑图像,然后在特征点周围选择一个Patch,在这个Patch内通过一种选定的方法来挑选出来$n_d$个点对。然后对于每一个点对$(p,q)$,我们来比较这两个点的亮度值,如果$I(p)>I(q)$则这个点对生成了二值串中一个的值为1,如果$I(p)<I(q)$,则对应在二值串中的值为-1,否则为0。所有$n_d$个点对,都进行比较之间,我们就生成了一个$n_d$长的二进制串。

对于$n_d$的选择,我们可以设置为128,256或512,这三种参数在OpenCV中都有提供,但是OpenCV中默认的参数是256,这种情况下,非匹配点的汉明距离呈现均值为128比特征的高斯分布。一旦维数选定了,我们就可以用汉明距离来匹配这些描述子了。

值得注意的是,对于BRIEF,它仅仅是一种特征描述符,它不提供提取特征点的方法。所以,如果你必须使一种特征点定位的方法,如FAST、SIFT、SURF等。这里,我们将使用CenSurE方法来提取关键点,对BRIEF来说,CenSurE的表现比SURF特征点稍好一些。

总体来说,BRIEF是一个效率很高的提取特征描述子的方法,同时,它有着很好的识别率,但当图像发生很大的平面内的旋转。

2. 关于点对的选择

设我们在特征点的邻域块大小为$S\times S$内选择$n_d$个点对$(p,q)$,Calonder的实验中测试了5种采样方法:

1)在图像块内平均采样;

2)$p$和$q$都符合$(0,\frac{1}{25}S^2)$的高斯分布;

3)$p$符合$(0,\frac{1}{25}S^2)$的高斯分布,而$q$符合$(0,\frac{1}{100}S^2)$的高斯分布;

4)在空间量化极坐标下的离散位置随机采样

5)把$p$固定为$(0,0)$,$q$在周围平均采样

下面是上面5种采样方法的结果示意图。

2. OpenCV实现BRIEF

#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("box.png");
    Mat img_2 = imread("box_in_scene.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;
}

 

[1] Michael Calonder, Vincent Lepetit, Christoph Strecha, and Pascal Fua, “BRIEF: Binary Robust Independent Elementary Features”, 11th European Conference on Computer Vision (ECCV), Heraklion, Crete. LNCS Springer, September 2010.

时间: 2024-11-09 01:54:43

BRIEF 特征描述子的相关文章

SIFT解析(三)生成特征描述子

以上两篇文章中检测在DOG空间中稳定的特征点,lowe已经提到这些特征点是比Harris角点等特征还要稳定的特征.下一步骤我们要考虑的就是如何去很好地描述这些DOG特征点. 下面好好说说如何来描述这些特征点.许多资料中都提到SIFT是一种局部特征,这是因为在SIFT描述子生成过程中,考虑的是该特征点邻域特征点的分布情况(而没有利用全局信息).本步骤中主要计算过程包括:确定特征点的方向和生成特征描述符. 确定特征点方向 在特征点的确定过程中,特征点的坐标以及尺度被确定下来(坐标很重要,尺度更重要,

【特征匹配】BRIEF特征描述子原理及源码解析

相关:Fast原理及源码解析 Harris原理及源码解析 SIFT原理及源码解析 SURF原理及源码解析 转载请注明出处: http://blog.csdn.net/luoshixian099/article/details/48338273 传统的特征点描述子如SIFT,SURF描述子,每个特征点采用128维(SIFT)或者64维(SURF)向量去描述,每个维度上占用4字节,SIFT需要128×4=512字节内存,SURF则需要256字节.如果对于内存资源有限的情况下,这种描述子方法显然不适应

8.2 特征描述子

8.1 尺度空间 图像特征中尺寸空间的相关理论基础. 8.1.1尺度与旋转不变性 局部不变性:尺度不变性(视觉远近与目标认知分析无关)和旋转不变性(旋转操作与目标认知分析无关) 特征描述 目标特征分析:关键点检测与关键点提取 8.2.1 SIFT特征 关键点检测和描述算法 优点:旋转.尺度.平移.视角及亮度不变性:对参数调整鲁棒性好(根据场景调整适宜特征点数量) 该算法对图像局部特征点提取包括4个步骤:疑似关键点检测.去除伪关键点.关键点梯度与方向匹配及特征向量生成 SIFT特征检测及匹配: h

【综述】(中科院)樊彬老师-“局部图像特征描述概述”

[综述](中科院)樊彬老师-“局部图像特征描述概述” 这次我们荣幸地邀请到中国科学院自动化研究所的樊彬老师为我们撰写图像特征描述符方面的最新综述.樊彬老师在图像特征描述方面已连续发表了包括TPAMI.PR.ICCV.CVPR在内的多篇高质量论文.他的个人主页为:http://www.sigvc.org/bfan/ 以后我们将持续邀请国内外众多老师做最新的视觉计算专业综述报告,如特征提取和描述.稀疏表达.人体跟踪.三维衣服布料动画.轻量级Web3D等,并陆续在学术论坛上发布.各位老师会尽量使综述通

BRIEF描述子生成算法

学习OpenCV关注微信公众号[OpenCV学堂] 一:介绍 我们知道SIFT算法通常通过对每个关键点生成128个特征向量作为描述子.SURF算法通常对关键点生成最少64个特征向量作为描述子.但是对于图像来说创建上千或者上万个这样的描述子内存开销比较大,运行速度受到严重影响.特别对嵌入式设备与一定设备来说,内存限制尤为明显,而且匹配的时候计算也比较耗时. 但是实际上这些特征数据OpenCV在匹配的时候并没有完全利用上,而是通过PCA.LDA等方法对它进行压缩,或者是LSH(局部敏感哈希)方法把这

线特征LSD and 描述子LBD(一)

最近在看有关特征提取的线特征,暑期就看了相关的论文:<基于点线综合特征的双目视觉SLAM方法_谢晓佳>,最近呢,把里面有关线特征提取LSD和描述子LBD的代码跑了一遍,记录如下: [1]LSD: a Line Segment Detector线段检测器 LSD是一种局部提取直线的算法,速度比Hough要快. LSD是一种直线检测分割算法,它能在线性的时间内得出亚像素级精度的检测结果.该算法被设计成可以在任何数字图像上都无需参数调节.它可以自己控制误检的数量:平均而言,每张图有一个误检. 有几篇

OpenCV之特征检测器(Feature Detector),描述子提取器(Descriptor Extractor)和描述子匹配器(Descriptor Matcher)

1.特征检测子 -Harris cv::cornerHarris(image,strength,3,3,0.01); -Fast cv::Ptr<cv::FastFeatureDetector> fast = cv::FastFeatureDetector::create(); //或 cv::FAST(InputArray image, std::vector<KeyPoint> &keypoints, int threshold) //或 cv::FAST(InputA

线特征LSD and 描述子LBD---LBD算法(二)

上一节主要是介绍LSD算法理论,这节主要是介绍LBD算法. 1.尺度空间中提取线段 为了克服在线检测碎片问题和提高大尺度变化的性能,我们的检测框架采用由对原始图像进行搞死下采样( with a set of 尺度因子and 高斯模糊 )的尺度空间金字塔组成(N层图像).我们首先用Edline算法每层的尺度空间产生一组线.每一条直线都有一个方向,它是由从直线左边到右边的大部分边缘像素的梯度构成的.然后通过在尺度空间中找到对应的直线来组织它们.在尺度空间中所有的线,他们被分配一个唯一的ID,如果图像

灰度共生矩阵的纹理描述子

纹理描述子(纹理特征):最大概率.相关.对比度.能量.同质.熵 I=imread('C:\Users\Jv\Desktop\纹理3.jpg'); gray=rgb2gray(I); GS=graycomatrix(gray,'NumLevels',256);%水平位置算子计算共生矩阵 GSn=GS/sum(GS(:));%归一化矩阵 stats=graycoprops(GS,'all');%共生矩阵的描述子 maxProbability=max(GSn(:));%最大概率 corr=stats.