天天看點

Opencv學習筆記(六)SURF學習筆記

本人挺菜的,肯定有非常多錯誤纰漏之處 ,希望大家不吝指正。 

     看了harris角點檢測之後,開始研究SURF角點檢測,發現挺複雜的,一時也僅僅了解了大概,把了解的東西總結下,以便下次深入學習。

     SURF角點檢測算法是對SIFT的一種改進,主要體如今速度上,效率更高。它和SIFT的主要差别是圖像多尺度空間的建構方法不同。

    在計算視覺領域,尺度空間被象征性的表述為一個圖像金字塔,向下降採樣一般用高斯金字塔。當中,輸入圖像函數重複與高斯函數的核卷積并重複對其進行二次抽樣,這樣的方法主要用于SIFT算法的實作,但每層圖像依賴于原圖像(目前尺度可能和原圖象尺度相差非常大,這時候再那原圖像卷積确實有點二了),而且圖像須要重設尺寸,是以,這樣的計算方法運算量較大。SURF算法對積分圖像進行操作,卷積僅僅和前一幅圖像有關,其降採樣的方法是申請添加�圖像核的尺寸,這也是SIFT算法與SURF算法在使用金字塔原理方面的不同。SURF算法同意尺度空間多層圖像同一時候被處理,不需對圖像進行二次抽樣,進而提高算法性能。

    其他方面的差别,以我菜鳥級的認識,差不大多。

    附上兩篇SIFT相關的博文,講得還是比較透徹的,兩篇結合起來看基本能明确其原理。

    兩篇講的東西有點出入,隻是對比着看還是能找出問題的,當然啃論文最easy找出問題了。

SIFT簡單介紹:http://www.360doc.com/content/11/1230/23/3054335_176200661.shtml

SIFT算法心得:http://www.360doc.com/content/11/1207/17/3054335_170430459.shtml

    其它博文:

SIFT/SURF算法的深入剖析——談SIFT的精妙與不足:http://hi.baidu.com/xiaoduo170/blog/item/a22bcc1c2349708286d6b636.html

SIFT/SURF系列:http://www.yongblog.com/archives/tag/surf%E7%AE%97%E6%B3%95

    SURF論文和源代碼(論文講得非常具體,代碼c++實作):

opencv小試SURF算法:

#include "opencv2/opencv.hpp"
 
int main(){
    cv::Mat  image, image1 = cv::imread ("test.jpg");
    //灰階變換
    cv::cvtColor (image1,image,CV_BGR2GRAY);
    std::vector<cv::KeyPoint> keypoints;
    cv::SurfFeatureDetector surf(2500);
    surf.detect (image,keypoints);
    cv::drawKeypoints (image,keypoints,image,cv::Scalar::all (255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

    cv::namedWindow ("surf");
    cv::imshow ("surf",image);
    cv::waitKey (0);
    return 0;
}

      

測試結果:

Opencv學習筆記(六)SURF學習筆記

标記圈的半徑長短和特征點所在尺度有關,那條半徑是特征點的方向。