OpenCV:指纹图像并与数据库进行比对

9
我有一个图像数据库。当我拍摄新照片时,我想用OpenCV将其与此数据库中的图像进行比较,并获得相似度分数。这样我就可以检测出是否有一张图片非常类似于新照片。
是否有可能创建我的数据库图像的指纹/哈希,并将新的图像与之匹配?
我正在寻找算法代码片段或技术演示,而不是商业解决方案。
最好的祝福,
斯特凡

2
通常这种事情是通过从图像中提取特征向量并在特征向量上进行某种模板匹配来完成的。 - Paul R
3个回答

10

正如Paul R所评论的那样,这个“指纹/哈希”通常是一组特征向量或一组特征描述符。但是,在计算机视觉中使用的大多数特征向量都通常对于针对数据库进行搜索来说计算成本太高。因此,这项任务需要一种特殊的特征描述符,因为即使使用各种优化,像SURF和SIFT这样的描述符在搜索时也会花费太多时间。

OpenCV为您的任务(对象分类)提供的唯一功能是实现视觉词袋(BOW)。

它可以计算特殊类型的图像特征并训练视觉词汇。接下来,您可以使用此词汇在数据库中查找相似的图像并计算相似度得分。

这里是OpenCV的文档关于词袋的介绍。此外,OpenCV还有一个名为bagofwords_classification.cpp的示例。它非常庞大,但可能会有帮助。


1
安德烈,你怎么做到这一点的: “它可以计算特殊类型的图像特征并训练视觉词汇。接下来,您可以使用此词汇在数据库中查找相似的图像并计算相似度分数。” - lilouch

2
内容基础图像检索系统仍然是一个活跃的研究领域:http://citeseerx.ist.psu.edu/search?q=content-based+image+retrieval 首先,您需要明确,在您的上下文中什么构成相似:
1. 相似的颜色分布:使用类似颜色描述符的东西来细分图像,您应该能够得到一些相当令人满意的结果。
2. 相似的对象:由于计算机不知道什么是对象,除非您对对象(或少数对象类)有一些广泛的领域知识,否则您将无法取得很大进展。可以在这里看到关于当前研究状态的良好概述:hereresults),并且很快也会在这里看到:here
对于您所描述的问题,没有“服务所有需求”的算法。您分享的问题细节越多,您可能得到的答案就越好。如果可能,请发布一些代表性图像并描述所需结果,这也非常有帮助。
如果已经存在,则computer-vision.stackexchange.com是一个很好的问题。

0

您可以使用pHash算法,并将phash值存储在数据库中,然后使用以下代码:

double const mismatch = algo->compare(image1Hash, image2Hash);

这里的“mismatch”值可以轻松告诉您两个图像之间的相似度比率。

pHash函数:

  1. AverageHash
  2. PHASH
  3. MarrHildrethHash
  4. RadialVarianceHash
  5. BlockMeanHash
  6. BlockMeanHash
  7. ColorMomentHash

这些函数足以在各个方面评估图像相似性。


从比较函数得到结果后,你应该如何知道它们相似或不同的程度? - werber bang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接