当前位置:网站首页>c++ opencv4.3 sift匹配

c++ opencv4.3 sift匹配

2020-11-08 16:17:00 spiritboy

c++ opencv4.3 sift匹配

main.cpp

int main()
{
   
	vector<KeyPoint> keypoints1, keypoints2;
	Mat img1,img2,descriptors1, descriptors2;

	int numFeatures = 500;//特征点最大个数
	int numlines = 50;//前20个匹配最好的点
	string path1 = "1.jpg";//图片1
	string path2 = "2.jpg";//图片2

	getDescriptors(numFeatures, path1, keypoints1, descriptors1, img1);//绘制图片1特征点
	getDescriptors(numFeatures, path2, keypoints2, descriptors2, img2);//绘制图片2特征点
	drawMatch(img1, keypoints1, descriptors1, img2, keypoints2, descriptors2, numlines);//绘制匹配点
	
	return 0;
}

utils.cpp

#include "utils.h"

// 获取特征点信息
void getDescriptors( int numFeatures, string path, vector<KeyPoint>& keypoints, Mat& descriptors, Mat& img) {
   

    img = imread(path);
    Ptr<SIFT> detector = SIFT::create(numFeatures);
    if (detector.empty())
        throw runtime_error("fail to create detector!");

    //detect keypoints;
    ;
    detector->detect(img, keypoints);
    cout << "img:" << keypoints.size() << endl;

    //compute descriptors for keypoints;
    //Sift特征描述提取
    cout << "< Computing descriptors for keypoints from images..." << endl;
    
    detector->compute(img, keypoints, descriptors);

    cout << endl << "Descriptors Size: " << descriptors.size() << " >" << endl;
    cout << endl << "Descriptor's Column: " << descriptors.cols << endl << "Descriptor's Row: " << descriptors.rows << endl;
    cout << ">" << endl;

    //Draw And Match img1,img2 keypoints
    Mat img_keypoints;
    drawKeypoints(img, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
    imshow(path, img_keypoints);

}

// 画匹配的特征点对
void drawMatch(Mat img1, vector<KeyPoint> keypoints1, Mat descriptors1, Mat img2, vector<KeyPoint> keypoints2, Mat descriptors2, int numlines) {
   
    //暴力匹配
    Ptr<DescriptorMatcher> descriptor_matcher = DescriptorMatcher::create("BruteForce");
    vector<DMatch> matches;
    descriptor_matcher->match(descriptors1, descriptors2, matches);

    //挑选匹配的最好的前20个
    nth_element(matches.begin(), matches.begin() + numlines-1, matches.end());
    matches.erase(matches.begin() + numlines-1, matches.end());

    //绘制匹配点连线
    Mat img_matches;
    drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector< char>(), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

    imshow("Mathc", img_matches);
    waitKey(0);
}

在这里插入图片描述

opencv4.3下载地址

https://download.csdn.net/download/qq_26696715/12459477

有问题添加QQ群:686070107

版权声明
本文为[spiritboy]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/3337401/blog/4708236