前言
实验主要是图像的特征提取以及特征匹配。
在Opencv中集成了常用的几种特征提取以及匹配方法,比如SIFT,SURF,以及orb特征。
所以第一部的实验计划就是在Windows下跑OpenCV,并且跑一下SIFT特征提取方法。
实验环境
Visual Studio 2013
Windows 7
OpenCV3.1.0
CMake 3.6.2(因为再往前的话没有64位版本)
配置步骤
第一步
首先是在Visual Studio加入OpenCV,这一步比较简单,跟着教程:OpenCV3.1.0+VS2013开发环境配置,基本没有什么坑。
第二步 在OpenCV中加入opencv_contrib
因为特征提取的方法在OpenCV库是不包含的,需要额外添加支持库,这个库叫opencv_contrib
,这个添加步骤比较繁琐,大体按照这个教程来OpenCV 3.1.0 + opencv_contrib编译(Windows),但是从我的环境中还是出现了几处有问题的地方,在这里要注意一下:
1. CMake版本一定要选择64位版本,我用的是CMake 3.6.2 x64
版本
2. 在第一次编译的时候,点击Config的时候,选择的是visual studio 12 2013 x64
3. 第一次编译电脑要翻墙,否则有一个文件会下不了(这一步教程也提到了)
4. 第一次编译之后,CMake中间的对话框汇报警告(红色)这个不用担心不用管它,接着按教程来
5. 用CMake GUI编译两次之后,打开位于opencv_contrib-3.1.0\modules\bioinspired\src\opencl文件夹:打开retina_kernel.cl
,把所有的注释的//***删掉,要不打开OpenCV.sln编译会出错。
6. 打开OpenCV.sln之后,选择x64来编译。
7. 第四大步中配置到项目,根据自己的实际情况来配置,教程是x86编译的,我使用x64编译的,文件夹路径会不一样
8. 最后的附加依赖项中,如果在编译的时候是debug版本,那么添加的库名称应该都加上xxxd.lib
系统环境变量中添加path路径
完成以上步骤,在项目中编码是没问题的,但是在运行的时候还是会报...计算机中丢失opencv_xfeatures2d310d.dll
的错误提示框,因为是系统无法找到我们编译之后的库文件。
这时候需要在系统的环境变量——系统变量——path变量中添加opencv_contrib\install\x64\vc12\bin
变量。
我的变量路径是:D:\OpenCV3.1.0\tools\opencv_contrib\install\x64\vc12\bin
。
添加完环境变量之后要重启电脑!
在新项目中调用SIFT方法
最后就可以在新项目中调用SIFT等特征提取以及匹配方法了。
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
using namespace cv;
using namespace std;
void main()
{
Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
//Mat img = cv::imread("F://1.png"); //注意这里的//的方向,一开始写反了,怎么都出不来。
Mat img_1 = imread("F://Data/3.png");
Mat img_2 = imread("F://Data/4.png");
//Detect the keypoints
vector<KeyPoint> keypoints_1, keypoints_2;
f2d->detect(img_1, keypoints_1);
f2d->detect(img_2, keypoints_2);
//Calculate descriptors (feature vectors)
Mat descriptors_1, descriptors_2;
f2d->compute(img_1, keypoints_1, descriptors_1);
f2d->compute(img_2, keypoints_2, descriptors_2);
//Matching descriptor vector using BFMatcher
BFMatcher matcher;
vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
//绘制匹配出的关键点
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
imshow("【match图】", img_matches);
//等待任意按键按下
waitKey(0);
}