我需要进行BoW(词袋)操作,但我只有图像的描述关键点。目前,我已经使用以下代码获得了词汇表:
cv::BOWKMeansTrainer bowtrainerCN(numCenters); //num clusters
bowtrainerCN.add(allDescriptors);
cv::Mat vocabularyCN = bowtrainerCN.cluster();
现在我需要进行分配操作,但我不能使用compute函数,因为它会重新计算图像的描述符,而我已经有了这些描述符。是否有任何函数可以进行分配操作,还是我必须手动计算?
回答:
一旦你使用cv::BOWKMeansTrainer::cluster()
方法构建了词汇表(代码书),你就可以将一个描述符(具有合适的大小和类型)与代码书进行匹配。你首先需要选择你需要的匹配器类型以及使用的范数。(参见OpenCV文档)
例如,使用cv::BFMatcher
和L2范数
// 使用你预训练的代码书初始化匹配器
cv::Ptr<cv::DescriptorMatcher > matcher = new cv::BFMatcher(cv::NORM_L2);
matcher->add(std::vector<cv::Mat>(1, vocabulary));
// 匹配
std::vector<cv::DMatch> matches;
matcher->match(new_descriptors,matches);
然后,new_descriptors[i]在你的代码书中最接近的码字的索引将是
matches[i].trainIdx;