Derrière ce titre un peu trompeur, nous n’allons pas trouver Charlie dans une image, mais nous allons plutôt le rechercher. Nous allons explorer la mise en correspondance de modèle, grâce à la fonction matchTemplate d’OpenCV. Cette fonction permet de chercher les correspondances entre un patch et une image en utilisant différentes méthodes.

Pour illustrer l’utilisation de cette fonction, nous allons nous baser sur une image provenant des livres-jeux où est Charlie. Nous allons donc commencer par importer opencv et charger l’image.

import cv2
 
image=cv2.imread('charlie.jpg')

Après un certain temps à avoir chercher Charlie, nous allons extraire notre template :

charlie_template=image[625:675,580:610]
h, w, _ = charlie_template.shape
Template utilisé pour trouver Charlie

la ligne 5 permet de récupérer la taille du template (nous n’avons pas besoin de connaitre le nombre de composante).

Nous pouvons donc rechercher notre template dans l’image.

res = cv2.matchTemplate(image,charlie_template, cv2.TM_CCOEFF)
 
_, _, _, max_loc = cv2.minMaxLoc(res)
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(image,top_left, bottom_right, 255, 2)

Nous allons nous arrêter là pour quelques explications sur le fonctionnement de matchTemplate.

Pour trouver la partie de l’image contenant notre modèle la fonction déplace le template tout au long de l’image en déplaçant la fenêtre par pas de 1 pixel (de gauche à droite et de haut en bas).À chaque position, une métrique est calculée afin de représenter si la fenêtre correspond de près ou de loin au template. Dans notre cas, la métrique calculée est le coefficient de corrélation (cv2.TM_CCOEFF).

À la ligne 7 nous utilisons donc la fonction matchTemplate(). Cette fonction prend en entrée une image, le template et la méthode de recherche et donne en sortie une matrice contenant les métriques calculées en chacune des positions.

Afin de trouver le point ayant la plus forte correspondance avec notre template, nous utilisons la fonction minMaxLoc() (ligne 9). Cette fonction permet de retourner les valeurs minimales et maximales ainsi que leurs positions.

Les lignes 10-12 permettent de représenter le résultat obtenu. Nous allons tracer un rectangle partant de la position de la valeur maximale (max_loc, point supérieur gauche) et allant jusqu’au point inférieur droit (ligne 11).

La fonction rectangle permet de dessiner le rectangle en prenant en entrée l’image où sera dessiné le rectangle, le point supérieur gauche, le point inférieur droit, la couleur du rectangle et la taille des lignes.

Nous pouvons donc enfin afficher notre image transformée:

cv2.imshow('image',image)
cv2.waitKey(0)
Charlie a été trouvé grâce à un template
Trouvé !

Nous avons donc retrouvé notre template dans l’image. Cependant le template que nous avons utilisé ne permettra pas forcement de retrouver Charlie dans d’autre image, il faudra donc toujours s’armer de patience pour le trouver !

Catégories : DétectionOpenCV

0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.