【问题标题】:OpenCV FREAK: Fast Retina KeyPoint descriptorOpenCV FREAK:快速视网膜关键点描述符
【发布时间】:2012-09-11 13:03:40
【问题描述】:

我正在开发一个涉及使用Freak 描述符的应用程序,刚刚在OpenCV2.4.2 版本中发布。

documentation中只出现了两个函数:

  • 类构造函数

  • 一个令人困惑的方法selectPairs()

我想使用自己的检测器,然后调用 FREAK 描述符传递检测到的关键点,但我不清楚该类是如何工作的。

问题:

我必须使用selectPairs()吗?打电话FREAK.compute()就够了吗?我不太明白 selectPairs 的用途是什么。

【问题讨论】:

    标签: opencv feature-descriptor freak


    【解决方案1】:

    刚刚浏览了这篇论文,在第 4.2 段中看到,作者设置了一种方法来选择感受野对以在其描述符中进行评估,因为获取所有可能的对会带来太多负担。 selectPairs() 函数可让您重新计算这组对。

    之后阅读他们在原始文章中准确指向该段落的文档。此外,文档中的一些 cmets 告诉您,已经有一个可用的、离线学习的对集合可以与 FREAK 描述符一起使用。所以我想至少一开始你可以只使用预先计算的对,并将你从方法中获得的关键点列表作为参数传递给 FREAK.compute。

    如果您的结果令人失望,您可以尝试原始论文中使用的关键点选择方法(第 2.1 段),然后最终学习自己的一组对。

    【讨论】:

    • 是的,我猜是这样的。我不知道如果您有算法来选择对,是否需要对关键点使用检测器。这在论文中对我来说还不够清楚。我正在用怪胎开发 pyrFAST,我会看看会发生什么。
    • 我的理解是,给定一个关键点位置(例如使用 pyrFAST),描述符被计算为该关键点周围一个小邻域中点对(!=关键点)之间差异的符号.如果您熟悉它,这与BRIEF 非常相似。但是 FREAK 有一种方法可以在人类视觉系统的启发下对附近的位置进行采样
    • 好吧,这对我来说更有意义。是的,我知道BRIEF(对随机位置进行采样)和BRISK 在圆圈中进行采样。 FREAK 也以圆圈形式采样,但它们像视网膜一样是多余的,从粗到细。我没有注意到这是在一个关键点附近完成的,它有一个点。谢谢!
    • 嗨,他们是如何计算怪异模式的?我不知道他们用来计算每个圆的半径的方程是什么,平滑的 sigma 等。有人知道如何创建这些模式(数学上每个级别的半径方程,sigma 等)。跨度>
    • AFAIK,方程式没有写出来,而是参考论文中图形的直接翻译。对于训练,作者使用的检测器是 AGAST,它类似于对尺度敏感的 FAST(如 pyrFast)。更准确地说,AGAST 是 BRISK 论文中使用的检测器,代码可以在 BRISK 的论文作者网站上找到。
    【解决方案2】:
    #include "iostream"
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include "cv.h"
    #include "highgui.h"
    #include <opencv2/nonfree/nonfree.hpp>
    #include <opencv2/nonfree/features2d.hpp>
    #include <opencv2/flann/flann.hpp>
    #include <opencv2/legacy/legacy.hpp>
    #include <vector>
    
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
        Mat image1,image2;
        image1 = imread("C:\\lena.jpg",0);
        image2 = imread("C:\\lena1.bmp",0);
    
        vector<KeyPoint> keypointsA,keypointsB;
        Mat descriptorsA,descriptorsB;
    
        std::vector<DMatch> matches;
    
        OrbFeatureDetector detector(400);
    
        FREAK extractor;
    
        BruteForceMatcher<Hamming> matcher;
    
        detector.detect(image1,keypointsA);
        detector.detect(image2,keypointsB);
    
        extractor.compute(image1,keypointsA,descriptorsA);
        extractor.compute(image2,keypointsB,descriptorsB);
    
        matcher.match(descriptorsA, descriptorsB, matches);
    
        int nofmatches = 30;
        nth_element(matches.begin(),matches.begin()+nofmatches,matches.end());
        matches.erase(matches.begin()+nofmatches+1,matches.end());
    
        Mat imgMatch;
        drawMatches(image1, keypointsA, image2, keypointsB, matches, imgMatch);
    
        imshow("matches", imgMatch);
        waitKey(0);
    
        return 0;
    }
    

    这是一个简单的应用程序来匹配两个图像中的点...我已经使用 Orb 来检测关键点和 FREAK 作为这些关键点上的描述符...然后使用 brutforcematching 来检测两个图像中的对应点...我已经采取最匹配的前 30 个点...希望这对您有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多