У меня есть 1000 паттернов (изображений, которые я хочу посмотреть на конкретной сцене), мой текущий алгоритм получает дескрипторы для каждого паттерна, сохраняет их в векторе и использует этот вектор для обучения FlannBasedMatcher.
Если я делаю knnMatch с k = 3, я получаю совпадения с imgIdx> 1000, вот причина этого вопроса (я пробовал k = 2 и у меня такая же проблема), я ничего не могу найти по этому поводу, может кто-нибудь дать мне руку с этим?
ОБНОВЛЕНИЕ: я добавлял два раза дескрипторы шаблонов, поэтому я получал imgIdx выше 1000, теперь у меня проблема в том, что с k == 2
Я получаю одно совпадение с расстоянием 0 и одно с> 0, отношение расстояний равно 0, и моя теория состоит в том, что я получаю расстояние 0, потому что сопоставление с образцом точно такое же, как у сцены, но когда я делаю это без обучения, я ‘ Я не получаю расстояние 0, есть идеи, почему?
У меня есть еще один вопрос, связанный с этим здесь.
ОБНОВЛЕНО
Это в основном код, который я запускаю
const Ptr<flann::IndexParams>& indexParams=new flann::KDTreeIndexParams(4);
const Ptr<flann::SearchParams>& searchParams=new flann::SearchParams(64);
cv::Ptr<cv::DescriptorMatcher> matcher = new cv::FlannBasedMatcher(indexParams, searchParams);
matcher->clear();
std::vector<Anakin::RichImg*>* patterns = loadPatterns();
std::vector<cv::Mat> pdescriptors(patterns->size());
for (int i = 0; i < patterns->size();i++){
RichImg* p = patterns->at(i);
pdescriptors.at(i) = p->getDescriptors();
}
this->detector->add(pdescriptors);
this->detector->train();
std::vector< std::vector<cv::DMatch> > m_knnMatches;
const cv::Mat& queryDescriptors = getSceneDescriptors();
if (queryDescriptors.empty()) return;
if(queryDescriptors.type()!=CV_32F) {
queryDescriptors.convertTo(queryDescriptors, CV_32F);
}
matcher->knnMatch(queryDescriptors, m_knnMatches, 3);
for (size_t i=0; i<m_knnMatches.size(); i++) {
const cv::DMatch& match_0 = m_knnMatches[i][0];
const cv::DMatch& match_1 = m_knnMatches[i][1];
const cv::DMatch& match_2 = m_knnMatches[i][2];
std::cout << "match_0 : imgIdx(" << match_0.imgIdx << ") distance(" << match_0.distance << ")" << std::endl;
std::cout << "match_1 : imgIdx(" << match_1.imgIdx << ") distance(" << match_1.distance << ")" << std::endl;
std::cout << "match_2 : imgIdx(" << match_2.imgIdx << ") distance(" << match_2.distance << ")" << std::endl;
}
И результаты:
match_0 : imgIdx(403) distance(0)
match_1 : imgIdx(1403) distance(0)
match_2 : imgIdx(1145) distance(0.224424)
match_0 : imgIdx(403) distance(0)
match_1 : imgIdx(1403) distance(0)
match_2 : imgIdx(1098) distance(0.270127)
match_0 : imgIdx(403) distance(0)
match_1 : imgIdx(1403) distance(0)
match_2 : imgIdx(1985) distance(0.227835)
ПРИМЕЧАНИЕ. Я только что опубликовал более легкую версию своего кода (код, необходимый для понимания того, что я делаю), и результат является лишь частью того, что я получаю (исходный результат содержит более 800 строк)
Задача ещё не решена.
Других решений пока нет …