Traitement de vidéos

Encore à l'état de brouillon, ce chapitre illustre l'utilisation du module opencv pour le traitement de fichiers vidéo.

Suivi automatique d'un escaladeur durant sa progression sur le mur

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

Attention !

Cette commande doit être exécutée en mode administrateur. Sous Windows, dans le menu Démarrer, clic droit sur l'application "invite de commandes" et choisir "exécuter en tant qu'administrateur".

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.