Tout d'abord il faut installer OpenCV sous python alors pour la démarche :
import numpy import cv2 print cv2.__version__
Si le résultat est affiché sans erreurs, félicitations !!! Vous avez installé OpenCV Python succès.
import cv2 im = cv2.imread('3x2.png') print im
Avec comme résultat
[[[ 0 0 0] [ 0 255 0] [ 0 0 0]] [[ 0 0 255] [255 255 255] [255 0 0]]]
Les informations relative au pixel en bas à droite de notre image sont donc accessibles de cette façon. (À noter que le stockage des couleurs est fait dans l'ordre BLEU-VERT-ROUGE, inverse d'un intuitif RVB)
# pour le niveau de Bleu print im[1][2][0] # pour le niveau de Vert print im[1][2][1] # pour le niveau de Rouge print im[1][2][2]
De même , le script suivant remplacera le pixel blanc (au milieu, en bas) par un pixel jaune :
import cv2 im = cv2.imread('3x2.png') im[1][1] = [0, 255, 255] # sauvegarde du resultat cv2.imwrite('resultat.png',im)
Ces manipulations sont, bien évidemment, aussi possibles en vidéo. Par exemple, le script ci-dessous trace une ligne rouge horizontale puis une ligne bleue verticale, en temps-réel, sur un flux vidéo capturé par une webcam.
import cv2 # setup video capture cap = cv2.VideoCapture(0) ret,im = cap.read() height, width = im.shape[:2] while True: ret,im = cap.read() # trait horizontal for i in range(width): im[height/2][i] = [0, 0, 255] # trait vertical for i in range(height): im[i][width/2] = [255, 0, 0] cv2.imshow('video test',im) key = cv2.waitKey(10)
Remarque:
La fonction pour ajouter une ligne horizontale sans calcul:
cv2.line(img, point1, point2, couleur, épaisseur) cv2.line(img, (0, 270), (960, 270), (0, 0, 0), 1)
La taille des flux vidéos capturés se définie avec .set(ID, valeur), où ID=3 pour la largeur et ID=4 pour la hauteur. Le script ci-dessous attribue une taille de 320*240 à cap0 et 160*120 à cap1
import cv2 cap0 = cv2.VideoCapture(0) cap0.set(3,320) cap0.set(4,240) cap1 = cv2.VideoCapture(1) cap1.set(3,160) cap1.set(4,120) while True: ret0,im0 = cap0.read() ret1,im1 = cap1.read() cv2.imshow("vid-0",im0) cv2.imshow("vid-1",im1) key = cv2.waitKey(10)
Pour info, voici la liste de ID des propriétés existante pour .set() (et pour .get(), par ailleurs).
N° | Paramètre | Description |
---|---|---|
0 | CV_CAP_PROP_POS_MSEC | Position dans le film en millisecondes |
1 | CV_CAP_PROP_POS_FRAMES | Position dans le film en nombre de frames |
2 | CV_CAP_PROP_POS_AVI_RATIO | Position dans le film en pourcentage |
3 | CV_CAP_PROP_FRAME_WIDTH | Largeur du flux vidéo |
4 | CV_CAP_PROP_FRAME_HEIGHT | Hauteur du flux vidéo |
5 | CV_CAP_PROP_FPS | Nombre d'images/seconde du flux vidéo |
6 | CV_CAP_PROP_FOURCC | Code du codec du flux vidéo |
7 | CV_CAP_PROP_FRAME_COUNT | Nombre total de frames (fichier vidéo uniquement) |
8 | CV_CAP_PROP_FORMAT | Format des objets Mat retournés par retrieve() |
9 | CV_CAP_PROP_MODE | La valeur spécifique à backend indiquant le mode de capture actuel |
10 | CV_CAP_PROP_BRIGHTNESS | Luminosité de l'image |
11 | CV_CAP_PROP_CONTRAST | Contraste de l'image |
12 | CV_CAP_PROP_SATURATION | Saturation de l'image |
13 | CV_CAP_PROP_HUE | Teinte de l'image |
14 | CV_CAP_PROP_GAIN | Gain de l'image |
15 | CV_CAP_PROP_EXPOSURE | Exposition de l'image |
16 | CV_CAP_PROP_CONVERT_RGB | Image N&B ou RGB |
17 | CV_CAP_PROP_WHITE_BALANCE | Actuellement non pris en charge |
18 | CV_CAP_PROP_RECTIFICATION | Flag rectification pour caméras stéréo (note: seulement pris en charge actuellement par DC1394 v 2.x) |
Il est possible de choisir sa source avec cv2.VideoCapture(0).
Il est possible choisir la position de chaque fenêtre de rendu, ainsi que de les déplacer avec cv2.moveWindow(video_name, posX, posY)
Le script ci-dessous ouvre deux flux, affiche 14 fenêtres et les déplacent sur l'écran :
import cv2 # setup video capture cap0 = cv2.VideoCapture(0) cap1 = cv2.VideoCapture(1) posV, posH = 0, 0 while True: ret0,im0 = cap0.read() ret1,im1 = cap1.read() if (posV == 200): posV = 0 if (posH > 900): posH = 0 for i in range (6): video_name = 'test2-{0}'.format(i) cv2.imshow(video_name.format(i),im0) cv2.moveWindow(video_name, posH+i*80, i*50) for i in range (8): video_name = 'test-{0}'.format(i) cv2.imshow(video_name.format(i),im1) cv2.moveWindow(video_name, 160*i+40, posV+i*50) key = cv2.waitKey(10) posV += 10 posH += 8
Dans cette partie nous allons voir comment créer un programme capable de reconnaître et localiser un objet dans un image.
Par la suite nous travaillerons sur la reconnaissance de visages mais cela peut être n'importe quel objet.