OpenCV入門 - 提取SIFT特徵向量

OpenCV入門 - 提取SIFT特徵向量




    爲了確保旋轉不變性,會以關鍵點爲中心,以關鍵點的方向建立座標軸,不是單獨考察單一的這個關鍵點,而是需要一個鄰域。鄰域中每個小格的方向代表該像素的梯度方向,長度是梯度模大小,在每個4X4的小塊上計算8個方向的梯度方向直方圖,統計每個方向的累加值,形成一個種子點。David G.Lowe建議對每個關鍵點使用4X4=16個種子點進行描述,每個種子點包含8個方向信息,所以一個關鍵點就會產生16X8=128維的信息,形成128維的SIFT特徵向量。下面使用opencv來對一個圖片求特徵向量。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp> //
#include <iostream>
using namespace cv;
using namespace std;

int main(int argc, const char *argv[]){
    const cv::Mat input = cv::imread("input.jpg", 0);// load as grayscale
    cv::Mat descriptors;
    Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("SIFT");

    cv::SiftFeatureDetector detector;
    vector<cv::KeyPoint> keypoints;
    detector.detect(input, keypoints);
    
    extractor->compute(input, keypoints, descriptors);
    cout << descriptors.rows << ":" << descriptors.cols << endl;
    // too many bits
    //cout << descriptors << endl;

    return 0;
}

通過結果可以看到共有266個關鍵點,可以輸出來看看。



參考:

1.opencv 2.4.10 reference

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