【計算機視覺】BRIEF特徵匹配

Binary Robust Independent Elementary Features

www.cnblogs.com/ronnycss

1. BRIEF的基本原理

咱們已經知道SIFT特徵採用了128維的特徵描述子,因爲描述子用的浮點數,因此它將會佔用512 bytes的空間。相似地,對於SURF特徵,常見的是64維的描述子,它也將佔用256bytes的空間。若是一幅圖像中有1000個特徵點(不要驚訝,這是很正常的事),那麼SIFT或SURF特徵描述子將佔用大量的內存空間,對於那些資源緊張的應用,尤爲是嵌入式的應用,這樣的特徵描述子顯然是不可行的。並且,越佔有越大的空間,意味着越長的匹配時間。html

 

可是實際上SFIT或SURF的特徵描述子中,並非全部維都在匹配中有着實質性的做用。咱們能夠用PCA、LDA等特徵降維的方法來壓縮特徵描述子的維度。還有一些算法,例如LSH,將SIFT的特徵描述子轉換爲一個二值的碼串,而後這個碼串用漢明距離進行特徵點之間的匹配。這種方法將大大提升特徵之間的匹配,由於漢明距離的計算能夠用異或操做而後計算二進制位數來實現,在現代計算機結構中很方便。下面來們提取一種二值碼串的特徵描述子。算法

 

BRIEF[1]應運而生,它提供了一種計算二值串的捷徑,而並不須要去計算一個相似於SIFT的特徵描述子。它須要先平滑圖像,而後在特徵點周圍選擇一個Patch,在這個Patch內經過一種選定的方法來挑選出來nd個點對。而後對於每個點對(p,q),咱們來比較這兩個點的亮度值,若是I(p)>I(q)則這個點對生成了二值串中一個的值爲1,若是I(p)<I(q),則對應在二值串中的值爲-1,不然爲0。全部nd個點對,都進行比較之間,咱們就生成了一個nd長的二進制串。測試

 

對於nd的選擇,咱們能夠設置爲128,256或512,這三種參數在OpenCV中都有提供,可是OpenCV中默認的參數是256,這種狀況下,非匹配點的漢明距離呈現均值爲128比特徵的高斯分佈。一旦維數選定了,咱們就能夠用漢明距離來匹配這些描述子了。ui

值得注意的是,對於BRIEF,它僅僅是一種特徵描述符,它不提供提取特徵點的方法。因此,若是你必須使一種特徵點定位的方法,如FAST、SIFT、SURF等。這裏,咱們將使用CenSurE方法來提取關鍵點,對BRIEF來講,CenSurE的表現比SURF特徵點稍好一些。spa

整體來講,BRIEF是一個效率很高的提取特徵描述子的方法,同時,它有着很好的識別率,但當圖像發生很大的平面內的旋轉。code

2. 關於點對的選擇

設咱們在特徵點的鄰域塊大小爲S×S內選擇nd個點對(p,q),Calonder的實驗中測試了5種採樣方法:orm

1)在圖像塊內平均採樣;htm

2)pq都符合(0,125S2)的高斯分佈;blog

3)p符合(0,125S2)的高斯分佈,而q符合(0,1100S2)的高斯分佈;

4)在空間量化極座標下的離散位置隨機採樣

5)把p固定爲(0,0)q在周圍平均採樣

下面是上面5種採樣方法的結果示意圖。

image image

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; 
}

WAZNVG5NFSKT3D@1L5H)1M5

 

[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.

相關文章
相關標籤/搜索