OpenCV – La souris

nous allons aborder ici les rudiments d’utilisation de la souris avec Open CV.

pour cela un programme tres basique qui illustre les évènements de la souris et les traitements associés.

en préliminaire , voici la liste des évènements souris reconnus par OPENCV:

voyons maintenant le programme

import cv2      #import de la librairie openCV
import numpy	#import de la librairie numpy (maths sur les matrices d'ordre N)
# les images sont traitées comme des matrices d'ordre 3 (X,Y,couleurRGB)
# x pixels en largeur + Y pixels en hauteur + 3 bits de couleurs (RGB) 

# fonction qui defini les reactions aux evenements souris
def click_event(event,x,y,flags,param):     
    if event == cv2.EVENT_RBUTTONDOWN:
        cv2.circle(img,(x,y),20,(0,255,0),3)
        strXY = str(x) + ',' + str(y)
        cv2.putText(img, strXY, (x+21,y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,0),1)
    elif event == cv2.EVENT_LBUTTONDOWN:
        cv2.rectangle(img,(x-20,y-20),(x+20,y+20),(255,0,0),3)
        strXY = str(x) + ',' + str(y)
        cv2.putText(img, strXY, (x+21,y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,0),1)
 
# creation d'un fond noir (img)dans une fenetre('image')et liaison de la fonction setmoussecallback
img = numpy.zeros((480,640,3), numpy.uint8)  
cv2.namedWindow('image')
cv2.setMouseCallback('image',click_event)

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(1) == 27:
        break
cv2.destroyAllWindows()

ce qui donne comme exemple de résultat un programme qui ouvre une fentre a fond noir et dessine un rectangle bleu ou un cercle vert a l’endroit de la souris suivant qu’on clique sur le bouton droit ou gauche de la souris. il affiche en plus a droite de la figure les coordonnées (X,Y ) de la position de souris dans l’image ( coordonnées en pixels).

prenons quelques instants pour détailler et comprendre ce qui se passes:

au milieu de lignes de codes on trouve les 3 lignes suivantes :

img = numpy.zeros((480,640,3), numpy.uint8)  
cv2.namedWindow('image')
cv2.setMouseCallback('image',click_event)
  • la première ligne défini une variable tableau “img” a partir de la librairie numpy qui met a zéro (numpy.zeros) les valeurs de la matrices d’ordre 3 définissant en fait une image de 480pixels de hauteur, par 640 pixels de largeur et 3 valeurs de couleurs BGR pour chaque pixel . les valeurs sont codées sur 8bits via le code ‘numpy.uint8’ . comme les valeur BGR sont mises a zéro par la fonction numpy, cela fait une image en noir
  • la deuxième ligne crée une fenêtre OpenCV dont le nom est ‘image’
  • la troisieme ligne affecte les évènements de la souris à la fenêtre ‘Image’ et a la fonction ‘clik_event’

faisant appel a une fonction ‘click_event’, il faut définir celle ci , c’est l’objet des lignes suivantes:

def click_event(event,x,y,flags,param):     
    if event == cv2.EVENT_RBUTTONDOWN:
        cv2.circle(img,(x,y),20,(0,255,0),3)
        strXY = str(x) + ',' + str(y)
        cv2.putText(img, strXY, (x+21,y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,0),1)
    elif event == cv2.EVENT_LBUTTONDOWN:
        cv2.rectangle(img,(x-20,y-20),(x+20,y+20),(255,0,0),3)
        strXY = str(x) + ',' + str(y)
        cv2.putText(img, strXY, (x+21,y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,0),1)

la premiere boucle if correspondant au bouton droit enfoncé , elle dessine un cercle dans la fenetre ‘img’ , dont le centre est aux coordonnées x,Y retournées par la souris , d’un rayon de 20 pixels, de la couleur BGR (0,255,0) soit le Vert (G). puis retourne une variable string ‘strXY’ constituée des coordonnées XY du pointeur de souris avec une virgule au milieu. et affiche le texte dans la fenetre’img’ constitué de la variable ‘strXY’ , affichée aux coordonnées (x+21,Y) en ulisant la police de caracteres arial taille 0.5 en couleur (255,255,0) soit un bleu clair et d’epaisseur 1 .

la deuxieme boucle If fait la meme chose si le bouton Gauche est enfoncé et dessine un rectangle bleu cantré sur la position de la souris de largeur et hauteur identique (20 pixels) de couleur bleu foncé et affiche a droite les coordonnées XY.

la derniere partie du programme :

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(1) == 27:
        break
cv2.destroyAllWindows()

effectue une boucle permanente qui affiche l’image ‘img’ resultante de toutes les operations dans la fenetre ‘image’ puis teste l’appui de touche au clavier et termine le programme si ‘echap” est appuyée la dernier ligne de commande ferme la fenêtre du programme .