c++ /OpenCV -我怎么能得到我的图像后使用flann::索引?(转炉)



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

说明一下,我不会把这个过程的所有细节都放在这里,如果你需要一些细节,请告诉我。

那么在这一步我有:

  • cv::Mat allDescriptors -> my all database (training)的描述符

  • cv::Mat词汇 ->码本表示

  • 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 results --> [38,117]-
  • cv::Mat dist --> [0.0010655867, 0.013091294]

但是现在有了这些结果,我如何恢复对应于我最近的两个邻居的两张照片?事实上,我在每个数据中都找不到任何图片的痕迹。

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

谢谢

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

对每张图像进行如下计算后:

bowide.compute(img,keypoints,responseHist);

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

  vectorImg.push_back(img);

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

相关内容

  • 没有找到相关文章

最新更新