VS2010+Opencv+SIFT以及出現的問題-關於代碼sift_3_c的說明

http://blog.sina.com.cn/s/blog_a6b913e30101dvrt.html

1、前提

安裝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

 

2、測試

一、解壓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調試運行,成功顯示:

 

 

 

 


 

3、在C++工程中應用SIFT

一、在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內。

 

 

二、在VS2010內引入sift源碼:在「資源管理器」視圖裏添加「篩選器」,命名爲sift,將剛纔拷貝過來的sift源文件引入其內:

 

 

 

 

 

三、在須要使用sift方法的地方添加對應頭文件:

#include "..\sift\sift.h" #include "..\sift\imgfeatures.h" #include "..\sift\utils.h" 

 四、取消.c文件的預編譯:一樣在「資源管理器」視圖下面複選sift文件夾內全部.c文件,右鍵選擇「屬性」,選取「C/C++」->「預編譯頭」,在「預編譯頭」選項中選擇「不使用預編譯頭」。

 

 

 

 

 

五、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. debug版:opencv_calib3d243d.lib; opencv_contrib243d.lib; opencv_core243d.lib; opencv_features2d243d.lib; opencv_flann243d.lib; opencv_gpu243d.lib; opencv_haartraining_engined.lib; opencv_highgui243d.lib; opencv_imgproc243d.lib; opencv_legacy243d.lib; opencv_ml243d.lib; opencv_nonfree243d.lib; opencv_objdetect243d.lib; opencv_photo243d.lib; opencv_stitching243d.lib; opencv_ts243d.lib; opencv_video243d.lib; opencv_videostab243d.lib;

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

 


 

 一、運行問題

運行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);便可。

二、

 fatal error LNK1104: 沒法打開文件「libgsl.a」

 

  1. 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."

  2. In the "Solution Explorer," right click on the name of your project and go to "Properties."

  3. Under Configuration Properties->Linker->General->Additional Library Directories, type in "C:\GnuWin32\lib"

  4. Under Configuration Properties->Linker->Input->Additional Dependencies, type in "libgslcblas.a libgsl.a"

  5. Under Configuration Properties->C/C++->General->Additional Include Directories, type in "C:\GnuWin32\include"

  6. 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各庫文件 都要添加正確才行!

 
相關文章
相關標籤/搜索