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

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

我想要做的是获得一张图片的指纹,并find数码相机拍摄的不同照片上的相同图片。 SURFalgorithm接缝是在缩放,angular度和其他失真方面独立的最佳方式。

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

该指纹将被存储在数据库中,并且search查询必须能够将该指纹与具有几乎相同特征的照片的指纹进行比较。

更新:

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

词汇树会成为一个select吗?

我会非常感谢任何帮助。

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

void cvExtractSURF(const CvArr * image,const CvArr * mask,CvSeq **关键点,CvSeq **描述符,CvMemStorage *存储,CvSURFParams params)

这些是包含特定特征的“指纹”的128或64(取决于参数)vector(每个图像将包含可变数量的这种vector)。 如果你得到最新版本的Opencv,他们有一个名为find_obj.cpp的示例,它显示了它如何用于匹配

更新

你可能会发现这个讨论有帮助

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

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

所以,如果我必须可靠地find相似的图像,我会用不同的方法。 例如,我可以vector量化SURF描述符,构buildvector量化值的直方图,并使用直方图交集进行匹配。 你真的必须使用哈希函数(也许是为了提高效率),或者你只是想用什么来find相似的图像?

看来GIST似乎更适合使用。

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

Min-HashMin-Hashing是一种可以帮助你的技术。 它将整个图像编码为可调大小的表示,然后存储在散列表中。 像几何最小散列分区最小散列最小散列等几个变种确实存在。 由此产生的内存占用不是最小的,但这些技术适用于各种场景,如近重复检索,甚至小型对象检索 – 其他短签名往往performance不佳的场景。

有几个关于这个话题的论文。 入门文献将是: 近乎重复的图像检测:min-Hash和tf-idf加权 Ondrej密友,詹姆斯·菲尔宾,Andrew Zisserman,BMVC 2008 PDF