2015-12-15 3 views
0

J'essaye de créer une application qui fera correspondre une image d'une façade de bâtiment à une image dans ma base de données (voir l'exemple d'image ci-dessous). Je suis l'implémentation de l'application en Java et jusqu'à présent, j'ai suivi ce tutoriel: http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_homography/feature_homography.htmlImage correspondant à plusieurs images avec OpenCV SURF

Ce que je voudrais aider avec est de savoir comment passer à l'étape suivante et adapter mon code de sorte que je tire vers le haut des images stockées à correspondre à l'image d'entrée. Comment ferais-je cela? Est-ce que je stocke l'image elle-même et les points-clés de chaque image dans la base de données? ou est-ce que je stocke les Matchers Descriptor?

Des tutoriels ou des exemples d'application de ce type seraient grandement appréciés.

Test building facade matching

Répondre

1

Vous essentiellement stocker

  • descripteurs pour permettre correspondant
  • positions des points clés correspondant pour permettre le rejet des matches en fonction des contraintes géométriques

Vous n'avez pas Il faut vraiment stocker chaque image, mais vous pouvez en stocker au moins une pour chaque bâtiment afin d'afficher la meilleure correspondance de l'utilisateur.

Quels problèmes avez-vous en ce moment? Quantité d'espace nécessaire pour votre base de données? Vitesse de correspondance? Ou peut-être la qualité correspondante? Selon votre réponse, vous pouvez avoir différentes approches.

Je tenterais d'abord d'implémenter l'approche la plus simple, en faisant simplement une itération sur les données extraites des images de référence dans votre base de données et en essayant de faire correspondre votre image. Vous pouvez sélectionner l'image de référence qui génère des inliers maximum, puis vérifier si leur valeur est supérieure à un certain seuil défini empiriquement pour déterminer si vous avez une correspondance.

Si vous avez des problèmes de performance, vous pouvez essayer de profiter du fait que vous préparez la base et pré-calculer quelque chose d'utile. Un exemple serait plusieurs arbres kd, ou un arbre kd qui a des caractéristiques toutes les images (en stockant l'indice de chaque caractéristique), puis effectuer des correspondances avec quelques modifications (permettre à chaque point clé de l'image source pour correspondre à plusieurs points-clés s'ils proviennent de différentes images de référence). Puis, après l'appariement et les tests géométriques, vérifiez quelle image de référence obtient le maximum de correspondance. Si vous avez des problèmes de mémoire, vous pouvez essayer de limiter le nombre de points caractéristiques pour chaque image de référence (effectuer un tri décroissant par score, ne laisser que les meilleures caractéristiques N). Vous pouvez également utiliser des descripteurs plus petits (SURF sur SIFT, etc.). Mais je ne pense pas que ce soit un scénario probable, car vous aurez besoin d'environ 100-1000 fonctionnalités par image de référence, et en supposant que vous utilisez un descripteur SIFT avec 128 flottants, vous obtiendrez 1000 * 128 * 4 = 500 kilo-octets par image. L'utilisation de 200 points par image de référence et de descripteurs SURF avec 64 flotteurs vous donnera 50 kilo-octets par image. Vous pouvez aller encore plus loin et utiliser des caractères pour SURF et obtenir ~ 13 ko par image, mais la qualité correspondante sera probablement dégradée.

+0

Je n'ai pas encore commencé à implémenter cette partie de mon application, alors ce que je voulais savoir, c'est comment stocker les informations que vous avez indiquées dans votre post? J'ai vu quelques exemples de personnes les stockant dans une matrice, puis récupérant l'information comme ils bouclent à travers les images stockées et en utilisant simplement les informations récupérées pour correspondre à l'image d'entrée. Comment puis-je déterminer si l'image est un match ou non? – Juppal

+0

Je comprends que vous êtes à la recherche d'une «meilleure pratique», mais malheureusement, je n'ai pas l'expérience de faire correspondre les images à l'aide d'une base de données, alors mon conseil peut ne pas être pertinent. Donc, pour éviter une optimisation prématurée, il peut être préférable d'essayer d'abord l'approche naïve, puis de voir où elle doit être améliorée. Quoi qu'il en soit, j'ai ajouté une pensée dans ma réponse. – alexisrozhkov

+0

Merci pour vos conseils. – Juppal