1. 程式人生 > >一些SIFT程式碼連結

一些SIFT程式碼連結

sift創始人的程式碼:David Lowe's SIFT code:

美國加州大學洛杉磯分校(University of California at Los Angeles) Andrea Vedaldi 博士研究生給出的基於David Lowe 發表的論文給利用Matlab和C語言混合程式設計給出的Sift detector and descriptor的實現過程。

貌似很豐富

不過更易用的似乎是Rob Hess維護的sift 庫:

 但在使用rob程式碼的時候發現其非關鍵程式碼中的一個錯誤,而且他的程式碼只適於做驗證,我做了一些小小的改變,使之可以更為方便的使用,可以再命令列下輸入圖片,並儲存結果為圖片和文字。檔名是被硬編碼進去的

------------------------------------------------------------------------------------------------------------------------------------

這裡要感謝David Lowe這個大牛,不但提供了一種強悍的特徵匹配演算法,還給出了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個方向。

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

Sift演算法與VC程式碼:
http://download.csdn.net/source/1481248