Détection de points caractéristiques
Tutoriel vidéo 16 - Détection et enregistrement de points caractéristiques : https://singtown.com/learn/50021/
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.
Détection de points caractéristiques
Cette routine est 09-feature-Detection-keypoints.py\ Cette routine utilise l'algorithme FAST/AGAST pour l'extraction de caractéristiques et le suivi de cible, et ne prend en charge que les images en niveaux de gris.
Remarque : cette routine prendra l'objet apparaissant dans les dix premières secondes du programme comme caractéristique cible. Veuillez placer l'objet cible au centre de la caméra au début du programme jusqu'à ce que le point angulaire caractéristique apparaisse, prouvant que la caractéristique cible a été identifiée et enregistrée.
Pendant le processus de correspondance, si une croix et un cadre rectangulaire apparaissent à l'écran, cela prouve que la correspondance a réussi
# Routine de détection d'un objet spécifique par points caractéristiques.
# Montrez un objet à la caméra, puis exécutez ce script. Un ensemble de
# points caractéristiques sera extrait une fois, puis suivi dans les images
# suivantes. Si vous voulez un nouvel ensemble de points caractéristiques,
# réexécutez le script.
# Remarque : consultez la documentation pour ajuster find_keypoints et match_keypoints.
import csi, time, image
csi0 = csi.CSI()
# Réinitialise le capteur
csi0.reset()
# Réglages du capteur
csi0.framesize(csi.VGA)
csi0.window((320, 240))
csi0.pixformat(csi.GRAYSCALE)
csi0.snapshot(time = 2000)
csi0.auto_gain(False)
# dessine les points caractéristiques
def draw_keypoints(img, kpts):
if kpts:
print(kpts)
img.draw_keypoints(kpts)
img = csi0.snapshot()
time.sleep_ms(1000)
kpts1 = None
# kpts1 enregistre la caractéristique de l'objet cible, il est possible d'importer la caractéristique depuis un fichier, mais ce n'est pas recommandé.
#kpts1 = image.load_descriptor("/desc.orb")
#img = csi0.snapshot()
#draw_keypoints(img, kpts1)
clock = time.clock()
while (True):
clock.tick()
img = csi0.snapshot()
if (kpts1 == None):
# si c'est le tout début de l'exécution du programme, extrait la toute première image comme caractéristique de l'objet cible, kpts1 enregistre la caractéristique de l'objet cible
# par défaut, fera correspondre plusieurs échelles de la caractéristique cible, pas seulement la taille au moment de l'enregistrement de la caractéristique cible, plus flexible que la correspondance de modèles.
# REMARQUE : par défaut, find_keypoints renvoie des points caractéristiques multi-échelles extraits d'une pyramide d'images.
kpts1 = img.find_keypoints(max_keypoints=150, threshold=10, scale_factor=1.2)
#image.find_keypoints(roi=Auto, threshold=20, normalized=False, scale_factor=1.5, max_keypoints=100, corner_detector=CORNER_AGAST)
# roi représente la zone de reconnaissance, c'est un tuple (x,y,w,h), correspondant par défaut à la taille de framesize.
# threshold est un seuil de 0 à 255, utilisé pour contrôler le nombre de points angulaires détectés. Avec la détection de points caractéristiques AGAST par défaut, ce seuil est d'environ 20. Avec la détection de points caractéristiques FAST, ce seuil est d'environ 60 à 80. Plus le seuil est bas, plus on obtient de points angulaires.
# normalized est une valeur booléenne, par défaut False, qui permet de faire correspondre plusieurs tailles de la caractéristique cible (plus flexible que la correspondance de modèles ncc). Si défini sur True, désactive les résultats multi-échelles de la détection de points caractéristiques, ne fait correspondre qu'une seule taille de la caractéristique cible (similaire à la correspondance de modèles), mais la vitesse de calcul sera un peu plus rapide.
# scale_factor est un nombre flottant supérieur à 1.0. Plus cette valeur est élevée, plus la détection est rapide, mais la précision de correspondance diminuera. Généralement, autour de 1.35~1.5 est optimal.
# max_keypoints est le nombre maximal de points caractéristiques pouvant être extraits pour un objet. Si un objet a trop de points caractéristiques et fait exploser la mémoire RAM, réduisez cette valeur.
# corner_detector est l'algorithme utilisé pour la détection de points caractéristiques, par défaut l'algorithme AGAST. L'algorithme FAST sera plus rapide mais la précision diminuera.
draw_keypoints(img, kpts1)
# dessine la caractéristique cible à ce moment
else:
# lors de la correspondance avec la caractéristique cible initiale, normalized=True est défini par défaut, ne fait correspondre qu'une seule taille de la caractéristique cible.
# REMARQUE : lors de l'extraction des points caractéristiques pour correspondre au premier descripteur, nous utilisons normalized=True pour extraire
# les points caractéristiques d'une seule échelle, ce qui correspondra à l'une des échelles du premier descripteur.
kpts2 = img.find_keypoints(max_keypoints=150, threshold=10, normalized=True)
# si un objet caractéristique est détecté
if (kpts2):
# fait correspondre la similarité entre les caractéristiques actuellement trouvées et la caractéristique cible initiale
match = image.match_descriptor(kpts1, kpts2, threshold=85)
#image.match_descriptor(descritor0, descriptor1, threshold=70, filter_outliers=False). Cette fonction renvoie un objet kptmatch.
# threshold définit la précision de la correspondance, utilisé pour filtrer les correspondances ambiguës. Plus cette valeur est petite, plus la précision est élevée. Plage du seuil 0~100, par défaut 70
# filter_outliers est désactivé par défaut.
# match.count est le nombre approximatif de points caractéristiques correspondants entre kpt1 et kpt2.
# si supérieur à 10, cela prouve que les deux caractéristiques sont similaires, la correspondance a réussi.
if (match.count>10):
# Si nous avons au moins n « bonnes correspondances »
# Dessine un rectangle englobant et une croix.
# dessine une croix et un rectangle au centre de la caractéristique cible correspondante.
img.draw_rectangle(match.rect)
img.draw_cross((match.cx, match.cy), size=10)
# match.theta est l'angle de rotation de l'objet caractéristique correspondant par rapport à l'objet cible.
print(kpts2, "matched:%d dt:%d"%(match.count, match.theta))
# il n'est pas recommandé de dessiner les points angulaires caractéristiques avec draw_keypoints.
# REMARQUE : décommentez si vous voulez dessiner les points caractéristiques
#img.draw_keypoints(kpts2, size=KEYPOINTS_SIZE, matched=True)
# Dessine le FPS
# affiche le taux d'images.
img.draw_string((0, 0), "FPS:%.2f"%(clock.fps()))
L'effet de l'exécution du programme :

