Работа с векторами DMatch, доступ к данным Opencv - PullRequest
1 голос
/ 20 февраля 2012

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

Я знаю, что это может быть сделано автоматически

BruteForceMatcher<cv::L2<float> > matcher;

std::vector<cv::DMatch> matches;


matcher.match(descriptors1,descriptors2, matches);
std::nth_element(matches.begin(),matches.begin()+24, matches.end());
matches.erase(matches.begin()+25, matches.end());`

Но это полезно только в том случае, если следующим шагом является отрисовка совпадений, и на самом деле я хотел бы получить 25 лучших совпадений для последующей обработки в некоторых материалах регистрации изображений.

Любая помощь будет полезна. Спасибо

1010 * Иван *

1 Ответ

0 голосов
/ 07 марта 2013

Используйте атрибуты trainIdx и queryIdx каждого элемента в векторе Dmatch, чтобы извлечь соответствующие индексы соответствия из вектора заданных вами ключевых точек.

Как правило, match.at (i) .trainIdx и match.at (i) .queryIdx даст вам индексы i-го соответствующего совпадения. Самое приятное то, что совпадения расположены в порядке убывания качества, так как при i = 1 совпадение будет лучше, чем при i = 3, и так далее. Итак, в вашем коде вы извлекаете 24 лучших матча.

Я не знаю, нужна ли вам помощь по этому вопросу, прошел год с тех пор, как вы его задавали. Но у меня был тот же вопрос, и я столкнулся с вашим вопросом Мне потребовалось время, чтобы понять это. Я подумал, что обязан ответить на этот вопрос, чтобы кто-то еще не наткнулся на тот же вопрос и нуждался в помощи. Да будет свет!

...