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

AKAZE是KAZE的加速版

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

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

 



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 }