opencv::sift特征提取


 

SIFT特征檢測介紹 SIFT(Scale-Invariant Feature Transform)特征檢測關鍵特性: 
-建立尺度空間,尋找極值
-關鍵點定位(尋找關鍵點准確位置與刪除弱邊緣) 
-關鍵點方向指定 
-關鍵點描述子 

 

關鍵點定位
我們在像素級別獲得了極值點的位置,但是更准確的 值應該在亞像素位置,如何得到 – 這個過程稱為關鍵 點(准確/精准)定位
刪除弱邊緣- 通過Hassian 矩陣特征值實現,小於閾值 自動舍

 

建立尺度空間,尋找極值。工作原理 
1. 構建圖像高斯金字塔,求取DOG,發現最大與最小值在每一級 
2. 構建的高斯金字塔,每一層根據sigma的值不同,可以分為幾個等級,最少有4 個。

 

關鍵點定位 
在像素級別獲得了極值點的位置,但是更准確的 值應該在亞像素位置,如何得到 – 這個過程稱為關鍵 點(准確
/精准)定位。 刪除弱邊緣- 通過Hassian 矩陣特征值實現,小於閾值 自動舍

 

關鍵點方向指定 
求得每一層對應圖像的梯度,根據給定的窗口大小 
計算每個高斯權重,sigma=scalex1.5, 0~360之間建立 36個直方圖Bins 
找最高峰對應的Bin, 大於max*80% 的都保留 。這樣就實現了旋轉不變性,提高了匹配時候的穩定性。 
大約有15%的關鍵點會有多個方向。

 

關鍵點描述子 
擬合多項式插值尋找最大Peak 
得到描述子 = 4x4x8=128

 

cv::xfeatures2d::SIFT::create(
  int nfeature=0,
  int nOctaveLayers=3,
  double contrastThreshold=0.04,
  double edgeThreshold=10,
  double sigma=1.6
)

 

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>

using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;

int main(int argc, char** argv) {
    Mat src = imread("D:/vcprojects/images/test.png", IMREAD_GRAYSCALE);
    if (src.empty()) {
        printf("could not load image...\n");
        return -1;
    }
    namedWindow("input image", CV_WINDOW_AUTOSIZE);
    imshow("input image", src);

    int numFeatures = 400;
    Ptr<SIFT> detector = SIFT::create(numFeatures);
    vector<KeyPoint> keypoints;
    detector->detect(src, keypoints, Mat());
    printf("Total KeyPoints : %d\n", keypoints.size());

    Mat keypoint_img;
  //繪制 drawKeypoints(src, keypoints, keypoint_img, Scalar::all(
-1), DrawMatchesFlags::DEFAULT); namedWindow("SIFT KeyPoints", CV_WINDOW_AUTOSIZE); imshow("SIFT KeyPoints", keypoint_img); waitKey(0); return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM