Categories: DétectionOpenCV

Où est Charlie ?

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

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)
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 !

Florent

Recent Posts

Installer OpenCV 5 sur MacOS

Vous avez commencé un projet de vision par ordinateur ou de traitement d'images ? Alors,…

2 semaines ago

[Étape 3] Création d’un Photobooth – Finalisation

Nous avons vu dans les précédents articles de quel matériel nous avions besoin pour créer…

3 semaines ago

[Étape 2] Création d’un photobooth – Logiciel

Nous avons préparé la semaine dernière toute la partie matérielle du photobooth. Maintenant nous allons…

4 semaines ago

[Étape 1] Création d’un photobooth – Hardware

J'avais il y a quelques années réalisé un photobooth, afin de permettre aux convives de…

1 mois ago

Conduite autonome : comment détecter les lignes d’une route

Détecter les voies de circulation est une étape incontournable pour la réalisation d’un système de…

2 mois ago

Installez OpenCV 4 sur macOs

Vous avez commencé un projet de vision par ordinateur ou de traitement d'images ? Alors,…

4 mois ago