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

Posted long5683

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV——KAZEAKAZE特征检测匹配与对象查找相关的知识,希望对你有一定的参考价值。

 

技术分享图片

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...
");
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...
");
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——KAZEAKAZE特征检测匹配与对象查找的主要内容,如果未能解决你的问题,请参考以下文章

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

OpenCV中的特征匹配(Feature Matching)

matlab opencv 特征点提取与匹配问题

OpenCV——ORB特征检测与匹配

OpenCV探索之路(二十三):特征检测和特征匹配方法汇总

OpenCV——SURF特征检测与匹配