Я в основном извлекаю много ключевых точек с помощью SURF из похожих изображений и добавляю их в BFMatcher(NORM_L2)
Во время выполнения может случиться так, что я добавлю новые ключевые точки в свой сопоставитель с помощью matcher->add(myNewDescriptors);
Теперь, когда я добавил изображение только с 1 ключевой точкой/дескриптором и использую knnMatch, он не возвращает совпадений:
matcher->knnMatch(queryDesc,matches,2);
Через некоторое время я получаю вектор с 0 ближайшим соседом:
for(auto i = 0; i <matches.size(); i++) {
cout << "matches size: "<<matches[i].size()<<endl;
//> PRINTS: "matches size: 0"
Это происходит только тогда, когда я вставил изображение только с 1 ключевой точкой/дескриптором. До того, как knnMatch работает нормально.
Я попытался проверить, содержит ли matcher.getTrainDescriptors();
мои дескрипторы, и фактически он содержит все. Чтобы проверить это, если я сделаю:
cout << matcher->getTrainDescriptors().at(0).size(); // (Get the size of the descriptors Mat associated to the first training image)
Я получаю: [128 x 32]. Это означает, что дескрипторы есть, но knnMatches возвращает пустой вектор.
Также обратите внимание, что если я заменяю .knnMatch простым .match, сопоставитель возвращает все DMatches нормально! Код не работает только с knnMatch
- OpenCV: 2.4.5
- Обучающее изображение:
- Изображение запроса (то же изображение, уменьшенное в 0,4 раза)