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


     

    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 }
  • 相关阅读:
    如何去除行内元素之间的间隙
    js判断字符串是否为空,多个空格也算为空
    android4.4的Webview的getCookie有兼容性有问题
    配置xampp搭建简单的web服务器环境
    Okhttp传递cookie给Webview的解决方法
    linux下使用nodejs和lessc编译器
    某盘下载链接提取脚本
    Android项目开发过程常用的工作流工具以及平台
    Android开发检测App从后台进入前台的解决方法
    NetworkImageView
  • 原文地址:https://www.cnblogs.com/long5683/p/9740156.html
Copyright © 2020-2023  润新知