Traitement de vidéos
Encore à l'état de brouillon, ce chapitre illustre l'utilisation du
module opencv
pour le traitement de fichiers vidéo.
Le module opencv
OpenCV (Open Computer Vision) est une bibliothèque de vision par ordinateur composée d'algorithmes d'analyse d'images pour des tâches telles que le suivi ou la reconnaissance automatique de formes.
Un module vient compléter le jeu d'instructions de base du langage Python. Il doit donc être installé avant d'être utilisé. La commande sous Windows est la suivante :
python.exe -m pip install opencv-contrib-python imutils
Et sous Linux ou macOS
python3 -m pip install opencv-contrib-python imutils
Lecture d'une vidéo
import cv2
# Ouverture du fichier vidéo
cap = cv2.VideoCapture('video/John190.mp4')
# Problème de chargement ?
if (cap.isOpened() == False):
print("Error opening video file")
# Lecture de la vidéo jusqu'à la fin
while(cap.isOpened()):
# Récupération de la frame courante
# ret : code booléen de retour
# frame : tableau de pixels
ret, frame = cap.read()
if ret == True:
# Affichage de l'image dans une fenêtre
cv2.imshow('Frame', frame)
else:
break
# Touche Q pour quitter la boucle de lecture
if cv2.waitKey(25) & 0xFF == ord('q'):
break
# Fermeture du fichier vidéo
cap.release()
# Fermeture des fenêtres
cv2.destroyAllWindows()
Recherche d'une couleur dans l'image
Conversion de RGB en HSV
Seuillage à partir d'un intervalle HSV
import cv2
# Ouverture du fichier vidéo
cap = cv2.VideoCapture('video/John190.mp4')
# Problème de chargement ?
if (cap.isOpened() == False):
print("Error opening video file")
lower_red = np.array([160, 180, 180])
upper_red = np.array([180, 255, 255])
# Lecture de la vidéo jusqu'à la fin
while(cap.isOpened()):
# Récupération de la frame courante
# ret : code booléen de retour
# frame : tableau de pixels
ret, frame = cap.read()
if ret == True:
# Conversion RGB vers HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Seuillage de l'image
mask = cv2.inRange(hsv, lower_red, upper_red)
# Affichage de l'image et du masque dans une fenêtre
cv2.imshow('Frame', frame)
cv2.imshow('Binary Mask', mask)
else:
break
# Touche Q pour quitter la boucle de lecture
if cv2.waitKey(25) & 0xFF == ord('q'):
break
# Fermeture du fichier vidéo
cap.release()
# Fermeture des fenêtres
cv2.destroyAllWindows()
Calcul des coordonnées du centroïde
import cv2
# Ouverture du fichier vidéo
cap = cv2.VideoCapture('video/John190.mp4')
# Problème de chargement ?
if (cap.isOpened() == False):
print("Error opening video file")
lower_red = np.array([160, 180, 180])
upper_red = np.array([180, 255, 255])
path = []
# Lecture de la vidéo jusqu'à la fin
while(cap.isOpened()):
# Récupération de la frame courante
# ret : code booléen de retour
# frame : tableau de pixels
ret, frame = cap.read()
if ret == True:
# Conversion RGB vers HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Seuillage de l'image
mask = cv2.inRange(hsv, lower_red, upper_red)
# Calcul du centroïde
indices = np.where(mask == [255])
if len(indices[0])>0:
x = int(np.median(indices[1]))
y = int(np.median(indices[0]))
path.append( (x, y) )
# Affichage de l'image et du masque dans une fenêtre
cv2.imshow('Frame', frame)
cv2.imshow('Binary Mask', mask)
else:
break
# Touche Q pour quitter la boucle de lecture
if cv2.waitKey(25) & 0xFF == ord('q'):
break
# Fermeture du fichier vidéo
cap.release()
# Fermeture des fenêtres
cv2.destroyAllWindows()
Dessin de la trajectoire
import cv2
# Ouverture du fichier vidéo
cap = cv2.VideoCapture('video/John190.mp4')
# Problème de chargement ?
if (cap.isOpened() == False):
print("Error opening video file")
lower_red = np.array([160, 180, 180])
upper_red = np.array([180, 255, 255])
path = []
# Lecture de la vidéo jusqu'à la fin
while(cap.isOpened()):
# Récupération de la frame courante
# ret : code booléen de retour
# frame : tableau de pixels
ret, frame = cap.read()
if ret == True:
# Conversion RGB vers HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Seuillage de l'image
mask = cv2.inRange(hsv, lower_red, upper_red)
# Calcul du centroïde
indices = np.where(mask == [255])
if len(indices[0])>0:
x = int(np.median(indices[1]))
y = int(np.median(indices[0]))
path.append( (x, y) )
# Dessin de la trajectoire
for i in range(0, len(path)-1):
cv2.line(frame, path[i], path[i+1], (0, 255, 255), 2)
# Affichage de l'image et du masque dans une fenêtre
cv2.imshow('Frame', frame)
cv2.imshow('Binary Mask', mask)
else:
break
# Touche Q pour quitter la boucle de lecture
if cv2.waitKey(25) & 0xFF == ord('q'):
break
# Fermeture du fichier vidéo
cap.release()
# Fermeture des fenêtres
cv2.destroyAllWindows()
Conclusion
Je tiens sincèrement à vous féliciter pour votre persévérance ! Cette dernière activité était en quelque sorte le Boss de fin de niveau. J'espère que cette introduction à la programmation Python vous aura été utile. N'hésitez pas à me contacter si vous avez des questions, des remarques, voire des suggestions de nouveaux chapitres.