BRIEF 特征描述子
FROM:http://www.cnblogs.com/ronny/p/4081362.html
Binary Robust Independent Elementary Features
www.cnblogs.com/ronny
1. BRIEF的基本原理
我們已經(jīng)知道SIFT特征采用了128維的特征描述子,由于描述子用的浮點(diǎn)數(shù),所以它將會(huì)占用512 bytes的空間。類似地,對(duì)于SURF特征,常見的是64維的描述子,它也將占用256bytes的空間。如果一幅圖像中有1000個(gè)特征點(diǎn)(不要驚訝,這是很正常的事),那么SIFT或SURF特征描述子將占用大量的內(nèi)存空間,對(duì)于那些資源緊張的應(yīng)用,尤其是嵌入式的應(yīng)用,這樣的特征描述子顯然是不可行的。而且,越占有越大的空間,意味著越長的匹配時(shí)間。
?
但是實(shí)際上SFIT或SURF的特征描述子中,并不是所有維都在匹配中有著實(shí)質(zhì)性的作用。我們可以用PCA、LDA等特征降維的方法來壓縮特征描述子的維度。還有一些算法,例如LSH,將SIFT的特征描述子轉(zhuǎn)換為一個(gè)二值的碼串,然后這個(gè)碼串用漢明距離進(jìn)行特征點(diǎn)之間的匹配。這種方法將大大提高特征之間的匹配,因?yàn)闈h明距離的計(jì)算可以用異或操作然后計(jì)算二進(jìn)制位數(shù)來實(shí)現(xiàn),在現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)中很方便。下面來們提取一種二值碼串的特征描述子。
?
BRIEF[1]應(yīng)運(yùn)而生,它提供了一種計(jì)算二值串的捷徑,而并不需要去計(jì)算一個(gè)類似于SIFT的特征描述子。它需要先平滑圖像,然后在特征點(diǎn)周圍選擇一個(gè)Patch,在這個(gè)Patch內(nèi)通過一種選定的方法來挑選出來nd個(gè)點(diǎn)對(duì)。然后對(duì)于每一個(gè)點(diǎn)對(duì)(p,q),我們來比較這兩個(gè)點(diǎn)的亮度值,如果I(p)>I(q)則這個(gè)點(diǎn)對(duì)生成了二值串中一個(gè)的值為1,如果I(p)<I(q),則對(duì)應(yīng)在二值串中的值為-1,否則為0。所有nd個(gè)點(diǎn)對(duì),都進(jìn)行比較之間,我們就生成了一個(gè)nd長的二進(jìn)制串。
?
對(duì)于nd的選擇,我們可以設(shè)置為128,256或512,這三種參數(shù)在OpenCV中都有提供,但是OpenCV中默認(rèn)的參數(shù)是256,這種情況下,非匹配點(diǎn)的漢明距離呈現(xiàn)均值為128比特征的高斯分布。一旦維數(shù)選定了,我們就可以用漢明距離來匹配這些描述子了。
值得注意的是,對(duì)于BRIEF,它僅僅是一種特征描述符,它不提供提取特征點(diǎn)的方法。所以,如果你必須使一種特征點(diǎn)定位的方法,如FAST、SIFT、SURF等。這里,我們將使用CenSurE方法來提取關(guān)鍵點(diǎn),對(duì)BRIEF來說,CenSurE的表現(xiàn)比SURF特征點(diǎn)稍好一些。
總體來說,BRIEF是一個(gè)效率很高的提取特征描述子的方法,同時(shí),它有著很好的識(shí)別率,但當(dāng)圖像發(fā)生很大的平面內(nèi)的旋轉(zhuǎn)。
2. 關(guān)于點(diǎn)對(duì)的選擇
設(shè)我們?cè)谔卣鼽c(diǎn)的鄰域塊大小為S×S內(nèi)選擇nd個(gè)點(diǎn)對(duì)(p,q),Calonder的實(shí)驗(yàn)中測試了5種采樣方法:
1)在圖像塊內(nèi)平均采樣;
2)p和q都符合(0,125S2)的高斯分布;
3)p符合(0,125S2)的高斯分布,而q符合(0,1100S2)的高斯分布;
4)在空間量化極坐標(biāo)下的離散位置隨機(jī)采樣
5)把p固定為(0,0),q在周圍平均采樣
下面是上面5種采樣方法的結(jié)果示意圖。
?
2. OpenCV實(shí)現(xiàn)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.
總結(jié)
以上是生活随笔為你收集整理的BRIEF 特征描述子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 避免图像去雾算法中让天空部分出现过增强的
- 下一篇: 目标检测中背景建模方法