一、前提
安裝Opencv,因該版本的SIFT是基於Opencv的。
下載SIFT源碼,見Rob Hess的主頁(別告訴我不懂英文不知道下載鏈接在哪,下那個Windows VC++的版本 sift-latest_win.zip)。
其中有3個是解決方案文件夾:siftFeat、match和dspFeat,siftFeat工程是做SITF特征提取的,一般只會用到這個案例,match是利用SIFT特征做圖像匹配的,desFeat沒用過不說了。
所有源代碼(包括上面3個工程的main)都在文件夾外面,就是那些成對的.h和.c了。
二、測試
1、解壓sift源碼,發現有如下文件:

2、可以先試着跑跑siftFeat。
打開siftFeat.sln,配置好Opencv在VS2010中的環境參數,別忘了在link選項中添加
opencv_legacy243d.lib;opencv_imgproc243d.lib;opencv_core243d.lib;opencv_highgui243d.lib;
opencv_video243d.lib;opencv_ml243d.lib;
和相應的路徑,采用的opencv2.43版本,路徑分別為:C:\opencv\build\include;C:\opencv\build\include\opencv;
lib:C:\opencv\build\x86\vc10\lib;
注意include里面要添加/include/opencv,因為sift源碼直接引用了/include/opencv目錄下的頭文件)。
編譯報錯:
1>utils.obj : error LNK2001: 無法解析的外部符號 _va_end
1>utils.obj : error LNK2001: 無法解析的外部符號 _va_start
說好了源碼里面有些東西是要改的:在utils.c中#include 就OK了。
F5調試運行,成功顯示:

三、在C++工程中應用SIFT
1、在VS2010中新建自己的C++工程PP。在工程根目錄內添加目錄命名為sift,將sift源碼文件imgfeatures.c imgfeatures.h kdtree.c kdtree.h minpq.c minpq.h sift.c sift.h utils.c utils.h xform.c xform.h(即除了match.c siftfeat.c dspfeat.c的所有源碼文件)復制到\PP\sift內。


3、在需要使用sift方法的地方添加對應頭文件:
#include "..\sift\sift.h" #include "..\sift\imgfeatures.h" #include "..\sift\utils.h"

5、C語法設定:分別打開imgfeatures.h和sift.h,讓所有函數包含在
#ifdef __cplusplus extern "C" { #endif
和
#ifdef __cplusplus } #endif
之間。例如:
PS:我只是用了_sift_features(...)等幾個函數,所以只加了兩個頭文件的C語法聲明,如果是用了其他的頭文件,均需要添加。
6、綜上,你應該可以直接使用sift相關函數了,參照siftfeat.c中的寫法,用用_sift_features(...)試試!
實際上如果只需要使用SIFT特征提取的函數,前面幾步只需要復制imgfeatures.c imgfeatures.h sift.c sift.h utils.c utils.h這6個文件就夠了。
http://blog.csdn.net/lanbing510/article/details/8507341
問題1:
上面代碼是C語言編程,一邊可能會出現問題,應將“項目--屬性--C/C++--預編譯頭”設置為“不使用預編譯頭”;
問題2:
問題就是運行siftFeature工程時 出現兩個錯誤,一是 cvSaveImage 輸入參數太少,一是cvEigenVV函數輸入參數太少,可以在程序中對應的函數名上點右鍵,選擇轉到定義,就能看到,opencv2.0中的函數定義參數個數變多了。可以在程序中,將cvSaveImage( out_img_name, img);改成
cvSaveImage( out_img_name, img,0); 將cvEigenVV( &M, &V, &E, DBL_EPSILON);改成
cvEigenVV( &M, &V, &E, DBL_EPSILON,-1,-1);即可。
問題3:
如果編譯時出現不能打開cvd.lib或xxx.lib的情況,原因是opencv2.0以后的版本的cvd.lib已經改變(例如opencv2.0為 cv200d.lib),這個變化在 opencv安裝目錄\lib中可以看到。只需在相應的工程->屬性->連接器->輸入的debug和release中將相應的 xxxd.lib改成xxx200d.lib,在release下是xxx.lib改成xxx200.lib;例如2.4.3版應添加如下:
1.
2.release版
opencv_calib3d243.lib; opencv_contrib243.lib; opencv_core243.lib; opencv_features2d243.lib; opencv_flann243.lib; opencv_gpu243.lib; opencv_haartraining_engine.lib; opencv_highgui243.lib; opencv_imgproc243.lib; opencv_legacy243.lib; opencv_ml243.lib; opencv_nonfree243.lib; opencv_objdetect243.lib; opencv_photo243.lib; opencv_stitching243.lib; opencv_ts243.lib; opencv_video243.lib; opencv_videostab243.lib
1、運行問題
cvSaveImage( out_img_name, img,0); 將cvEigenVV( &M, &V, &E, DBL_EPSILON);改成
cvEigenVV( &M, &V, &E, DBL_EPSILON,-1,-1);即可。
2、
Within VisualStudio, go to File->New->Project, then "Visual C++ Projects," then "Win32," then "Win32 Console Application." Enter a name and click "OK." On the next screen click "Finish."
In the "Solution Explorer," right click on the name of your project and go to "Properties."
Under Configuration Properties->Linker->General->Additional Library Directories, type in "C:\GnuWin32\lib"
Under Configuration Properties->Linker->Input->Additional Dependencies, type in "libgslcblas.a libgsl.a"
Under Configuration Properties->C/C++->General->Additional Include Directories, type in "C:\GnuWin32\include"
Under Configuration Properties->C/C++->Code Generation->Runtime Library,select "Multi-threaded DLL"
如果編譯時出現不能打開cvd.lib或xxx.lib的情況,原因是opencv2.0版本的cvd.lib已經變成了cv200d.lib,這個變化 在 opencv安裝目錄\\lib中可以看到。只需在相應的工程->屬性->連接器->輸入的debug和release中將相應 的xxxd.lib改成xxx200d.lib,在release下是xxx.lib改成xxx200.lib;注意opencv原來有的庫文 件,opencv2.0可能不存在或改換了別的名,如cvcam.lib,我目前不知道在opencv2.0中,它在哪里,因此,我就將這一各lib從附 加項中刪掉了,沒有影響程序運行。目前程序調試成功。
首先需要對工程的opencv 以及Opengl各庫文件 都要添加正確才行!