OpenCV FREAK: дескриптор быстрого Retina KeyPoint
Я разрабатываю приложение, которое включает в себя использование дескрипторов Freak, только что выпущенных в версии OpenCV2.4.2.
В документации отображаются только две функции:
Я хочу использовать свой собственный детектор, а затем вызвать дескриптор FREAK, передающий обнаруженные ключевые точки, но я не понимаю, как работает класс.
Вопрос:
Нужно ли строго использовать selectPairs()
? Достаточно ли просто вызвать FREAK.compute()
? Я действительно не понимаю, что такое использование selectPairs.
Ответы
Ответ 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 очков, которые лучше всего подходят... надеюсь, это поможет вам немного...