Reconnaissance d'objets avec OpenCV
Dans le domaine de la vision par ordinateur, la reconnaissance d'objets est une tâche très importante.
OpenCV est une puissante bibliothèque open source de vision par ordinateur qui fournit plusieurs méthodes pour mettre en œuvre la reconnaissance d'objets.
Cet article présentera en détail comment utiliser la méthode de correspondance de modèle dans OpenCV (cv2.matchTemplate()) pour effectuer la reconnaissance d'objets.
Qu'est-ce que la correspondance de modèle ?
La correspondance de modèle est une technique permettant de trouver la région d'une image qui ressemble le plus à une image modèle donnée.
En termes simples, la correspondance de modèle est le processus consistant à trouver la partie d'une grande image qui correspond le mieux à l'image modèle (c'est-à-dire l'objet que nous voulons reconnaître). Cette méthode convient aux cas où la taille, l'orientation et la forme de l'objet dans l'image restent globalement inchangées.
Image modèle :Une portion d'image de l'objet cible.
Image de recherche :L'image à détecter.
Résultat de correspondance :Représente la distribution de similarité de l'image modèle dans l'image de recherche.
Principes de base de la correspondance de modèle
Le principe de base de la correspondance de modèle consiste à faire glisser l'image modèle sur l'image cible, à calculer la similarité à chaque position et à trouver la position présentant la similarité la plus élevée. OpenCV propose plusieurs méthodes de calcul de similarité, telles que la correspondance par différence au carré (cv2.TM_SQDIFF), correspondance par différence au carré normalisée (cv2.TM_SQDIFF_NORMED), correspondance par corrélation croisée (cv2.TM_CCORR), correspondance par corrélation croisée normalisée (cv2.TM_CCORR_NORMED), correspondance par coefficient de corrélation (cv2.TM_CCOEFF) et correspondance par coefficient de corrélation normalisé (cv2.TM_CCOEFF_NORMED)。
Scénarios d'application
- Reconnaissance d'objets : utilisée pour localiser des objets spécifiques dans une image, tels que des logos, des icônes, etc.
- Suivi d'objets : utilisé pour suivre un objet cible dans une vidéo.
- Recalage d'images : utilisé pour aligner deux images.
Étapes de mise en œuvre de la correspondance de modèle
Charger l'image :Lire l'image de recherche et l'image modèle.
Correspondance de modèle :Utiliser
cv2.matchTemplate()pour trouver l'image modèle dans l'image de recherche.Obtenir le résultat de correspondance :Utiliser
cv2.minMaxLoc()pour obtenir le meilleur emplacement de correspondance.Dessiner le résultat de la correspondance :Dessiner la zone correspondante dans l'image de recherche.
Afficher le résultat :Afficher le résultat de la correspondance.
Méthodes de correspondance
OpenCV fournit plusieurs méthodes de correspondance de modèle, qui peuvent être spécifiées via le troisième paramètre de cv2.matchTemplate() :
| Méthode | Description |
|---|---|
cv2.TM_SQDIFF | Correspondance par différence au carré ; plus la valeur est petite, plus la correspondance est bonne. |
cv2.TM_SQDIFF_NORMED | Correspondance par différence au carré normalisée ; plus la valeur est petite, plus la correspondance est bonne. |
cv2.TM_CCORR | Correspondance par corrélation croisée ; plus la valeur est grande, plus la correspondance est bonne. |
cv2.TM_CCORR_NORMED | Correspondance par corrélation croisée normalisée ; plus la valeur est grande, plus la correspondance est bonne. |
cv2.TM_CCOEFF | Correspondance par coefficient de corrélation ; plus la valeur est grande, plus la correspondance est bonne. |
cv2.TM_CCOEFF_NORMED | Correspondance par coefficient de corrélation normalisé ; plus la valeur est grande, plus la correspondance est bonne. |
Utilisationcv2.matchTemplate()pour la reconnaissance d'objets
1. Importer les bibliothèques nécessaires
Tout d'abord, nous devons importer les bibliothèques OpenCV et NumPy.
NumPy est une bibliothèque fondamentale pour le calcul scientifique en Python, et OpenCV utilise des tableaux NumPy pour stocker les données d'image.
Exemple
import numpy as np
2. Charger l'image et le modèle
Ensuite, nous devons charger l'image cible et l'image modèle.
L'image cible est l'image dans laquelle nous voulons trouver l'objet, et l'image modèle est l'objet que nous voulons reconnaître.
Exemple
img = cv2.imread('target_image.jpg', 0)
template = cv2.imread('template_image.jpg', 0)
3. Obtenir les dimensions de l'image modèle
Pour faire glisser l'image modèle sur l'image cible, nous devons connaître la largeur et la hauteur de l'image modèle.
Exemple
w, h = template.shape[::-1]
4. Effectuer la mise en correspondance de modèle
Utilisercv2.matchTemplate()fonction pour effectuer la mise en correspondance de modèle.
Cette fonction renvoie une matrice de résultats, où chaque élément représente la similarité entre la position correspondante dans l'image cible et l'image modèle.
Exemple
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
5. Définir le seuil de correspondance et trouver l'emplacement de la correspondance
Nous pouvons définir un seuil pour déterminer si la correspondance est réussie.
Ensuite, utilisezcv2.minMaxLoc()la fonction pour trouver les positions des valeurs maximale et minimale dans la matrice de résultats.
Exemple
threshold = 0.8
# Trouver l'emplacement de la correspondance
loc = np.where(res >= threshold)
6. Marquer l'emplacement de la correspondance dans l'image cible
Enfin, nous pouvons marquer la position dans l'image cible qui correspond au modèle.
Habituellement, nous utilisons un rectangle pour marquer la zone de correspondance.
Exemple
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)
# Afficher l'image de résultat
cv2.imshow('Image correspondante', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Code complet
Ce qui suit est un exemple de code complet montrant comment utilisercv2.matchTemplate()pour effectuer la reconnaissance d'objets.
Exemple
import numpy as np
# Charger l'image cible et l'image modèle
img = cv2.imread('target_image.jpg', 0)
template = cv2.imread('template_image.jpg', 0)
# Obtenir les dimensions de l'image modèle
w, h = template.shape[::-1]
# Effectuer la mise en correspondance de modèle
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
# Définir le seuil de correspondance
threshold = 0.8
# Trouver l'emplacement de la correspondance
loc = np.where(res >= threshold)
# Marquer l'emplacement de la correspondance dans l'image cible
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)
# Afficher l'image de résultat
cv2.imshow('Image correspondante', img)
cv2.waitKey(0)
cv2.destroyAllWindows()