BRIEF 特徵點描述算法

一、BRIEF特徵點描述算法簡介
  BRIEF是Binary Robust Independent Elementary Features的縮寫。這個特徵描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特徵點附近隨機選取若干點對,將這些點對的灰度值的大小,組合成一個二進制串,並將這個二進制串作爲該特徵點的特徵描述子。這種方法擯棄了利用區域灰度直方圖描述特徵點的傳統方法,大大的加快了特徵描述符建立的速度,同時也極大的降低了特徵匹配的時間,所以它是一種非常快速的算法,可應用於滿足實時性的系統。
  需要注意的是BRIEF算法是特徵點描述子算法,它是用於對已檢測到的特徵點進行描述的,所以其不涉及特徵點的檢測,我們常使用其它方法來進行特徵點的檢測,例如:FAST、SIFT、SURF或Harris等特徵點檢測算法。

二、BRIEF算法的具體步驟
  (1)建立特徵點的一個正方形鄰域。
  (2)對該鄰域用σ=2的高斯核卷積,以消除一些噪聲。這是因爲該描述子隨機性強,對噪聲較爲敏感。
  (3)以一定的隨機化算法生成點對< x,y>,若點x的亮度小於點y的亮度,則返回值1,否則返回0。
  (4)重複第三步若干次(如256次),得到一個256位的二進制編碼,即該特徵點的描述子。

三、隨機點對的選取
  設我們在特徵點的鄰域塊大小爲S×S內選擇nd個點對(p,q),Calonder的實驗中測試了5種採樣方法:
  (1)在圖像塊內平均採樣;
  (2)p和q都符合(0 , 1/25 S2)(0 , 1/25 S2)的高斯分佈;
  (3)p符合(0,1/25 S2)(0,1/25 S2)的高斯分佈,而q符合(0,1/100 S2)(0,1/100 S2)的高斯分佈;
  (4)在空間量化極座標下的離散位置隨機採樣;
  (5)把p固定爲(0,0),q在周圍平均採樣。
  下面是上面5種採樣方法的結果示意圖。

這裏寫圖片描述
這裏寫圖片描述

四、特徵點匹配
  對特徵點進行匹配,這時計算兩特徵點描述子的Hamming距離。判斷是否匹配的依據:經過大量實驗數據測試,不匹配特徵點的描述子的Hamming距離在128左右,匹配點對描述子的Hamming距離則遠小於128。
  注:Hamming距離:表示兩個(相同長度)字對應位不同的數量。具體來說,就是對兩個字符串進行異或運算,並統計結果爲1的個數,那麼這個數就是漢明距離。
  總的來說,特徵配對就是利用漢明距離來進行相關判斷:
  (1)兩個特徵編碼對應bit位上相同元素的個數小於128的,一定不是配對的。
  (2)一幅圖上特徵點與另一幅圖上特徵編碼對應bit位上相同元素的個數最多的特徵點配成一對。

五、OpenCV中的實例
1、代碼

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

2、運行結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章