Correspondance de modèles NCC

Tutoriel vidéo 8 - Correspondance de modèles NCC : https://singtown.com/learn/49598/

Algorithme NCC :

# Exemple de correspondance de modèles - Corrélation croisée normalisée (NCC)
#
# Cet exemple montre comment utiliser la fonctionnalité NCC de votre OpenMV
# Cam pour faire correspondre des portions d'image à des parties d'une
# image... sauf dans des environnements extrêmement contrôlés, NCC n'est pas
# très utile.
#
# ATTENTION : la prise en charge de NCC doit être retravaillée ! À l'heure
# actuelle, cette fonctionnalité nécessite beaucoup de travail pour devenir
# vraiment utile. Ce script reste présent pour montrer que la fonctionnalité
# existe, mais, dans son état actuel, elle est insuffisante.

import csi
import time, csi, image
csi0 = csi.CSI()

from image import SEARCH_EX, SEARCH_DS
# Importe SEARCH_EX et SEARCH_DS depuis le module image. L'utilisation de
# from import n'importe que les deux parties nécessaires SEARCH_EX, SEARCH_DS,
# sans importer l'intégralité du module image.

# Réinitialise le capteur
csi0.reset()

# Définit les réglages du capteur
csi0.contrast(1)
csi0.gainceiling(16)
# La résolution maximale pour la correspondance de modèles avec SEARCH_EX est QQVGA
csi0.framesize(csi.QQVGA)
# Vous pouvez définir un fenêtrage pour réduire l'image de recherche.
#csi0.window(((640-80)//2, (480-60)//2, 80, 60))
csi0.pixformat(csi.GRAYSCALE)

# Charge le modèle.
# Le modèle doit être une petite image en niveaux de gris (par ex. 32x32 pixels).
template = image.Image("template.pgm")
# charge l'image du modèle

clock = time.clock()

# Exécute la correspondance de modèles
while (True):
    clock.tick()
    img = csi0.snapshot()

    # find_template(template, threshold, [roi, step, search])
    # ROI : le tuple de la région d'intérêt (x, y, w, h).
    # Step : le pas de boucle utilisé (y+=step, x+=step), utilisez un pas plus grand pour accélérer.
    # Search est soit image.SEARCH_EX pour une recherche exhaustive, soit image.SEARCH_DS pour une recherche en diamant
    #
    # Remarque 1 : la ROI doit être plus petite que l'image et plus grande que le modèle.
    # Remarque 2 : en recherche en diamant, step et ROI sont tous deux ignorés.
    r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
    #find_template(template, threshold, [roi, step, search]), le 0.7 dans
    # threshold est le seuil de similarité, roi est la zone de correspondance
    # (le sommet supérieur gauche est (10,0), un rectangle de longueur 80 et
    # de largeur 60), notez que la taille de la roi doit être plus grande que
    # l'image modèle, mais plus petite que le framebuffer.
    # marque l'image correspondante trouvée
    if r:
        img.draw_rectangle(r)

    print(clock.fps())

Notez que, comme la taille de notre image modèle dépasse la flash intégrée d'openmv, nous devons insérer la carte SD avant d'effectuer les étapes suivantes. (Notez que vous devez insérer la carte SD avant la mise sous tension) Et cette correspondance de modèles ne peut être utilisée qu'à partir de la version de firmware 1.6 et supérieure, sinon elle affichera « can not find SEARCH_EX » lors de l'exécution

Tout d'abord, nous devons créer ou importer un modèle. Notez que ce modèle doit être au format pgm et a une limite de taille qui ne peut pas dépasser la taille de pixels d'openmv. Nous pouvons directement capturer une image modèle depuis openmv. Vous pouvez d'abord exécuter la routine helloworld.py pour laisser le framebuffer afficher l'image, puis la capturer.

Sélectionnez l'option d'enregistrement de l'image vers le pc. Notez que l'image directement capturée et enregistrée depuis openmv est au format bmp. Nous devons la convertir au format pgm. Vous pouvez faire une conversion en ligne sur ce site https://convertio.co/zh/bmp-pgm/

Ensuite, nous enregistrons le modèle pgm converti sur la carte sd (il y a 8 modèles dans cette carte sd, et le modèle de l'image ci-dessus est enregistré sous le nom ball0.pgm)

Ensuite, nous ouvrons la routine de correspondance de modèles

Changez le nom de fichier de modèle template.pgm à la ligne 28 en ball0.pgm

Et exécutez-le directement !

Voici l'utilisation de la fonction de correspondance de modèles find_template :

r = img.find_template(template, 0,7, roi=(10,0,80,60), step=4, search=SEARCH_EX) Le 0.7 dans threshold est le seuil de similarité, et roi est la zone de correspondance (le sommet supérieur gauche est (10, 0), la longueur est 80 et la largeur est 60). Notez que la taille de roi doit être plus grande que l'image modèle et plus petite que le framebuffer.

Notez que cette correspondance de modèles utilise l'algorithme ncc, qui ne peut faire correspondre que des zones similaires à la taille du modèle. Si vous voulez faire correspondre des images de tailles différentes, vous devez enregistrer plusieurs modèles de tailles différentes.

Si les problèmes suivants surviennent après l'exécution du programme :

  1. L'image modèle est trop grande, il est recommandé que l'image modèle soit plus petite que 80*60

  1. L'OpenMV2 n'a pas assez de mémoire, changez QQVGA en QQCIF


Comparaison entre correspondance de modèles et détection de points caractéristiques :
  • La correspondance de modèles (find_temolate) utilise l'algorithme ncc, qui ne peut faire correspondre que des motifs ayant à peu près la même taille et le même angle que l'image modèle. Les limitations sont relativement importantes. Si le motif cible dans le champ de vision est légèrement plus grand ou plus petit que l'image modèle, la correspondance peut échouer.

  • La correspondance de modèles convient aux situations où la distance entre la caméra et l'objet cible est fixe et où un mouvement dynamique n'est pas nécessaire. Par exemple, elle convient à la détection d'objets spécifiques sur une chaîne de montage, mais pas pour une voiture qui suit un ballon de volley en mouvement (car la distance entre le ballon en mouvement et la caméra est dynamique, et la taille du ballon vue par la caméra changera, et ne sera pas exactement identique à l'image modèle).

  • Pour une correspondance à angles et tailles multiples, vous pouvez essayer d'enregistrer plusieurs modèles et utiliser la correspondance de modèles multiples.

  • La détection de points caractéristiques (find_keypoint) : si vous venez de lancer le programme, la routine extrait la première image comme caractéristique de l'objet cible, et kpts1 enregistre la caractéristique de l'objet cible. Par défaut, elle fera correspondre plusieurs échelles et angles de la caractéristique cible, plutôt que de ne sauvegarder que la taille et l'angle de la caractéristique cible. C'est plus flexible que la correspondance de modèles et ne nécessite pas d'enregistrer plusieurs images modèles comme la correspondance de modèles multiples.

  • La détection de points caractéristiques peut également enregistrer les caractéristiques cibles à l'avance. Cela n'était pas recommandé auparavant car les interférences de la lumière ambiante et d'autres raisons peuvent causer des caractéristiques différentes selon la lumière à chaque exécution du programme, et le taux de correspondance sera réduit. Cependant, dans la dernière version du firmware, le réglage de l'exposition, de la balance des blancs, et de la valeur de gain automatique a été ajouté. La valeur d'exposition et la valeur de balance des blancs peuvent être définies manuellement, ce qui réduira relativement l'interférence de la lumière. Vous pouvez également essayer d'enregistrer les caractéristiques cibles à l'avance.


results matching ""

    No results matching ""