我有以下代码,用于通过其SIFT特征描述符聚类一组图像。
cv::BOWKMeansTrainer trainer = cv::BOWKMeansTrainer(n_clusters);
for (Image* image : get_images()) {
trainer.add(image->get_descriptors());
}
cv::Mat vocabulary = trainer.cluster();
cv::BOWImgDescriptorExtractor extractor(Image::get_extractor(), Image::get_matcher());
extractor.setVocabulary(vocabulary);
for (Image* image : get_images()) {
cv::Mat bow_descriptor;
extractor.compute(image->get_data(), image->get_key_points(), bow_descriptor);
// Determine which cluster the image matches best, via bow_descriptor..
}
我遇到的问题是,我已经在我调用BowImgDescriptorExtractor::compute
的位置计算了图像的描述符,所以如果我能提供这些描述而不是BowImgDescriptorExtractor::compute
,那将是理想的。计算它们。如您所见,我能够提供关键点,但无法找到提供描述符的方法。
我有什么方法可以重复使用我在这里创建的描述符吗?
答案 0 :(得分:2)
我已经使用了我自己的BOWImgDescriptorExtractor
版本,它允许我直接传入描述符而不必重新计算它们。
我只是重复使用现有的源代码,但更改了方法签名以允许我传入描述符,而不是图像数据和关键点,当然也删除了方法体中不必要的计算。 / p>
注意:我目前正在运行OpenCV的2.4.9版本,但看起来在版本3.0.0(尚未发布)中,他们已经超载compute
来解决此问题。< / p>