用opencv3进行特征点匹配
本篇文章主要是展示如何用opencv3来使用SurfFeatureDetector,SurfDescriptorExtractor,BruteForceMatcher类
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/xfeatures2d.hpp"
#include "iostream"
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
int main()
{
system("color 2F");
Mat srcimage1, srcimage2;
srcimage1 = imread("E:/opencv/base2.jpg");
if (!srcimage1.data)
{
cerr << "srcimage1 input error!" << endl;
return false;
}
srcimage2 = imread("E:/opencv/base3.jpg");
if (!srcimage2.data)
{
cerr << "srcimage2 input error!" << endl;
return false;
}
//使用surf算子求特征点
int minHession = 400;
Ptr<SURF> detector = SURF::create(minHession);
vector<KeyPoint> keypoint1, keypoint2;
//从源图像中找出特征点并存放在vector中
detector->detect(srcimage1, keypoint1);
detector->detect(srcimage2, keypoint2);
//把特征点描绘在图像上
Mat image_keypoint1, image_keypoint2;
drawKeypoints(srcimage1, keypoint1, image_keypoint1, Scalar(0, 0, 255),DrawMatchesFlags::DEFAULT);
drawKeypoints(srcimage2, keypoint2, image_keypoint2, Scalar(0, 255,0), DrawMatchesFlags::DEFAULT);
//计算特征向量
Ptr<SURF> extractor = SURF::create();
Mat descriptors1, descriptors2;
extractor->compute(srcimage1, keypoint1, descriptors1);
extractor->compute(srcimage2, keypoint2, descriptors2);
//使用BruteForce进行匹配
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");
vector<DMatch> matches;
matcher->match(descriptors1, descriptors2, matches);
Mat imagematches;
drawMatches(srcimage1, keypoint1, srcimage2, keypoint2, matches, imagematches);
imshow("Matches", imagematches);
//imshow("base1", image_keypoint1);
//imshow("base2", image_keypoint2);
waitKey(0);
return 0;
}