Мне нужно сделать BOW (мешок слов), но у меня есть только описанные ключевые точки изображений.
На данный момент я получил словарь, используя:
cv::BOWKMeansTrainer bowtrainerCN(numCenters); //num clusters
bowtrainerCN.add(allDescriptors);
cv::Mat vocabularyCN = bowtrainerCN.cluster();
Так что теперь мне нужно сделать назначение, но я не могу использовать функцию вычисления, потому что она вычисляет дескрипторы изображений, и у меня уже есть это. Есть ли какая-либо функция для выполнения задания или я должен вычислять ее вручную?
После того, как вы создали словарь (кодовую книгу), используя cv::BOWKMeansTrainer::cluster()
метод, вы можете сопоставить дескриптор (с подходящим размером и типом) для кодовой книги. Сначала вы должны выбрать тип соответствия, который вам нужен, с нормой использования. (увидеть OpenCV DOC)
Например, с cv::BFMatcher
а также L2 norm
// init the matcher with you pre-trained codebook
cv::Ptr<cv::DescriptorMatcher > matcher = new cv::BFMatcher(cv::NORM_L2);
matcher->add(std::vector<cv::Mat>(1, vocabulary));
// matches
std::vector<cv::DMatch> matches;
matcher->match(new_descriptors,matches);
Тогда индекс ближайшего кодового слова в вашей кодовой книге для new_descriptors [i] будет
matches[i].trainIdx;
Других решений пока нет …