OpenCV FREAK: быстрый дескриптор KeyNet Retina

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

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

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

  • Запутанный метод selectPairs()

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

Вопрос:

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

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам