我使用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文件的所有我的图片与索引。