基于opencv3.1的特征检测、特征点匹配、图像拼接(一)
安装好opencv,opencv_contrib并全部配置好之后,查找了一些大佬的源码,竟无一能运行,主要存在两个问题:
- 无法打开 “opencv2/nonfree/nonfree.hpp”
- 无法打开 "opencv2/legacy/legacy.hpp
问题在于,3.1版本的opencv的opencv2文件夹下没有nonfree和legacy子文件夹,开始在xfeatures2d文件夹下侥幸看到了nonfree.hpp以为可以抢救,后来发现并不可以,理想和现实差距很大。
没有办法只好读opencv自带的源码;位置在:D:\opencv310\opencv\opencv_contrib\modules\xfeatures2d\samples(我的安装路径)
里面有四个很重要的cpp,第三个是surf_matcher;
D:\opencv310\opencv\opencv_contrib\modules\xfeatures2d\src(这个里面有surf.cpp的源码,暂时没有深入研究)
关于surf_matcher
第一次打开这个cpp之后竟无从下手,一堆模板类,主函数一进去就退出,加了几个断点并查阅资料后发现,改动以下部分再运行即可:
先把源码附上:(虽然长但是不是太难)
#include <iostream>
#include <stdio.h>
#include "opencv2/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/core/ocl.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/calib3d.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/xfeatures2d.hpp"
using namespace cv;
using namespace cv::xfeatures2d;
const int LOOP_NUM = 10;
const int GOOD_PTS_MAX = 50;
const float GOOD_PORTION = 0.15f;
int64 work_begin = 0;
int64 work_end = 0;
static void workBegin()
{
work_begin = getTickCount();
}
static void workEnd()
{
work_end = getTickCount() - work_begin;
}
static double getTime()
{
return work_end /((double)getTickFrequency() )* 1000.;
}
struct SURFDetector
{
Ptr<Feature2D> surf;
SURFDetector(double hessian = 800.0)
{
surf = SURF::create(hessian);
}
template<class T>
void operator()(const T& in, const T& mask, std::vector<cv::KeyPoint>& pts, T& descriptors, bool useProvided = false)
{
surf->detectAndCompute(in, mask, pts, descriptors, useProvided);
}
};
template<class KPMatcher>
struct SURFMatcher
{
KPMatcher matcher;
template<class T>
void match(const T& in1, const T& in2, std::vector<cv::DMatch>& matches)
{
matcher.match(in1, in2, matches);
}
};
static Mat drawGoodMatches(
const Mat& img1,