1

我需要做 BOW(词袋),但我只有描述的图像关键点。目前,我已经使用以下方法获得了词汇:

cv::BOWKMeansTrainer bowtrainerCN(numCenters); //num clusters
bowtrainerCN.add(allDescriptors);
cv::Mat vocabularyCN = bowtrainerCN.cluster();

所以现在我需要做分配,但我不能使用计算函数,因为它计算图像的描述符,我已经有了。是否有任何功能可以完成分配或让我手动计算?

4

1 回答 1

1

一旦使用cv::BOWKMeansTrainer::cluster()方法构建了词汇表(码本),您就可以将描述符(具有合适的大小和类型)与码本匹配。您首先必须选择您需要的匹配器类型以及要使用的规范。(见opencv 文档

例如,使用cv::BFMatcherL2 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; 
于 2013-03-25T15:22:25.577 回答