当前位置:网站首页>C + + opencv4.3 sift matching

C + + opencv4.3 sift matching

2020-11-08 16:17:50 Spiritual

c++ opencv4.3 sift matching

main.cpp

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

	int numFeatures = 500;// The maximum number of feature points 
	int numlines = 50;// front 20 The best match 
	string path1 = "1.jpg";// picture 1
	string path2 = "2.jpg";// picture 2

	getDescriptors(numFeatures, path1, keypoints1, descriptors1, img1);// Drawing pictures 1 Characteristic point 
	getDescriptors(numFeatures, path2, keypoints2, descriptors2, img2);// Drawing pictures 2 Characteristic point 
	drawMatch(img1, keypoints1, descriptors1, img2, keypoints2, descriptors2, numlines);// Draw match points 
	
	return 0;
}

utils.cpp

#include "utils.h"

//  Get feature point information 
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 Feature description extraction 
    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);

}

//  Draw matching feature points to 
void drawMatch(Mat img1, vector<KeyPoint> keypoints1, Mat descriptors1, Mat img2, vector<KeyPoint> keypoints2, Mat descriptors2, int numlines) {
   
    // Violent match 
    Ptr<DescriptorMatcher> descriptor_matcher = DescriptorMatcher::create("BruteForce");
    vector<DMatch> matches;
    descriptor_matcher->match(descriptors1, descriptors2, matches);

    // Pick the best match before 20 individual 
    nth_element(matches.begin(), matches.begin() + numlines-1, matches.end());
    matches.erase(matches.begin() + numlines-1, matches.end());

    // Draw a match point line 
    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);
}

 Insert picture description here

opencv4.3 Download address

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

There is a problem adding QQ Group :686070107

版权声明
本文为[Spiritual]所创,转载请带上原文链接,感谢