OpenCV版本:opencv-2.4.9.exe
程序版本:默认为32位
特别注意,Release版本与Debug版本的lib不可混用,二者的区分方法是,Debug的lib文件文件名以‘d’结尾,而Release没有‘d’。混用会出现不可预知的异常。使用Debug调试时,切记属性中配置与平台都为Debug版本,即如下图
配置流程:
第一步:
安装OpenCV,安装过程实际就是解压过程,将OpenCV放置在合适目录后,添加适合VS版本的bin目录到系统环境变量中,版本对应关系为
vc10-->VS2008
vc11-->VS2010
vc12-->VS2013
添加路径如下:D:\opencv\build\x86\vc12\bin
第二步:
在项目中附加OpenCV头文件目录,如下图所示:
三个路径分别为
D:\opencv\build\include;
D:\opencv\build\include\opencv;
D:\opencv\build\include\opencv2
第三步:
配置库目录,如下图所示:
注意,静态库目录与bin目录处于同一个文件夹,也就是说,系统Path中添加的bin必须与此处添加的lib的父目录相同。二者一个是lib一个是对应的dll,缺一不可。
第四步:
添加lib依赖,注意,debug模式下,的lib文件名的末尾均有字母‘d’,如果使用程序为release模式,则需要将lib重新修改为名称末尾不含‘d’的lib。具体添加位置如下图所示:
添加的lib文件列表如下:
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
末尾的数字249表示OpenCV的版本号,所以使用不同版本的OpenCV时,数字会有所不同,实际使用时,只需要批量替换即可。
第五步:
OpenCV的Logger中打开文件使用的是fopen,但在VS2013中,使用fopen函数会直接被置为错误,并提示如下错误:fopen_s提供了文件的溢出检测,更加安全,但此刻却妨碍了程序顺利执行。
不需要修改代码,只需要在VS2013的预处理时,将此类错误抛除即可,修改方法如下:
添加内容为 _CRT_SECURE_NO_WARNINGS。
测试程序://源码来自官方的 Tutorial,网址
//http://docs.opencv.org/2.4.9/doc/tutorials/features2d/feature_description/feature_description.html#feature-description
#include "stdafx.h"
#include
#include
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/features2d.hpp"
using namespace cv;
using namespace std;
void readme();
/** @function main */
int main()
{
Mat c_src1 = imread("..\\pics\\3.jpg");
Mat c_src2 = imread("..\\pics\\4.jpg");
Mat img_1 = imread("..\\pics\\3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat img_2 = imread("..\\pics\\4.jpg", CV_LOAD_IMAGE_GRAYSCALE);
if (!img_1.data || !img_2.data)
{
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);
//-- Step 2: Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor;
Mat descriptors_1, descriptors_2;
extractor.compute(img_1, keypoints_1, descriptors_1);
extractor.compute(img_2, keypoints_2, descriptors_2);
//--Step o1,draw key points on images
Mat res1, res2;
int drawmode = DrawMatchesFlags::DEFAULT;
drawKeypoints(c_src1, keypoints_1, res1, Scalar::all(-1), drawmode);
drawKeypoints(c_src2, keypoints_1, res2, Scalar::all(-1), drawmode);
//-- Step 3: Matching descriptor vectors with a brute force matcher
BFMatcher matcher(NORM_L2);
std::vector< DMatch > matches;
matcher.match(descriptors_1, descriptors_2, matches);
//-- Draw matches
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
//-- Show detected matches
imshow("descriptor1", res1);
imshow("descriptor2", res2);
imshow("Matches", img_matches);
waitKey(0);
return 0;
}
/** @function readme */
void readme()
{
std::cout << " Usage: ./SURF_descriptor " << std::endl;
}
略作修改,在原图中画出了特征点,使用特征为Surf即传说中SIFT的加速版,结果如下:
Q&A