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 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 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 90 int main() 91 { 92 std::cerr << "OpenCV was built without xfeatures2d module" << std::endl; 93 return 0; 94 } 95 96 #endif 97