我使用带有SURF和FlannBasedMatcher的BoW在数据库中进行图像检索。 我使用SURF提取了我的数据库(训练)的所有功能,然后我建立了词汇表,最后我获得了数据库中每个图片的BOF频率直方图(训练)。
要清楚,我不会详细说明所有这些过程,但请告诉我你是否需要一些细节。
所以在这一步我有:
cv :: Mat allDescriptors - >我所有数据库的描述符(培训)
cv :: Mat Vocabulary - >代码簿表示
cv :: Mat responseDatabase - >数据库中每张图片的频率直方图
然后我使用查询并根据之前计算的词汇计算其响应。 最后我有这些数据:
现在我遇到了一些困难。 我用了
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() );
效果很好,我得到了这个结果:
但是现在有了这些结果,我怎样才能恢复与我最近的2个邻居对应的两张照片? 实际上,我的每个数据中都没有任何图片的痕迹。
也许,我错过了一步但是哪一步?
感谢
答案 0 :(得分:0)
我解决了,但我不知道这是不是最好的方式。
计算每个图像之后:
bowide.compute(img,keypoints,responseHist);
我将图片保存在一个大矢量中,因此,我可以加载它们进行匹配。
vectorImg.push_back(img);
问题是,我必须在txt文件中保存每张图片的名称,然后在匹配期间读取txt文件。 (为了加载它们) 实际上,数据库中每个图像的BoWFeature的计算只进行一次,并且我不想每次想要将查询与数据库进行比较时运行相同的过程。因此,一旦我的数据库被训练,我只能进行匹配,因为我在txt文件中包含索引的所有图片。