Как использовать matn-based matcher или вообще flann в opencv?
Пожалуйста, кто-нибудь может показать мне пример кода или рассказать, как использовать этот класс и методы. Я просто хочу сопоставить SURF из изображения запроса с изображением, установленным с помощью Flann. Я видел много кодов соответствия изображений в примерах, но что до сих пор ускользает от меня, так это показатель, позволяющий количественно оценить, насколько изображение сходно с другим. Любая помощь будет высоко ценится.
2 ответа
Вот непроверенный пример кода
using namespace std;
using namespace cv;
Mat query; //the query image
vector<Mat> images; //set of images in your db
/* ... get the images from somewhere ... */
vector<vector<KeyPoint> > dbKeypoints;
vector<Mat> dbDescriptors;
vector<KeyPoint> queryKeypoints;
Mat queryDescriptors;
/* ... Extract the descriptors ... */
FlannBasedMatcher flannmatcher;
//train with descriptors from your db
flannmatcher.add(dbDescriptors);
flannmatcher.train();
vector<DMatch > matches;
flannmatcher.match(queryDescriptors, matches);
/* for kk=0 to matches.size()
the best match for queryKeypoints[matches[kk].queryIdx].pt
is dbKeypoints[matches[kk].imgIdx][matches[kk].trainIdx].pt
*/
Поиск наиболее "похожего" изображения на изображение запроса зависит от вашего приложения. Возможно, количество подходящих ключевых точек является адекватным. Или вам может понадобиться более сложная мера сходства.
Чтобы уменьшить количество ложных срабатываний, вы можете сравнить первого ближайшего соседа со вторым ближайшим соседом, взяв соотношение этих расстояний. расстояние (запрос, ближайший сосед)/ расстояние (запрос, ближайший сосед)