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


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

一、前提

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

 

 

2、在VS2010內引入sift源碼:在“資源管理器”視圖里添加“篩選器”,命名為sift,將剛才拷貝過來的sift源文件引入其內:

 

 

 

 

 

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

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

 4、取消.c文件的預編譯:同樣在“資源管理器”視圖下面復選sift文件夾內所有.c文件,右鍵選擇“屬性”,選取“C/C++”->“預編譯頭”,在“預編譯頭”選項中選擇“不使用預編譯頭”。

 

 

 

 

 

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

 


 

 1、運行問題

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

2、

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM