Comment lire et enregistrer une vidéo avec OpenCV?

J’étais en train de sauvegarder une vidéo afin de pouvoir analyser les résultats obtenus par un algorithme quand tout à coup je me suis rendu compte que le fichier que j’étais en train d’enregistrer dépassait les 2 Go. Ce qui m’a semblé étrange vu que la vidéo d’origine d’une durée de 16 min 42 a une taille de 68 Mo et les transformations effectuées dessus n’ont pas lieu à augmenter significativement la taille.

Nous alons donc voir aujourd’hui comment lire et enregistrer une vidéo avec OpenCV, ainsi que mon retour sur des codecs utilisés.

Enregistrer une vidéo

Pour entrer en matière je vais vous proposer un exemple simple: on lit une vidéo, on change de repère colorimétrique et on enregistre la vidéo.

import cv2

cap=cv2.VideoCapture("vidéo.webm")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 25.0, (1280,720))

while(cap.get(cv2.CAP_PROP_POS_FRAMES) != cap.get(cv2.CAP_PROP_FRAME_COUNT)):
	print(cap.get(cv2.CAP_PROP_POS_FRAMES))
	_,frame=cap.read()
	frame_out=cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
	out.write(frame_out)

out.release()
cap.release()

Nous déclarons la classe videoCapture à la ligne 3. La fonction cv2.videoCapture prend en entrée un flux vidéo (fichier, caméra, flux rtsp, …) et renvoie une classe (cap dans notre cas).

Comme pour la lecture, nous déclarons notre enregistreur aux lignes 4-5. La ligne 4 permet de préciser quel codec vidéo nous allons utiliser pour enregistrer la vidéo. Pour ce faire, nous devons fournir à OpenCV l’identifiant du codec vidéo à travers un code fourcc (Four Charactere Code). La liste des codes est disponible sur le site fourcc.org. Il y ‘a deux façons de fournir le code: soit en séparant chaque lettre VideoWriter_fourcc(‘X’,’V’,’I’,’D’), soit sous la forme présentée dans l’exemple ci-dessus.

La ligne 5 permet de déclarer la classe VideoWriter, correspondant à notre enregistreur. La fonction cv2.VideoWriter prend en entrée le fichier de sortie, le code fourcc, le fps et la taille des images trames et enfin un booléen iscolor, qui définit si les trames sont en couleurs (True par défaut) ou en niveau de gris (iscolor=False).

La ligne 7 est une boucle permettant de lire la vidéo. A chaque trame nous regardons si la trame courante cap.get(cv2.CAP_PROP_POS_FRAMES) est différente de la dernière trame cap.get(cv2.CAP_PROP_FRAME_COUNT) .

Nous lisons l’image de la vidéo à la ligne 9. La méthode .read() permet de récupérer, décoder et de renvoyer la trame suivante de la vidéo.

Nous changeons de repère colorimétrique à la ligne 10.  Et nous sauvegardons la trame suivante de la vidéo ligne 11.

Une fois toutes les trames traitées, nous fermons nos fichiers vidéos lignes 13-14.

Quel codec vidéo utiliser ?

Je n’enregistre pas souvent de vidéo, c’est pourquoi je ne m’étais jamais posé la question. Cependant, voyant la taille grandissante de mon fichier de sortie, je me suis dit qu’il y avait sans doute un moyen de diminuer la bête sans pour autant diminuer la taille où le nombre des trames.

Je me suis alors intéressé aux codecs vidéos que l’on utilisait, en étudiant les temps de calcul et la taille de fichier obtenus par l’utilisation de 3 codecs connus : VP8, H.264 et Xvid

La vidéo d’origine est en .webm avec l’utilisation du codec de Google VP8 d’une taille d’environ 68 Mo

Lors de l’utilisation du codec VP8 (fourcc: VP8) la taille de la vidéo est de 66 Mo avec un temps de calcul d’environ  14 min.

Avec l’utilisation du codec H264 (fourcc: H264) la taille de la vidéo est de 88.9 Mo avec un temps de calcul d’environ  6 min 30 .

Enfin, l’utilisation du codec Xvid (fourcc: XVID) la taille de la vidéo est de 247 Mo avec un temps de calcul d’environ   4 min 12.

Tout ça pour dire que le choix du codec à utiliser, dépend de notre besoin.

Si l’on a besoin de notre vidéo rapidement et que l’on a un gros disque dur, alors le codec Xvid semble être le plus intéressant. A l’inverse si le temps n’est pas un problème contrairement au stockage, le VP8 est la solution.

1 réflexion sur “Comment lire et enregistrer une vidéo avec OpenCV?”

  1. Ping : Lire les informations de votre vidéo – Pymotion

Laisser un commentaire

Votre adresse e-mail 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.

Retour en haut