咱们已经知道SIFT特征采用了128维的特征描述子,因为描述子用的浮点数,因此它将会占用512 bytes的空间。相似地,对于SURF特征,常见的是64维的描述子,它也将占用256bytes的空间。若是一幅图像中有1000个特征点(不要惊讶,这是很正常的事),那么SIFT或SURF特征描述子将占用大量的内存空间,对于那些资源紧张的应用,尤为是嵌入式的应用,这样的特征描述子显然是不可行的。并且,越占有越大的空间,意味着越长的匹配时间。html
可是实际上SFIT或SURF的特征描述子中,并非全部维都在匹配中有着实质性的做用。咱们能够用PCA、LDA等特征降维的方法来压缩特征描述子的维度。还有一些算法,例如LSH,将SIFT的特征描述子转换为一个二值的码串,而后这个码串用汉明距离进行特征点之间的匹配。这种方法将大大提升特征之间的匹配,由于汉明距离的计算能够用异或操做而后计算二进制位数来实现,在现代计算机结构中很方便。下面来们提取一种二值码串的特征描述子。算法
BRIEF[1]应运而生,它提供了一种计算二值串的捷径,而并不须要去计算一个相似于SIFT的特征描述子。它须要先平滑图像,而后在特征点周围选择一个Patch,在这个Patch内经过一种选定的方法来挑选出来个点对。而后对于每个点对
,咱们来比较这两个点的亮度值,若是
则这个点对生成了二值串中一个的值为1,若是
,则对应在二值串中的值为-1,不然为0。全部
个点对,都进行比较之间,咱们就生成了一个
长的二进制串。测试
对于的选择,咱们能够设置为128,256或512,这三种参数在OpenCV中都有提供,可是OpenCV中默认的参数是256,这种状况下,非匹配点的汉明距离呈现均值为128比特征的高斯分布。一旦维数选定了,咱们就能够用汉明距离来匹配这些描述子了。ui
值得注意的是,对于BRIEF,它仅仅是一种特征描述符,它不提供提取特征点的方法。因此,若是你必须使一种特征点定位的方法,如FAST、SIFT、SURF等。这里,咱们将使用CenSurE方法来提取关键点,对BRIEF来讲,CenSurE的表现比SURF特征点稍好一些。spa
整体来讲,BRIEF是一个效率很高的提取特征描述子的方法,同时,它有着很好的识别率,但当图像发生很大的平面内的旋转。code
设咱们在特征点的邻域块大小为内选择
个点对
,Calonder的实验中测试了5种采样方法:orm
1)在图像块内平均采样;htm
2)和
都符合
的高斯分布;blog
3)符合
的高斯分布,而
符合
的高斯分布;
4)在空间量化极坐标下的离散位置随机采样
5)把固定为
,
在周围平均采样
下面是上面5种采样方法的结果示意图。
#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.