1 #include <iostream>
2
3 #include "opencv2/opencv_modules.hpp"
4
5 #ifdef HAVE_OPENCV_XFEATURES2D
6
7 #include "opencv2/core/core.hpp"
8 #include "opencv2/features2d/features2d.hpp"
9 #include "opencv2/highgui/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\tmatcher_simple_gpu --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