web-dev-qa-db-fra.com

OpenCV / SURF Comment générer un hachage d'image / une empreinte digitale / une signature à partir des descripteurs?

Certains sujets ici sont très utiles pour trouver des images similaires.

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

J'utilise OpenCV avec l'algorithme SURF pour extraire des fonctionnalités sur l'image d'exemple. Maintenant, je me demande comment convertir toutes ces données de caractéristiques (position, laplacian, taille, orientation, jute) en une empreinte digitale ou un hachage.

Cette empreinte digitale sera stockée dans une base de données et une requête de recherche doit pouvoir comparer cette empreinte digitale avec l'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, quelle serait la meilleure façon de stocker les descripteurs d'image dans la base de données pour une interrogation rapide?

Les arbres de vocabulaire seraient-ils une option?

Je serais très reconnaissant pour toute aide.

37
dan

Les données de caractéristiques que vous mentionnez (position, laplacien, taille, orientation, jute) sont insuffisantes pour votre objectif (ce sont en fait les parties les moins pertinentes du descripteur si vous voulez faire une correspondance). Les données que vous souhaitez consulter sont les "descripteurs" (le 4ème argument):

void cvExtractSURF (image CvArr * const, masque CvArr * const, points clés CvSeq **, descripteurs CvSeq **, stockage CvMemStorage *, paramètres CvSURFParams)

Ce sont 128 ou 64 (selon les paramètres) 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 exemple nommé find_obj.cpp qui vous montre comment il est utilisé pour la correspondance

mise à jour :

vous pourriez trouver this discussion utile

9
elijah

Un moyen simple de calculer un hachage serait le suivant. Obtenez tous les descripteurs de l'image (disons, N d'entre eux). Chaque descripteur est un vecteur de 128 nombres (vous pouvez les convertir en nombres entiers compris entre 0 et 255). Vous avez donc un ensemble de N * 128 entiers. Écrivez-les simplement les uns après les autres dans une chaîne et utilisez-les comme valeur de hachage. Si vous voulez que les valeurs de hachage soient petites, je pense qu'il existe des moyens de calculer les fonctions de hachage des chaînes, donc convertissez les descripteurs en chaîne, puis utilisez la valeur de hachage de cette chaîne.

Cela pourrait fonctionner si vous voulez trouver des doublons exacts. Mais il semble (puisque vous parlez d'échelle, de rotation, etc.) que vous vouliez simplement trouver des images "similaires". Dans ce cas, utiliser un hachage n'est probablement pas une bonne solution. Vous utilisez probablement un détecteur de points d'intérêt pour trouver des points sur lesquels calculer les descripteurs SURF. Imaginez qu'il renverra le même ensemble de points, mais dans un ordre différent. Soudainement, votre valeur de hachage sera très différente, même si les images et les descripteurs sont les mêmes.

Donc, si je devais trouver des images similaires de manière fiable, j'utiliserais une approche différente. Par exemple, je pourrais quantifier vectoriel les descripteurs SURF, construire des histogrammes de valeurs quantifiées vectorielles et utiliser l'intersection d'histogramme pour la correspondance. Devez-vous vraiment utiliser des fonctions de hachage (peut-être pour plus d'efficacité), ou voulez-vous simplement utiliser n'importe quoi pour trouver des images similaires?

3
user245973

Min-Hash ou min-Hashing est une technique qui pourrait vous aider. Il encode l'image entière dans une représentation de taille ajustable qui est ensuite stockée dans des tables de hachage. Plusieurs variantes comme Min-Hash géométrique, Partition min-Hash et Bundle min-Hashing existent. L'empreinte mémoire qui en résulte n'est pas l'une des plus petites, mais ces techniques fonctionnent pour une variété de scénarios tels que la récupération quasi-dupliquée et même la récupération de petits objets - un scénario dans lequel d'autres signatures courtes ne fonctionnent souvent pas très bien.

Il existe plusieurs articles sur ce sujet. La documentation d'entrée serait: Détection d'image presque en double: pondération min-Hash et tf-idf Ondrej Chum, James Philbin, Andrew Zisserman, BMVC 2008 PDF

2
Stefan

Il semble que Gist soit une chose plus appropriée à utiliser.

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

2
forefinger