我需要做BOW(文字袋),但我只有图像的描述关键点。 目前,我已经使用以下方法获得了词汇:
cv::BOWKMeansTrainer bowtrainerCN(numCenters); //num clusters
bowtrainerCN.add(allDescriptors);
cv::Mat vocabularyCN = bowtrainerCN.cluster();
所以现在我需要进行分配,但我不能使用计算功能,因为它计算图像的描述符,我已经有了。是否有任何功能可以进行分配或让我手动计算它?
答案 0 :(得分:1)
使用cv::BOWKMeansTrainer::cluster()
方法构建词汇表(codebook)后,您可以将描述符(具有合适的大小和类型)与代码簿进行匹配。首先,您必须选择所需的匹配器类型并使用规范。 (见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;