#include #include "opencv2/core.hpp" #ifdef HAVE_OPENCV_XFEATURES2D #include "opencv2/highgui.hpp" #include "opencv2/features2d.hpp" #include "opencv2/xfeatures2d.hpp" using namespace cv; using namespace cv::xfeatures2d; using std::cout; using std::endl; const char* keys = "{ help h | | Print help message. }" "{ input1 | box.png | Path to input image 1. }" "{ input2 | box_in_scene.png | Path to input image 2. }"; int main( int argc, char* argv[] ) { CommandLineParser parser( argc, argv, keys ); Mat img1 = imread( samples::findFile( parser.get("input1") ), IMREAD_GRAYSCALE ); Mat img2 = imread( samples::findFile( parser.get("input2") ), IMREAD_GRAYSCALE ); if ( img1.empty() || img2.empty() ) { cout << "Could not open or find the image!\n" << endl; parser.printMessage(); return -1; } //-- Step 1: Detect the keypoints using SURF Detector, compute the descriptors int minHessian = 400; Ptr detector = SURF::create( minHessian ); std::vector keypoints1, keypoints2; Mat descriptors1, descriptors2; detector->detectAndCompute( img1, noArray(), keypoints1, descriptors1 ); detector->detectAndCompute( img2, noArray(), keypoints2, descriptors2 ); //-- Step 2: Matching descriptor vectors with a brute force matcher // Since SURF is a floating-point descriptor NORM_L2 is used Ptr matcher = DescriptorMatcher::create(DescriptorMatcher::BRUTEFORCE); std::vector< DMatch > matches; matcher->match( descriptors1, descriptors2, matches ); //-- Draw matches Mat img_matches; drawMatches( img1, keypoints1, img2, keypoints2, matches, img_matches ); //-- Show detected matches imshow("Matches", img_matches ); waitKey(); return 0; } #else int main() { std::cout << "This tutorial code needs the xfeatures2d contrib module to be run." << std::endl; return 0; } #endif