安裝Opencv,因該版本的SIFT是基於Opencv的。html
下載SIFT源碼,見Rob Hess的主頁(別告訴我不懂英文不知道下載連接在哪,下那個Windows VC++的版本 sift-latest_win.zip)。web
其中有3個是解決方案文件夾:siftFeat、match和dspFeat,siftFeat工程是作SITF特徵提取的,通常只會用到這個案例,match是利用SIFT特徵作圖像匹配的,desFeat沒用過不說了。編程
全部源代碼(包括上面3個工程的main)都在文件夾外面,就是那些成對的.h和.c了。ide
一、解壓sift源碼,發現有以下文件:函數
二、能夠先試着跑跑siftFeat。測試
打開siftFeat.sln,配置好Opencv在VS2010中的環境參數,別忘了在link選項中添加ui
opencv_legacy243d.lib;opencv_imgproc243d.lib;opencv_core243d.lib;opencv_highgui243d.lib;spa
opencv_video243d.lib;opencv_ml243d.lib;.net
和相應的路徑,採用的opencv2.43版本,路徑分別爲:C:\opencv\build\include;C:\opencv\build\include\opencv;debug
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調試運行,成功顯示:
一、在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內。
三、在須要使用sift方法的地方添加對應頭文件:
#include "..\sift\sift.h" #include "..\sift\imgfeatures.h" #include "..\sift\utils.h"
五、C語法設定:分別打開imgfeatures.h和sift.h,讓全部函數包含在
#ifdef __cplusplus extern "C" { #endif
和
#ifdef __cplusplus } #endif
之間。例如:
PS:我只是用了_sift_features(...)等幾個函數,因此只加了兩個頭文件的C語法聲明,若是是用了其餘的頭文件,均須要添加。
六、綜上,你應該能夠直接使用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
一、運行問題
二、
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各庫文件 都要添加正確才行!