SIFT算法學習:特征提取函數的使用

openkk 14年前發布 | 63K 次閱讀 SIFT算法 算法

   SIFT算法的介紹參見:SIFT算法學習小記

     前面有朋友問到Sift特征點的提取方法,這里簡單做個介紹。

     作為一種匹配能力較強的局部描述算子,SIFT算法的實現相當復雜,但從軟件開發的角度來說,只要會使用其中幾個比較重要的函數就行了。這里要感謝David Lowe這個大牛,不但提供了一種強悍的特征匹配算法,還給出了C++的實現代碼,后來有人用C#實現了這個算法,需要的朋友可到網上自行下載。
       
     關鍵函數一:

     int sift_features( IplImage* img, struct feature** feat )

     這個函數就是用來提取圖像中的特征向量。參數img為一個指向IplImage數據類型的指針,用來表示需要進行特征提取的圖像。IplImage是opencv庫定義的圖像基本類型(關于opencv是一個著名的圖像處理類庫,詳細的介紹可以參見http://www.opencv.org.cn)。參數feat 是一個數組指針,用來存儲圖像的特征向量。函數調用成功將返回特征向量的數目,否則返回-1.

 

     關鍵函數二:

     int _sift_features( IplImage* img, struct feature** feat, int intvls,double sigma, double contr_thr, int curv_thr, int img_dbl, int descr_width, int descr_hist_bins )

     這個函數是函數一的重載,作用是一樣的,實際上函數一只不過是使用默認參數調用了函數二,核心的代碼都是在函數二中實現的。下面將詳細介紹一下其他的幾個參數。

     intvls: 每個尺度空間的采樣間隔數,默認值為3.

     sigma: 高斯平滑的數量,默認值1.6.

     contr_thr:判定特征點是否穩定,取值(0,1),默認為0.04,這個值越大,被剔除的特征點就越多。

     curv_thr:判定特征點是否邊緣點,默認為6.

     img_dbl:在建立尺度空間前如果圖像被放大了1倍則取值為1,否則為0.

     descr_width:計算特征描述符時鄰域子塊的寬度,默認為4.

     descr_hist_bins:計算特征描述符時將特征點鄰域進行投影的方向數,默認為8,分別是0,45,90,135,180,215,270,315共8個方向。

      如果只是做特征提取,上面這個函數就足夠了,不同圖像之間的匹配都是建立在這個基礎上的,如果你有足夠強的編程能力即使不懂這個算法也能夠編寫出像樣的程序來,因為下面的比較說白了都是數據結構的比較,跟算法已經沒有太多關系了。如果想要深入了解算法,還是認真的看論文和代碼吧。

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!