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

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

时间:2018-10-04 11:23:05      阅读:1604      评论:0      收藏:0      [点我收藏+]

标签:har   input   vector   argv   tor   single   could   stream   extra   

 

技术分享图片

AKAZE是KAZE的加速版

技术分享图片

特征点查找和绘制:把surf中的surf改成KAZEAKAZE即可

 

 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     // AKAZE特征点检测
19     Ptr<AKAZE> detector = AKAZE::create();//创建一个AKAZE类对象并初始化
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<AKAZE> detector = AKAZE::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     vector<DMatch> matches;
32     matcher.match(descriptor_obj, descriptor_scene, matches);
33 
34     // draw matches(key points)
35     Mat akazeMatchesImg;
36     /*
37     drawMatches(img1, keypoints_obj, img2, keypoints_scene, matches, akazeMatchesImg);
38     imshow("akaze match result", akazeMatchesImg);*/
39     
40     vector<DMatch> goodMatches;
41     double minDist = 100000, maxDist = 0;
42     for (int i = 0; i < descriptor_obj.rows; i++) {
43         double dist = matches[i].distance;
44         if (dist < minDist) {
45             minDist = dist;
46         }
47         if (dist > maxDist) {
48             maxDist = dist;
49         }
50     }
51     printf("min distance : %f", minDist);
52 
53     for (int i = 0; i < descriptor_obj.rows; i++) {
54         double dist = matches[i].distance;
55         if (dist < max( 1.5*minDist, 0.02)) {
56             goodMatches.push_back(matches[i]);
57         }
58     }
59 
60     drawMatches(img1, keypoints_obj, img2, keypoints_scene, goodMatches, akazeMatchesImg, Scalar::all(-1),
61         Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
62     imshow("good match result", akazeMatchesImg);
63     
64     waitKey(0);
65     return 0;
66 }

 

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

标签:har   input   vector   argv   tor   single   could   stream   extra   

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

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