OpenCV | SIFT SURF | Hash | 图像搜索

3
我对图像处理和图像匹配非常陌生,不是很清楚。我需要做的是: a)拍摄一张图片 b)从中提取特征(SIFT、SURF更适合匹配) c)创建哈希值(如MD5或SHA1) d)将其存储在数据库中,并搜索是否有相似的不同图片。
基本上(A Tineye)
我参考了OpenCV / SURF How to generate a image hash / fingerprint / signature out of the descriptors?。我还查看了pHash,并尝试通过opencv simple_matcher.cpp运行SIFT SURF。
稍微了解了几下几何哈希/局部敏感哈希,但不确定我是否朝着正确的方向前进。
我如何从SIFT/SURF(OpenCV)提取的特征中创建哈希值?如果有人能告诉我应该遵循哪些简单的步骤或引用来继续前进,我将不胜感激。

1
你的最终目标是将一张图片与许多数据库中的图片进行匹配吗? - kamjagin
@kamjagin 是的。我正在尝试构建一个小应用程序,假设我们在一个笔记本电脑上找到了500张图片,在另一个笔记本电脑上找到了100张图片。我正在尝试查找它们之间是否共享了任何图像。这些图像可能已经被修改过,因此我不能只使用MD5散列值进行比对。 - bitvijays
1个回答

4
好的,有很多种匹配图像的好方法,复杂程度不同。我会提供一个建议,认为它足够解决你描述的问题并且非常简单易懂(因为你说你对计算机视觉感到非常新奇 :) )。
  1. 在计算机1上对图像进行稀疏或密集的SURF特征计算
  2. 创建词汇表(对于这个任务,随机生成一个可能也足够好)
  3. 将特征分配给词汇表(nn)
  4. 构建kd-tree(用于最近邻)或者学习一些分类器(例如sum)
  5. 将分类器应用于计算机2上的图像(在计算SURF并分配到词汇表之后)

相同的图像很可能会产生最高的分类得分。

我之所以建议这种方法而不是更快和更简单的方法,是因为对于500张图片这样少的数量,你不太可能遇到性能问题,而且opencv中有一个很好的例子(bagofwords_classification.cpp),你可以按步骤跟着做来实现你想要的目标。


我有几个问题:1)我们是计算稀疏还是密集的SURF特征,就像https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/cpp/matcher_simple.cpp?rev=3204中的代码一样吗?2)我读到了关于词袋的内容。它主要用于视觉对象类别pascal。但我的应用目标并不完全是如此。我的应用目标是查找儿童虐待的图像。3)我应该有一个包含所有与发现的图像相关的哈希值的中央数据库。这样,无论查获多少台笔记本电脑,我们只需扫描在笔记本电脑中找到的图像并检查数据库即可。4)图像可能会超过500张,甚至可能达到10000张。 - bitvijays
1
  1. 是的 - 这是一种计算两个不同图像的稀疏SIFT描述符的方法,对于这个问题已经足够好了。
  2. BOW只是一种在没有空间约束的情况下描述图像内容的方法(尽管金字塔类型的空间约束可以改善结果)。它可以解决你的问题。
  3. 仍然非常适合。每个图像将由其单词进行描述。
  4. 然后您应该查看细节以使其更有效。您可以从http://people.rennes.inria.fr/Herve.Jegou/的工作开始查看。他的网页上还有一些matlab代码。
- kamjagin

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