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


    检测并绘制特征点:

     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     // 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...
    ");
    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 }
  • 相关阅读:
    Polly
    Ember.js 的视图层
    Ember.js入门教程、博文汇总
    点燃圣火! Ember.js 的初学者指南
    ElasticSearch第一步-环境配置
    C#泛型文章汇总
    LINQ之路10:LINQ to SQL 和 Entity Framework(下)
    LINQ之路 9:LINQ to SQL 和 Entity Framework(上)
    LINQ之路 8: 解释查询(Interpreted Queries)
    jquery.jqzoom.js图片放大镜
  • 原文地址:https://www.cnblogs.com/long5683/p/9740187.html
Copyright © 2020-2023  润新知