17

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

文档中只出现了两个函数:

  • 类构造函数

  • 令人困惑的方法selectPairs()

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

问题:

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

4

2 回答 2

18

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

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

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

于 2012-09-20T09:35:04.043 回答
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 分最好的匹配...希望这对您有所帮助...

于 2012-09-19T17:10:54.557 回答