码迷,mamicode.com
首页 > 其他好文 > 详细

OpenCV——Brisk特征检测、匹配与对象查找

时间:2018-10-04 10:09:03      阅读:498      评论:0      收藏:0      [点我收藏+]

标签: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 }

 

OpenCV——Brisk特征检测、匹配与对象查找

标签:ret   esc   poi   inpu   win   flags   ||   min   edm   

原文地址:https://www.cnblogs.com/long5683/p/9740187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!