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

 
相关文章
相关标签/搜索