zoukankan      html  css  js  c++  java
  • OpenCV——ORB特征检测与匹配

    原文链接:https://mp.weixin.qq.com/s/S4b1OGjRWX1kktefyHAo8A

     

     

     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     // ORB特征点检测
    19     int minHessian = 100;
    20     Ptr<ORB> detector = ORB::create(minHessian);//和surf的区别:只是SURF→ORB
    21     vector<KeyPoint> keypoints;
    22     detector->detect(src, keypoints, Mat());//找出关键点
    23 
    24     // 绘制关键点
    25     Mat keypoint_img;
    26     drawKeypoints(src, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
    27     imshow("KeyPoints Image", keypoint_img);
    28 
    29     waitKey(0);
    30     return 0;
    31 }

    匹配

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 #include <math.h>
     4 #define RATIO    0.4
     5 using namespace cv;
     6 using namespace std;
     7 int main(int argc, char** argv) {
     8     Mat box = imread("2.png");
     9     Mat scene = imread("数字.jpg");
    10     if (scene.empty()) {
    11         printf("could not load image...
    ");
    12         return -1;
    13     }
    14     imshow("input image", scene);
    15     vector<KeyPoint> keypoints_obj, keypoints_sence;
    16     Mat descriptors_box, descriptors_sence;
    17     Ptr<ORB> detector = ORB::create();
    18     detector->detectAndCompute(scene, Mat(), keypoints_sence, descriptors_sence);
    19     detector->detectAndCompute(box, Mat(), keypoints_obj, descriptors_box);
    20     vector<DMatch> matches;
    21     // 初始化flann匹配
    22     // Ptr<FlannBasedMatcher> matcher = FlannBasedMatcher::create(); // default is bad, using local sensitive hash(LSH)
    23     Ptr<DescriptorMatcher> matcher = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(12, 20, 2));
    24     matcher->match(descriptors_box, descriptors_sence, matches);
    25     // 发现匹配
    26     vector<DMatch> goodMatches;
    27     printf("total match points : %d
    ", matches.size());
    28     float maxdist = 0;
    29     for (unsigned int i = 0; i < matches.size(); ++i) {
    30         printf("dist : %.2f 
    ", matches[i].distance);
    31         maxdist = max(maxdist, matches[i].distance);
    32     }
    33     for (unsigned int i = 0; i < matches.size(); ++i) {
    34         if (matches[i].distance < maxdist*RATIO)
    35             goodMatches.push_back(matches[i]);
    36     }
    37     Mat dst;
    38     drawMatches(box, keypoints_obj, scene, keypoints_sence, goodMatches, dst);
    39     imshow("output", dst);
    40     waitKey(0);
    41     return 0;
    42 }

     

    1 Ptr<DescriptorMatcher> matcher = makePtr<FlannBasedMatcher>
    2                           (makePtr<flann::LshIndexParams>(12, 20, 2));
  • 相关阅读:
    Apache 虚拟主机 VirtualHost 配置
    EAX、ECX、EDX、EBX寄存器的作用
    Python中文文档 目录(转载)
    八度
    POJ 3268 Silver Cow Party (最短路)
    POJ 2253 Frogger (求每条路径中最大值的最小值,Dijkstra变形)
    2013金山西山居创意游戏程序挑战赛——复赛(1) HDU 4557 非诚勿扰 HDU 4558 剑侠情缘 HDU 4559 涂色游戏 HDU 4560 我是歌手
    HDU 4549 M斐波那契数列(矩阵快速幂+欧拉定理)
    UVA 11624 Fire! (简单图论基础)
    HDU 3534 Tree (树形DP)
  • 原文地址:https://www.cnblogs.com/long5683/p/9737510.html
Copyright © 2011-2022 走看看