2

我使用带有 SURF 和 FlannBasedMatcher 的 BoW 在数据库中检索图像。我使用 SURF 提取了我的数据库(训练)的所有特征,然后我建立了词汇表,最后我得到了数据库中每张图片的 BOF 频率直方图(训练)。

需要明确的是,我没有列出所有这些过程的细节,但如果您需要一些细节,请告诉我。

所以在这一步我有:

  • cv::Mat allDescriptors --> 我所有数据库的描述符(训练)

  • cv::Mat Vocabulary --> 码本表示

  • cv::Mat responseDatabase --> 我的数据库中每张图片的频率直方图

然后我使用一个查询并根据之前计算的词汇表计算它的响应。最后我有这个数据:

  • cv::Mat responseQuery --> 我的查询的频率直方图

现在我有一些困难。我用了

 cv::flann::Index flannIndex(responseDatabase, cv::flann::KDTreeIndexParams(), cvflann::FLANN_DIST_EUCLIDEAN);
cv::Mat results, dists;
int k=2;
flannIndex.knnSearch(responseQuery, results, dists, k, cv::flann::SearchParams() );

它运作良好,我得到了这个结果:

  • cv::Mat 结果 --> [38, 117] -
  • cv::Mat dist --> [0.0010655867, 0.013091294]

但是现在有了这些结果,我怎样才能恢复对应于我的 2 个最近邻居的两张图片?事实上,我的每个数据中的图片都没有任何痕迹。

也许,我错过了一步,但哪一步?

感谢

4

1 回答 1

0

我解决了它,但我不知道这是否是最好的方法。

在这样计算每个图像之后:

bowide.compute(img,keypoints,responseHist);

我将图片保存在一个大矢量中,因此,我可以加载它们以进行匹配。

  vectorImg.push_back(img);

问题是,我必须将每张图片的名称保存在 txt 文件中,然后在匹配期间读取 txt 文件。(为了加载它们)事实上,数据库中每个图像的 BoWFeature 计算只完成一次,我不想每次将查询与数据库进行比较时都运行相同的过程。因此,一旦我的数据库经过训练,我就只能进行匹配,因为我在一个 txt 文件中拥有我所有的带有索引的图片。

于 2014-08-20T07:56:39.943 回答