我想从查询与数据库中的图片(约2000)进行比较.
在本网站发帖之前,我阅读了很多关于在大型数据库中匹配图片的方法的文章,并阅读了stackOverflow上的很多帖子.
关于论文,有一些有趣的东西,但技术性很强,很难理解算法.(我刚开始专注于这个领域)
帖子(最有趣的):
C++/SIFT/SQL - 如果有一种方法可以有效地比较图像的SIFT描述符和SQL数据库中的SIFT描述符?
论文:
具有大型词汇表和快速空间匹配的对象检索,
图像相似性搜索紧凑数据结构,
LSH,
近重复图像检测min-Hash和tf-idf加权
词汇树
聚合本地描述符
但我仍然困惑.
我做的第一件事就是实施BoW.我训练了Bag of Words(使用ORB作为探测器和描述符,并使用了VLAD功能)和5级,以测试其效率.经过长时间的培训,我推出了它.它运行良好,准确率为94%.那很不错.
但是我有一个问题:
首先,你同意我的意见吗?这显然是做我想做的最好的方法吗?也许还有另一种方法可以使用BoW来查找数据库中的相似之处?
我做的第二件事是"更简单".我计算查询的描述符.然后我在我的所有数据库上做了一个循环,我计算了每个图片的描述符,然后在向量中添加了每个描述符.
std::vector<cv::Mat> all_descriptors_database;
for (i ? 2000) :
cv::Mat request=cv::imread(img);
computeKeypoints(request) ;
computeDescriptors(request) ;
all_descriptors_database.pushback(descriptors_of_request)
Run Code Online (Sandbox Code Playgroud)
最后,我有一个大向量,其中包含所有数据库的所有描述符.(所有关键点都一样)
然后,这就是我感到困惑的地方.开始时,我想计算循环内部的匹配,也就是说,对于数据库中的每个图像,计算其描述符并与查询匹配.但是花了很多时间.
因此,在阅读了大量关于如何在大数据库中找到相似之处的论文后,我发现LSH算法似乎适合于那种搜索.
因此我想使用这种方法.所以在我的循环中我做了类似的事情:
//Create Flann LSH index
cv::flann::Index flannIndex(all_descriptors_database.at(i), cv::flann::LshIndexParams(12, 20, 2), cvflann::FLANN_DIST_HAMMING);
cv::Mat results, dists;
int k=2; // find the 2 nearest neighbors
// search (nearest neighbor)
flannIndex.knnSearch(query_descriptors, results, …Run Code Online (Sandbox Code Playgroud)