Подтвердить что ты не робот

OpenCV FREAK: дескриптор быстрого Retina KeyPoint

Я разрабатываю приложение, которое включает в себя использование дескрипторов Freak, только что выпущенных в версии OpenCV2.4.2.

В документации отображаются только две функции:

  • Конструктор класса

  • Путающий метод selectPairs()

Я хочу использовать свой собственный детектор, а затем вызвать дескриптор FREAK, передающий обнаруженные ключевые точки, но я не понимаю, как работает класс.

Вопрос:

Нужно ли строго использовать selectPairs()? Достаточно ли просто вызвать FREAK.compute()? Я действительно не понимаю, что такое использование selectPairs.

4b9b3361

Ответ 1

Просто щелкнул по бумаге и увидел в параграфе 4.2, что авторы создали метод выбора пар восприимчивых полей для оценки в своем дескрипторе, поскольку принятие всех возможных пар будет слишком большим бременем. Функция selectPairs() позволяет вам перекомпоновать этот набор пар.

Прочитайте впоследствии документацию, где они указывают именно на этот абзац в оригинальной статье. Кроме того, несколько комментариев в документации говорят вам о наличии уже имеющегося в автономном режиме набора пар, который готов к использованию с дескриптором FREAK. Поэтому я предполагаю, что, по крайней мере, для начала вы могли бы просто использовать предварительно вычисляемые пары и передать в качестве аргумента список KeyPoints, полученный из вашего метода, в FREAK.compute.

Если ваши результаты разочаровывают, вы можете попробовать метод выбора ключевой точки, используемый в оригинальной статье (п. 2.1), а затем, в конечном счете, изучить свой собственный набор пар.

Ответ 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 очков, которые лучше всего подходят... надеюсь, это поможет вам немного...