Aujourd’hui, nous allons étudier un programme inutile : nous allons extraire les images d’une vidéo afin de pouvoir générer une nouvelle vidéo à partir des images extraites ! Et le mieux dans tout ça, c’est que l’on perd le son. L’objectif principal derrière ce programme est de manipuler quelques fonctions de la bibliothèque os, un module d’interface avec le système d’exploitation.

Commençons donc par extraire les images de la vidéo source.

Extraction des images de la vidéo

import cv2
import os

cap=cv2.VideoCapture('test.avi')
path_img='images/'
os.mkdir(path_img)

nb_frames=cap.get(cv2.CAP_PROP_FRAME_COUNT)
longueur=len(str(int(nb_frames)))

fps=cap.get(cv2.CAP_PROP_FPS)

print('Extraction des images')
while (cap.get(cv2.CAP_PROP_POS_FRAMES)!=nb_frames):
	ret,frame=cap.read()
	nom=path_img+'images_'+ str(int(cap.get(cv2.CAP_PROP_POS_FRAMES))).zfill(longueur)+'.jpg'
	cv2.imwrite(nom,frame)
cap.release()
print('Extraction des images terminée')

Nous importons donc les librairies cv2 et os aux lignes 1 et 2 et nous ouvrons la vidéo source à la ligne 4. Nous définissons ensuite le chemin pour sauvegarder les images extraites et nous le créons grâce à la fonction os.mkdir() ligne 6.

Nous récupérons ensuite le nombre de trames de la vidéo. Pourquoi faisons-nous ça ? Afin de mettre en forme le nom de nos images. Je m’explique : si nous utilisons uniquement le numéro de la trame que l’on extrait, nous obtiendrons ceci :

Générer une vidéo à partir d'image, choix du nom des images

Le problème interviendra lorsque nous voudrons recréer la vidéo, la liste des fichiers que nous récupérerons sera de la forme:

['images_1.jpg', 'images_10.jpg', 'images_100.jpg', 'images_1000.jpg', 'images_1001.jpg', 'images_1002.jpg' ...

De ce fait, la vidéo que nous retrouverons sera un peu décousue.

Pour résoudre ce problème, nous allons insérer des 0 devant le numéro des trames. Combien de chiffre devra comprendre l’identifiant de l’image, nous le choisissons en fonction de la longueur du nombre de trames de la vidéo source (l. 9).

Nous récupérons enfin le fps de la vidéo que nous utiliserons lors de la reconstruction de la vidéo et nous pouvons passer à la lecture de la vidéo.

À chaque nouvelle trame lue de la vidéo, nous enregistrons l’image dans le dossier images que nous avons créé. Le nom de chaque image est composé de ‘images_’, le numéro de la trame et l’extension ‘.jpg’. Pour le numéro de trame, nous utilisons la fonction zfill(longueur), où longueur est le nombre de chiffres voulu. Par exemple, la trame numéro 25 avec une longueur de 4 sera de la forme ‘0025’.

Et voilà, en lançant cette partie de programme, nous pouvons extraire chaque image de notre vidéo et les stocker, avec le nom adéquat, dans le dossier images.

Génération de la vidéo

print('Création de la vidéo')
liste=sorted(os.listdir(path_img))
frame=cv2.imread(path_img+liste[0])
h,l,c=frame.shape
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, fps, (l,h))
for i in range(len(liste)):
	frame=cv2.imread(path_img+liste[i])
	out.write(frame)
print('vidéo créée')
out.release()

Nous commençons par récupérer la liste des fichiers compris dans le dossier images que nous stockons dans la variable liste. Le problème est que la fonction os.listdir() renvoie les noms des fichiers dans un ordre arbitraire. Pour résoudre ce problème, nous utilisons la fonction sorted() permettant d’organiser les fichiers dans l’ordre croissant.

Nous lisons la première image de la liste afin de récupérer la taille en hauteur et largeur des images (l. 24), nécessaire à la fonction VideoWriter (l. 26). Pour plus d’informations sur cette fonction, je vous invite à consulter cet article.

Pour générer la nouvelle vidéo, il nous suffit de lire chaque image (ligne 27-28) et utiliser la fonction write afin de stocker l’image dans la vidéo.

Conclusion

Nous avons utilisé les fonctions du module os afin de créer un dossier et récupérer la liste des fichiers contenus dans ce dossier. Nous avons stocké, avec le nom adéquat, les images extraites d’une vidéo. Ces images ont été réunies au sein d’une vidéo, grâce à la liste des fichiers contenu dans le dossier.

Catégories : MemoOpenCV basique

0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.