OpenCV / SURF comment générer une image hachée / empreinte digitale / signature à partir des descripteurs?

il y a quelques sujets ici qui sont très utiles sur la façon de trouver des images similaires.

Ce que je veux faire est d'obtenir une empreinte digitale d'une image et de trouver la même image sur les différentes photos prises par un appareil photo numérique. L'algorithme de SURF semble être la meilleure façon d'être indépendant sur l'échelle, l'angle et d'autres distorsions.

J'utilise OpenCV avec l'algorithme de SURF pour extraire les traits sur l'image d'échantillon. Maintenant je me demande comment convertir toutes ces données caractéristiques (position, laplacien, taille, orientation, hessian) dans une empreinte digitale ou de hachage.

cette empreinte digitale sera stockée dans une base de données et une requête de recherche doit être capable de comparer cette empreinte avec une empreinte digitale d'une photo avec presque les mêmes caractéristiques.

mise à Jour:

il semble qu'il n'y ait aucun moyen de convertir tous les vecteurs descripteurs en un simple hachage. Alors, quel serait le meilleur façon de stocker les descripteurs d'image dans la base de données pour une interrogation rapide?

est-ce que les arbres de vocabulaire seraient une option?

je serais très reconnaissant pour toute aide.

36
demandé sur Wooble 2010-01-27 14:46:47

4 réponses

les données de fonctionnalité que vous mentionnez (position, laplacien, taille, orientation, hessian) sont insuffisantes pour votre but (ce sont en fait les parties les moins pertinentes du descripteur si vous voulez faire l'appariement). Les données que vous voulez regarder sont les "descripteurs" (l'argument 4e):

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

ce sont 128 ou 64 (selon les params) vecteurs qui contiennent les" empreintes digitales " de la caractéristique spécifique (chaque image contiendra une quantité variable de ces vecteurs). Si vous obtenez la dernière version D'Opencv ils ont un échantillon nommé find_obj.cpp qui vous montre comment il est utilisé pour apparier

mise à jour :

vous pourriez trouver ce discussion utile

9
répondu elijah 2017-05-23 12:17:16

une façon triviale de calculer un hachage serait la suivante. Obtenez tous les descripteurs de l'image (disons N). Chaque descripteur est un vecteur de 128 nombres (vous pouvez les convertir en entiers entre 0 et 255). Donc vous avez un ensemble de n*128 entiers. Il suffit d'écrire l'un après l'autre dans une chaîne et l'utiliser comme une valeur de hachage. Si vous voulez que les valeurs de hachage soient petites, je crois qu'il y a des façons de calculer les fonctions de hachage des chaînes, donc convertissez les descripteurs en chaîne et puis utilisez le la valeur de hachage de cette chaîne.

ça pourrait marcher si vous voulez trouver des copies exactes. Mais il semble (puisque vous parlez d'échelle, rotation, etc) que vous voulez juste trouver des images "similaires". Dans ce cas, utiliser une table de hachage est probablement pas une bonne façon d'aller. Vous utilisez probablement un détecteur de points d'intérêt pour trouver des points où calculer des descripteurs de SURF. Imaginez qu'il vous renvoie le même ensemble de points, mais dans un ordre différent. Tout à coup, votre valeur de hachage sera très différent, même si les images et les descripteurs sont les mêmes.

donc, si je devais trouver des images similaires de façon fiable, j'utiliserais une approche différente. Par exemple, je pourrais vector-quantize les descripteurs de SURF, construire des histogrammes de valeurs vector-quantized, et utiliser l'intersection d'histogrammes pour l'appariement. Avez-vous vraiment obligé d'utiliser des fonctions de hachage (peut-être pour l'efficacité), ou voulez-vous simplement à utiliser que ce soit pour trouver des images similaires?

3
répondu user245973 2010-01-30 01:22:19

il semble que GIST pourrait être une chose plus appropriée à utiliser.

http://people.csail.mit.edu/torralba/code/spatialenvelope / a le code MATLAB.

2
répondu forefinger 2010-02-08 20:24:36

Min-Hash ou min-hash est une technique qui pourrait vous aider. Il encode l'image entière dans une représentation avec la taille réglable qui est ensuite stockée dans les tables de hachage. Il existe plusieurs variantes comme min-hash Géométrique , min-Hash de Partition et min-Hash de faisceau . L'empreinte mémoire résultante n'est pas l'une des plus petites, mais ces techniques fonctionnent pour un divers scénarios, comme la récupération quasi-duplicative et même la récupération de petits objets - un scénario où d'autres signatures courtes ne fonctionnent pas très bien.

Il ya plusieurs documents sur ce sujet. La littérature d'entrée serait: Près de Dupliquer l'Image de Détection: min-Hachage et tf-idf Pondération Ondrej Chum, James Philbin, Andrew Zisserman, BMVC 2008 PDF

2
répondu Stefan 2014-02-20 13:53:19