OpenCV / SURF如何从描述符中生成图像哈希/指纹/签名?

时间:2010-01-27 11:46:47

标签: opencv image-processing data-structures surf

这里有一些主题对于如何找到类似的图片非常有帮助。

我想要做的是获取图片的指纹,并在数码相机拍摄的不同照片上找到相同的图片。 SURF算法接缝是独立于缩放,角度和其他失真的最佳方式。

我正在使用带有SURF算法的OpenCV来提取样本图像上的特征。现在我想知道如何将所有这些特征数据(位置,拉普拉斯,大小,方向,粗麻布)转换为指纹或散列。

此指纹将存储在数据库中,搜索查询必须能够将该指纹与具有几乎相同功能的照片指纹进行比较。

更新

似乎没有办法将所有描述符向量转换为简单的哈希。那么将图像描述符存储到数据库中以便快速查询的最佳方法是什么?

词汇树是一种选择吗?

我会非常感谢任何帮助。

4 个答案:

答案 0 :(得分:9)

您提到的要素数据(位置,拉普拉斯,大小,方向,粗麻布)不足以满足您的需要(如果您想进行匹配,这些实际上是描述符中不太相关的部分)。您要查看的数据是“描述符”(第4个参数):

void cvExtractSURF(const CvArr* image, const CvArr* mask, CvSeq** keypoints, CvSeq** descriptors, CvMemStorage* storage, CvSURFParams params)

这些是128或64(取决于params)向量,其包含特定特征的“指纹”(每个图像将包含可变量的此类向量)。 如果您获得最新版本的Opencv,他们会有一个名为find_obj.cpp的示例,它会向您展示如何使用它来匹配

<强>更新

您可能会发现this讨论有用

答案 1 :(得分:3)

计算哈希的一种简单方法如下。从图像中获取所有描述符(例如,N个)。每个描述符是128个数字的向量(您可以将它们转换为0到255之间的整数)。所以你有一组N * 128个整数。只需将它们一个接一个地写入字符串并将其用作哈希值。如果你希望哈希值很小,我相信有办法计算字符串的哈希函数,所以将描述符转换为字符串,然后使用该字符串的哈希值。

如果您想要找到确切的重复项,那可能会有效。但似乎(因为你谈论规模,旋转等)你想要找到“相似”的图像。在这种情况下,使用哈希可能不是一个好方法。您可能使用一些兴趣点检测器来查找计算SURF描述符的点。想象一下,它将返回相同的点集,但顺序不同。突然间,即使图像和描述符相同,您的哈希值也会非常不同。

所以,如果我必须可靠地找到类似的图像,我会使用不同的方法。例如,我可以对SURF描述符进行矢量量化,构建矢量量化值的直方图,并使用直方图交集进行匹配。你真的绝对必须使用哈希函数(可能是为了提高效率),还是只是想用任何东西来找到类似的图像?

答案 2 :(得分:2)

似乎GIST可能更适合使用。

http://people.csail.mit.edu/torralba/code/spatialenvelope/有MATLAB代码。

答案 3 :(得分:2)

Min-Hash min-Hashing 是一种可以帮助您的技术。它以具有可调整大小的表示对整个图像进行编码,然后将其存储在哈希表中。存在几种变体,如几何min-Hashing 分区min-Hash Bundle min-Hashing 。由此产生的内存占用量不是最小的,但这些技术适用于各种场景,例如近似重复检索甚至是小对象检索 - 其他短签名通常表现不佳的场景。

关于这个主题有几篇论文。入门文献将是: 近似重复图像检测:min-Hash和tf-idf加权 Ondrej Chum,James Philbin,Andrew Zisserman,BMVC 2008 PDF