以下程序来自OpenCV自带的例程:
#include "stdafx.h" #include <stdio.h> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/nonfree/nonfree.hpp" using namespace cv; void help() { printf("\nThis program demonstrates using features2d detector, descriptor extractor and simple matcher\n" "Using the SURF desriptor:\n" "\n" "Usage:\n matcher_simple <image1> <image2>\n"); } int main(int argc, char** argv) { //if(argc != 3) //{ // help(); // return -1; //} Mat img1 = imread("H:\\OpenCV2.4\\opencv\\samples\\c\\box.png");//(argv[1], CV_LOAD_IMAGE_GRAYSCALE); Mat img2 = imread("H:\\OpenCV2.4\\opencv\\samples\\c\\box_in_scene.png");//(argv[2], CV_LOAD_IMAGE_GRAYSCALE); if(img1.empty() || img2.empty()) { printf("Can't read one of the images\n"); return -1; } // detecting keypoints //检测关键点 SurfFeatureDetector detector(400); vector<KeyPoint> keypoints1, keypoints2; detector.detect(img1, keypoints1); detector.detect(img2, keypoints2); // computing descriptors // 计算描述器 SurfDescriptorExtractor extractor; Mat descriptors1, descriptors2; extractor.compute(img1, keypoints1, descriptors1); extractor.compute(img2, keypoints2, descriptors2); // matching descriptors //匹配描述器 BFMatcher matcher(NORM_L2); vector<DMatch> matches; matcher.match(descriptors1, descriptors2, matches); // drawing the results // 画结果 namedWindow("matches", 1); Mat img_matches; drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches); imshow("matches", img_matches); waitKey(0); return 0; }