1 #include "highgui/highgui.hpp"    
 2 #include "opencv2/nonfree/nonfree.hpp"    
 3 #include "opencv2/legacy/legacy.hpp"   
 4 #include <iostream>  
 5 
 6 using namespace cv;
 7 using namespace std;
 8 
 9 
10 int main()
11 {
12     Mat image01 = imread("C:\\2.jpg",1);    //右图
13     Mat image02 = imread("C:\\1.jpg", 1);    //左图
14     namedWindow("p2", 0);
15     namedWindow("p1", 0);
16     imshow("p2", image01);
17     imshow("p1", image02);
18 
19     //灰度图转换  
20     Mat image1, image2;
21     cvtColor(image01, image1, CV_RGB2GRAY);
22     cvtColor(image02, image2, CV_RGB2GRAY);
23 
24 
25     //提取特征点    
26     SurfFeatureDetector surfDetector(12000);  // 海塞矩阵阈值,在这里调整精度,值越大点越少,越精准 
27     vector<KeyPoint> keyPoint1, keyPoint2;
28     surfDetector.detect(image1, keyPoint1);
29     surfDetector.detect(image2, keyPoint2);
30 
31     //特征点描述,为下边的特征点匹配做准备    
32     SurfDescriptorExtractor SurfDescriptor;
33     Mat imageDesc1, imageDesc2;
34     SurfDescriptor.compute(image1, keyPoint1, imageDesc1);
35     SurfDescriptor.compute(image2, keyPoint2, imageDesc2);
36 
37     //获得匹配特征点,并提取最优配对     
38     FlannBasedMatcher matcher;
39     vector<DMatch> matchePoints;
40 
41     matcher.match(imageDesc1, imageDesc2, matchePoints, Mat());
42     cout << "total match points: " << matchePoints.size() << endl;
43 
44 
45     Mat img_match;
46     drawMatches(image01, keyPoint1, image02, keyPoint2, matchePoints, img_match);
47     namedWindow("match", 0);
48     imshow("match", img_match);
49     imwrite("match.jpg", img_match);
50 
51     waitKey();
52     return 0;
53 }