OpenCV FREAK:快速Retina KeyPoint描述符

时间:2012-09-19 08:30:06

标签: opencv feature-descriptor freak

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

documentation中只显示两个函数:

  • 类构造函数

  • 令人困惑的方法selectPairs()

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

问题:

我是否真的需要使用selectPairs()?只需致电FREAK.compute()即可。我真的不明白哪个是使用selectPairs。

2 个答案:

答案 0 :(得分:18)

刚刚翻阅了论文,并在第4.2段中看到作者设置了一种方法来选择要在其描述符中评估的感知字段对,因为采用所有可能的对将是太多的负担。 selectPairs()函数允许您重新计算这组对。

然后阅读他们在原始文章中准确指出此段落的文档。此外,文档中的一些注释告诉您,已有可用的离线学习对,可以与FREAK描述符一起使用。所以我想至少在开始时你可以使用预先计算的对,并将你从方法获得的KeyPoints列表作为参数传递给FREAK.compute。

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

答案 1 :(得分:16)

#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名有最佳匹配...希望这对你有所帮助...