VS2010+Opencv+SIFT以及出现的问题-关于代码sift_3_c的说明
一、前提
安装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源码,发现有如下文件:
VS2010+Opencv+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调试运行,成功显示:
VS2010+Opencv+SIFT以及出现的问题" height="300" width="465">三、在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内。
VS2010+Opencv+SIFT以及出现的问题">
VS2010+Opencv+SIFT以及出现的问题">3、在需要使用sift方法的地方添加对应头文件:
#include "..\sift\sift.h" #include "..\sift\imgfeatures.h" #include "..\sift\utils.h"
4、取消.c文件的预编译:同样在“资源管理器”视图下面复选sift文件夹内所有.c文件,右键选择“属性”,选取“C/C++”->“预编译头”,在“预编译头”选项中选择“不使用预编译头”。
VS2010+Opencv+SIFT以及出现的问题">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、运行问题
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各库文件 都要添加正确才行!
VS2010+Opencv+SIFT以及出现的问题-关于代码sift_3_c的说明的更多相关文章
- OpenCV学习:Windows+VS2010+OpenCV配置
OpenCV下载: 百度云下载:https://pan.baidu.com/s/1mhAExdu (2.4.9版本) 下载完成后,双击运行exe,选择输出目录,我选择的是C:\OpenCV 配置环境变 ...
- VS2010 OpenCV 2.4.6 配置 (Win7 32位)
1.下载安装OpenCV 下载OpenCV-2.4.6.0 (文件大小 291M),下载地址如下,下载完成后解压缩到路径%OpenCV%下,本文%OpenCV%=E:\图像处理与计算机视觉. http ...
- OpenCV SIFT原理与源码分析
http://blog.csdn.net/xiaowei_cqu/article/details/8069548 SIFT简介 Scale Invariant Feature Transform,尺度 ...
- win7 32/64bit VS2010 OpenCV 2.4.9 环境配置
作者 : 卿笃军 因为近期人脸识别须要用到OpenCV,让我開始了OpenCV学习. OpenCV 2.4.9下载地址:http://sourceforge.net/projects/opencvli ...
- python opencv SIFT,获取特征点的坐标位置
备注:SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向.SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点.边缘点.暗区的亮点及 ...
- OpenCV——SIFT特征检测与匹配
SIFT特征和SURF特征比较 比较项目 SIFT SURF 尺度空间极值检测 使用高斯滤波器,根据不同尺度的高斯差(DOG)图像寻找局部极值 使用方形滤波器,利用海森矩阵的行列式值检测极值,并利用积 ...
- Opencv Sift算子特征提取与匹配
SIFT算法的过程实质是在不同尺度空间上查找特征点(关键点),用128维方向向量的方式对特征点进行描述,最后通过对比描述向量实现目标匹配. 概括起来主要有三大步骤: 1.提取关键点: 2.对关键点附加 ...
- Opencv Sift和Surf特征实现图像无缝拼接生成全景图像
Sift和Surf算法实现两幅图像拼接的过程是一样的,主要分为4大部分: 1. 特征点提取和描述 2. 特征点配对,找到两幅图像中匹配点的位置 3. 通过配对点,生成变换矩阵,并对图像1应用变换矩阵生 ...
- opencv::sift特征提取
SIFT特征检测介绍 SIFT(Scale-Invariant Feature Transform)特征检测关键特性: -建立尺度空间,寻找极值 -关键点定位(寻找关键点准确位置与删除弱边缘) -关键 ...
随机推荐
- Python成长笔记 - 基础篇 (三)python列表元组、字典、集合
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 一.列表和元组的操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义 ...
- C/C++中static关键字详解
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...
- 使用javamail发送邮件错误:550 5.7.1 Unable to relay
这两天由于客户的邮件服务器迁移,使用了NTLM的验证方式.系统使用javamailAPI进行发送邮件时,发现只能对内部邮箱进行发送,对外部邮箱进行发送的时候,报下图错误: 后面发现是由于系统的java ...
- vimium: 浏览器神器
chrome firefox 都有 vimium (firefox 中为vimfx), 快捷键也差不多 下边是chrome中快捷键示意图: G = shift + g (其他同理) c+e = ctr ...
- vpn与局域网冲突解决方案
打开vpn后,所有通过网卡发出去的包都会走vpn,而不会走局域网,所以局域网无法访问,vpn为本机指定路由,让网卡把包发给vpn线路(比如10网段).如果为本机指定到达局域网的路由,访问局域网的包就知 ...
- Lambda表达式的前世今生
Lambda 表达式 早在 C# 1.0 时,C#中就引入了委托(delegate)类型的概念.通过使用这个类型,我们可以将函数作为参数进行传递.在某种意义上,委托可理解为一种托管的强类型的函数指针. ...
- [C++] socket -7 [邮槽]
::利用邮槽实现windons进程通信 ::一般情况下CreateMailslot()常被使用在进程通信的服务器上,在客户端则是用函数CreateFile()打开指定的邮槽之后进行相关的操作. ::将 ...
- 使用UEditor无法SetContent的问题
无法SetContent是因为 <script id="txtContent" name="txtContent" type="text/pla ...
- 如何试用Office 365 及 SharePoint Online(美版)
Office 365已经在国外运营一段时间了,本文主要帮助大家注册一个试用账户.废话少说按步骤来: 进入注册页面,链接地址 . 1. 对于不同的企业,提供了不同的套餐,这里我们试用这个中等企业的套餐, ...
- PAAS平台构建7×24小时高可用应用的方案设计
本博客迁移到部署在jae上的独立博客系统wordpress,博客地址:点击打开独立博客.欢迎大家一起来讨论IT技术. 现在很多企业都在搭建自己的私有PAAS平台,当然也有很多大型互联网公司搭建共有PA ...