标签:ret esc poi inpu win flags || min edm
检测并绘制特征点:
1 #include <opencv2/opencv.hpp> 2 #include <opencv2/xfeatures2d.hpp> 3 #include <iostream> 4 5 using namespace cv; 6 using namespace cv::xfeatures2d; 7 using namespace std; 8 9 int main(int argc, char** argv) { 10 Mat src = imread("test.jpg", IMREAD_GRAYSCALE); 11 if (src.empty()) { 12 printf("could not load image...\n"); 13 return -1; 14 } 15 namedWindow("input image", CV_WINDOW_AUTOSIZE); 16 imshow("input image", src); 17 18 // BRISK特征点检测 19 Ptr<BRISK> detector = BRISK::create();//创建一个BRISK类对象并初始化 20 vector<KeyPoint> keypoints; 21 detector->detect(src, keypoints, Mat());//找出关键点 22 23 // 绘制关键点 24 Mat keypoint_img; 25 drawKeypoints(src, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT); 26 imshow("KeyPoints Image", keypoint_img); 27 28 waitKey(0); 29 return 0; 30 }
匹配:
1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include <math.h> 4 5 using namespace cv; 6 using namespace std; 7 8 int main(int argc, char** argv) { 9 Mat img1 = imread("fire_5.jpg", IMREAD_GRAYSCALE); 10 Mat img2 = imread("数字.jpg", IMREAD_GRAYSCALE); 11 if (img1.empty() || img2.empty()) { 12 printf("could not load images...\n"); 13 return -1; 14 } 15 imshow("box image", img1); 16 imshow("scene image", img2); 17 18 19 // extract akaze features 20 Ptr<BRISK> detector = BRISK::create(); 21 vector<KeyPoint> keypoints_obj; 22 vector<KeyPoint> keypoints_scene; 23 Mat descriptor_obj, descriptor_scene; 24 detector->detectAndCompute(img1, Mat(), keypoints_obj, descriptor_obj); 25 detector->detectAndCompute(img2, Mat(), keypoints_scene, descriptor_scene); 26 27 28 // matching 29 FlannBasedMatcher matcher(new flann::LshIndexParams(20, 10, 2)); 30 //FlannBasedMatcher matcher; 31 //FlannBasedMatcher matcher; 32 vector<DMatch> matches; 33 matcher.match(descriptor_obj, descriptor_scene, matches); 34 35 // draw matches(key points) 36 Mat akazeMatchesImg; 37 /* 38 drawMatches(img1, keypoints_obj, img2, keypoints_scene, matches, akazeMatchesImg); 39 imshow("akaze match result", akazeMatchesImg);*/ 40 41 vector<DMatch> goodMatches; 42 double minDist = 100000, maxDist = 0; 43 for (int i = 0; i < descriptor_obj.rows; i++) { 44 double dist = matches[i].distance; 45 if (dist < minDist) { 46 minDist = dist; 47 } 48 if (dist > maxDist) { 49 maxDist = dist; 50 } 51 } 52 printf("min distance : %f", minDist); 53 54 for (int i = 0; i < descriptor_obj.rows; i++) { 55 double dist = matches[i].distance; 56 if (dist < max(1.5*minDist, 0.02)) { 57 goodMatches.push_back(matches[i]); 58 } 59 } 60 61 drawMatches(img1, keypoints_obj, img2, keypoints_scene, goodMatches, akazeMatchesImg, Scalar::all(-1), 62 Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 63 imshow("good match result", akazeMatchesImg); 64 65 waitKey(0); 66 return 0; 67 }
标签:ret esc poi inpu win flags || min edm
原文地址:https://www.cnblogs.com/long5683/p/9740187.html