当前位置 主页 > 网站技术 > 代码类 >

    opencv3/C++ FLANN特征匹配方式

    栏目:代码类 时间:2019-12-11 18:07

    使用函数detectAndCompute()检测关键点并计算描述符

    函数detectAndCompute()参数说明:

    void detectAndCompute( 
    InputArray image, //图像
    InputArray mask, //掩模
    CV_OUT std::vector<KeyPoint>& keypoints,//输出关键点的集合
    OutputArray descriptors,//计算描述符(descriptors[i]是为keypoints[i]的计算描述符)
    bool useProvidedKeypoints=false //使用提供的关键点
    );

    match()从查询集中查找每个描述符的最佳匹配。

    参数说明:

    void match( 
    InputArray queryDescriptors, //查询描述符集
    InputArray trainDescriptors, //训练描述符集合
    CV_OUT std::vector<DMatch>& matches, //匹配
    InputArray mask=noArray() //指定输入查询和描述符的列表矩阵之间的允许匹配的掩码
    ) const;

    FLANN特征匹配示例:

    #include<opencv2/opencv.hpp>
    #include<opencv2/xfeatures2d.hpp>
    using namespace cv;
    using namespace cv::xfeatures2d;
    
    //FLANN对高维数据较快
    int main()
    {
      Mat src1,src2;
      src1 = imread("E:/image/image/card2.jpg");
      src2 = imread("E:/image/image/cards.jpg");
      if (src1.empty() || src2.empty())
      {
        printf("can ont load images....\n");
        return -1;
      }
      imshow("image1", src1);
      imshow("image2", src2);
    
      int minHessian = 400;
      //选择SURF特征
      Ptr<SURF>detector = SURF::create(minHessian);
      std::vector<KeyPoint>keypoints1;
      std::vector<KeyPoint>keypoints2;
      Mat descriptor1, descriptor2;
      //检测关键点并计算描述符
      detector->detectAndCompute(src1, Mat(), keypoints1, descriptor1);
      detector->detectAndCompute(src2, Mat(), keypoints2, descriptor2);
    
      //基于Flann的描述符匹配器
      FlannBasedMatcher matcher;
      std::vector<DMatch>matches;
      //从查询集中查找每个描述符的最佳匹配
      matcher.match(descriptor1, descriptor2, matches);
      double minDist = 1000;
      double maxDist = 0;
      for (int i = 0; i < descriptor1.rows; i++)
      {
        double dist = matches[i].distance;
        printf("%f \n", dist);
        if (dist > maxDist)
        {
          maxDist = dist;
        }
        if (dist < minDist)
        {
          minDist = dist;
        }
    
      }
      //DMatch类用于匹配关键点描述符的
      std::vector<DMatch>goodMatches;
      for (int i = 0; i < descriptor1.rows; i++)
      {
        double dist = matches[i].distance;
        if (dist < max(2.5*minDist, 0.02))
        {
          goodMatches.push_back(matches[i]);
        }
      }
      Mat matchesImg;
      drawMatches(src1, keypoints1, src2, keypoints2, goodMatches, matchesImg, Scalar::all(-1), Scalar::all(-1), std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
      imshow("output", matchesImg);
    
      waitKey();
      return 0;
    }
    

    以上这篇opencv3/C++ FLANN特征匹配方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持IIS7站长之家。