我有一个图像数据库。当我拍摄新照片时,我想将它与此数据库中的图像进行比较并获得相似度分数(使用OpenCV)。这样我想检测,如果我有图像,则是非常类似于新鲜的图片。
是否可以创建我的数据库图像的指纹/散列并将其与新的匹配?
我正在搜索alogrithm代码段或技术演示,而不是商业解决方案。
最佳,
的Stefan
答案 0 :(得分:10)
正如Pual R评论的那样,这个“指纹/散列”通常是一组特征向量或一组特征描述符。但是,计算机视觉中使用的大多数特征向量对于搜索数据库来说通常计算量太大。因此,此任务需要一种特殊的特征描述符,因为即使使用各种优化,SURF和SIFT等描述符也会花费太多时间进行搜索。
OpenCV对您的任务(对象分类)的唯一作用是实现Bag of visual Words(BOW)。
它可以计算特殊的图像特征并训练视觉词汇词汇。接下来,您可以使用此词汇表在数据库中查找类似的图像并计算相似度得分。
Here is包含单词的OpenCV文档。 OpenCV也有一个名为bagofwords_classification.cpp
的样本。它真的很大,但可能会有所帮助。
答案 1 :(得分:2)
基于内容的图像检索系统仍然是一个活跃的研究领域:http://citeseerx.ist.psu.edu/search?q=content-based+image+retrieval
首先,你必须明确,在你的背景下构成类似的东西:
没有“满足所有需求” - 您描述的问题的算法。您可以分享的问题越多,您可能会得到更好的答案。发布一些有代表性的图像(如果可能)并描述所需的结果也非常有帮助。
如果computer-vision.stackexchange.com已存在,这将是一个很好的问题。
答案 2 :(得分:0)
您可以在数据库中使用pHash
算法并存储phash
值,然后使用此代码:
double const mismatch = algo->compare(image1Hash, image2Hash);
这里'mismatch'值可以很容易地告诉你两个图像之间的相似性比率。
pHash功能:
这些功能足以评估各方面的图像相似度。