C ++ / OpenCV - 如何在使用flann :: index后获取我的图像? (与BoF合作)

时间:2014-08-19 09:24:02

标签: c++ opencv matching flann

我使用带有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个邻居对应的两张照片? 实际上,我的每个数据中都没有任何图片的痕迹。

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

感谢

1 个答案:

答案 0 :(得分:0)

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

计算每个图像之后:

bowide.compute(img,keypoints,responseHist);

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

  vectorImg.push_back(img);

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