本人是图像处理界的新手一枚,最近两天搞一下SIFT特征提取的程序编写工作。将整体的构建以及问题解决过程抛出来,给后来人以警示,同时作为科研道路上的一些笔记之用,并欢迎高手批评指点。接下来拉开序幕。
前提:必须具备 vs2010、 C++语言的编程经验,并且懂得相关的配置方法。
1、安装vs2010以及OpenCv2.3.1
其安装过程这里就不在赘述,网上有大批的资源可以浏览。(如果找不到可以给我发邮件)。本人的OpenCv安装的路径为:D:\OpenCv\opencv 如图下图所示。路径大家一定要记好,因为这牵扯到后面环境变量的配置。
2、环境变量配置
① 环境变量PATH配置:右击Computer->属性,按照图2-1的箭头所示顺序设置好OpenCv的PATH变量配置。本人的Path路径设定为:D:\OpenCv\opencv\build\x86\vc10\bin。你的需要根据实际情况。
② OPECV变量设置:环境变量PATH配置:右击Computer->属性,按照图2-1的箭头所示顺序设置好OpenCv的PATH变量配置。本人的Path路径设定为:D:\OpenCv\opencv\build。切记你的需要根据实际情况。
3、头文件、库文件配置(每次你使用OpenCv进行相关编程的时候,都要检查相应配置是否有问题,这是第一解决思路),接下来我以网上的SIFT程序为例进行说明。
① 新建控制台程序SIFT。(这里不再赘述)
② 添加包含头文件。右击工程->属性,然后按照图的顺序点开,在包含目录中分别添加相应的文件夹:D:\OpenCv\opencv\build\include;D:\OpenCv\opencv\build\include\opencv;D:\OpenCv\opencv\build\include\opencv2。(切记这是我的路径)
③ 添加库目录,步骤如②类似,添加库目录:D:\OpenCv\opencv\build\x86\vc10\lib
④ 添加Debug动态链接库,在“活动(Debug)”的“附加依赖库”中追加下面一行(包括所有分号,勿删VS原始数据):
opencv_core231d.lib;opencv_highgui231d.lib;opencv_video231d.lib;opencv_ml231d.lib;opencv_legacy231d.lib;opencv_imgproc231d.lib。具体步骤如图。⑤添加Release动态链接库,在“活动(Debug)”的“附加依赖库”中追加下面一行(包括所有分号,勿删VS原始数据):
opencv_core230.lib;opencv_highgui230.lib;opencv_video230.lib;opencv_ml230.lib;opencv_legacy230.lib;opencv_imgproc230.lib。具体步骤如图:
4、运行程序
先上代码:
#include "stdafx.h"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include
#include
using namespace std;
using namespace cv;
int main( int argc, char** argv )
{
Mat img_1 = imread( "d:\\image1.jpg", CV_LOAD_IMAGE_GRAYSCALE );
Mat img_2 = imread( "d:\\image2.jpg", CV_LOAD_IMAGE_GRAYSCALE );
if( !img_1.data || !img_2.data )
{ std::cout<< " --(!) Error reading images " << std::endl; return -1; }
//-- Step 1: Detect the keypoints using SURF Detector
int minHessian = 400;
SurfFeatureDetector detector( minHessian );
std::vector keypoints_1, keypoints_2;
detector.detect( img_1, keypoints_1 );
detector.detect( img_2, keypoints_2 );
//-- Draw keypoints
Mat img_keypoints_1; Mat img_keypoints_2;
drawKeypoints( img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
drawKeypoints( img_2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
//-- Show detected (drawn) keypoints
imshow("Keypoints 1", img_keypoints_1 );
imshow("Keypoints 2", img_keypoints_2 );
waitKey(0);
return 0;
}
不要着急,给你代码你能运行出来吗?网上的代码各种各样,看本文的都是新手(老手请不用嘲讽,老手自动Pass),出个bug你都解决不了,看我娓娓道来。
问题1:两个头文件:
#include "opencv2/features2d/features2d.hpp";
#include "opencv2/highgui/highgui.hpp";
不要以为加上这个头文件就没问题了(如果你配置高明,没问题算你福气,我的就出错误)。如果你出现的错误是这样的:
解决方法:根据上图箭头标注的问题点,寻找highgui.hpp和features2d.hpp所需的动态链接库:opencv_highgui231.lib和opencv_features2d231.lib。所有的动态链接库的位子都在:D:\OpenCv\opencv\build\x86\vc10\bin,如下图所示。
你的
问题2:如果出现缺少tbb.dll的问题
解决方法:
① 将OpenCV安装路径D:\Program Files\opencv2.3.1\build\common\tbb\ia32\vc10下的tbb.dll复制一份并重命名为tbb_debug.dll
② 将上面得到的tbb_debug.dll拷贝到安装路径D:\Program Files\opencv2.3.1\build\ x86\vc10\bin 目录下即可。
问题3:当运行上述代码的时候,大家会出现如此错误:图片只要大于50×50就报错,错误如下图所示。
这种问题的出现是程序的问题,图像太大导致数据溢出,程序把图像大小写死了。
解决方法:只需要修改程序中的参数即可或者你可以通过检测图片大小自行赋值,如下图
完毕,上结果。
由于水平有限、文字功底有限,表达不足还请阅贴者见谅,如有问题请联系:[email protected].感谢您的阅览。
需