用opencv3进行特征点匹配

用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 detector = SURF::create(minHession);
    vector 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 extractor = SURF::create();
    Mat descriptors1, descriptors2;
    extractor->compute(srcimage1, keypoint1, descriptors1);
    extractor->compute(srcimage2, keypoint2, descriptors2);

    //使用BruteForce进行匹配
    Ptr matcher = DescriptorMatcher::create("BruteForce");
    vector 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;
}

用opencv3进行特征点匹配_第1张图片

你可能感兴趣的:(opencv)