1 #include <iostream>
2 
3 #include "opencv2/opencv_modules.hpp"
4 
5 #ifdef HAVE_OPENCV_XFEATURES2D
6 
7 #include "opencv2/core.hpp"
8 #include "opencv2/features2d.hpp"
9 #include "opencv2/highgui.hpp"
10 #include "opencv2/cudafeatures2d.hpp"
11 #include "opencv2/xfeatures2d/cuda.hpp"
12 
13 using namespace std;
14 using namespace cv;
15 using namespace cv::cuda;
16 
help()17 static void help()
18 {
19     cout << "\nThis program demonstrates using SURF_CUDA features detector, descriptor extractor and BruteForceMatcher_CUDA" << endl;
20     cout << "\nUsage:\n\tsurf_keypoint_matcher --left <image1> --right <image2>" << endl;
21 }
22 
main(int argc,char * argv[])23 int main(int argc, char* argv[])
24 {
25     if (argc != 5)
26     {
27         help();
28         return -1;
29     }
30 
31     GpuMat img1, img2;
32     for (int i = 1; i < argc; ++i)
33     {
34         if (string(argv[i]) == "--left")
35         {
36             img1.upload(imread(argv[++i], IMREAD_GRAYSCALE));
37             CV_Assert(!img1.empty());
38         }
39         else if (string(argv[i]) == "--right")
40         {
41             img2.upload(imread(argv[++i], IMREAD_GRAYSCALE));
42             CV_Assert(!img2.empty());
43         }
44         else if (string(argv[i]) == "--help")
45         {
46             help();
47             return -1;
48         }
49     }
50 
51     cv::cuda::printShortCudaDeviceInfo(cv::cuda::getDevice());
52 
53     SURF_CUDA surf;
54 
55     // detecting keypoints & computing descriptors
56     GpuMat keypoints1GPU, keypoints2GPU;
57     GpuMat descriptors1GPU, descriptors2GPU;
58     surf(img1, GpuMat(), keypoints1GPU, descriptors1GPU);
59     surf(img2, GpuMat(), keypoints2GPU, descriptors2GPU);
60 
61     cout << "FOUND " << keypoints1GPU.cols << " keypoints on first image" << endl;
62     cout << "FOUND " << keypoints2GPU.cols << " keypoints on second image" << endl;
63 
64     // matching descriptors
65     Ptr<cv::cuda::DescriptorMatcher> matcher = cv::cuda::DescriptorMatcher::createBFMatcher(surf.defaultNorm());
66     vector<DMatch> matches;
67     matcher->match(descriptors1GPU, descriptors2GPU, matches);
68 
69     // downloading results
70     vector<KeyPoint> keypoints1, keypoints2;
71     vector<float> descriptors1, descriptors2;
72     surf.downloadKeypoints(keypoints1GPU, keypoints1);
73     surf.downloadKeypoints(keypoints2GPU, keypoints2);
74     surf.downloadDescriptors(descriptors1GPU, descriptors1);
75     surf.downloadDescriptors(descriptors2GPU, descriptors2);
76 
77     // drawing the results
78     Mat img_matches;
79     drawMatches(Mat(img1), keypoints1, Mat(img2), keypoints2, matches, img_matches);
80 
81     namedWindow("matches", 0);
82     imshow("matches", img_matches);
83     waitKey(0);
84 
85     return 0;
86 }
87 
88 #else
89 
main()90 int main()
91 {
92     std::cerr << "OpenCV was built without xfeatures2d module" << std::endl;
93     return 0;
94 }
95 
96 #endif
97