在OpenCV中使用预先计算的功能

时间:2013-03-25 09:47:38

标签: c++ opencv machine-learning feature-detection

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

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

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

1 个答案:

答案 0 :(得分:1)

使用cv::BOWKMeansTrainer::cluster()方法构建词汇表(codebook)后,您可以将描述符(具有合适的大小和类型)与代码簿进行匹配。首先,您必须选择所需的匹配器类型并使用规范。 (见opencv doc

例如,使用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;