使用 BOWImgDescriptorExtractor 重用描述符

Re-using descriptors with BOWImgDescriptorExtractor

我有以下代码,旨在通过图像的 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 就更理想了重新计算它们。如您所见,我能够提供关键点,但无法找到提供描述符的方法。

我有什么方法可以重新使用我已经在这里创建的描述符吗?

我已经求助于编写自己的 BOWImgDescriptorExtractor 版本,它允许我直接传入描述符而不必重新计算它们。

我简单地重新使用了现有的源代码,但更改了方法签名以允许我传入描述符,而不是图像数据和关键点,当然还删除了方法体中不必要的计算.

注意:我目前 运行 OpenCV 2.4.9 版,但似乎在 3.0.0 版(尚未发布)中,他们已经重载 compute 来解决这个问题。