web-dev-qa-db-fra.com

Comment connaître le nombre total de Frame dans un fichier avec cv2 dans python

Comment connaître le nombre total de Frame dans un fichier (.avi) à travers Python en utilisant le module cv ouvert.

Si possible, quelles informations (résolution, images par seconde, durée, etc.) nous pouvons obtenir d’un fichier vidéo grâce à cela.

46
Niraj

Avec une version plus récente d'OpenCV (j'utilise la version 3.1.0), cela fonctionne comme suit:

import cv2

cap = cv2.VideoCapture("video.mp4")
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print( length )

Et similaire pour d'autres propriétés vidéo cv2.CAP_PROP_*

74
phev8
import cv2

cap = cv2.VideoCapture(fn)

if not cap.isOpened(): 
    print "could not open :",fn
    return

length = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT))
width  = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))
fps    = cap.get(cv2.cv.CV_CAP_PROP_FPS)

voir ici pour plus d'informations.

de plus, tous ces éléments ne sont pas obligatoires, certains peuvent ne pas être disponibles avec votre codec de capture/vidéo.

31
berak

Voici comment cela fonctionne avec Python 3.6.5 (sur Anaconda) et OpenCV 3.4.2. [Remarque]: Vous devez supprimer le "CV_" de "CV_CAP_PROP_xx" pour toute propriété en tant que donné sur le OpenCV officiel site web .

import cv2
cap = cv2.VideoCapture("video.mp4")
property_id = int(cv2.CAP_PROP_FRAME_COUNT) 
length = int(cv2.VideoCapture.get(cap, property_id))
print( length )
9
MGLondon

Une autre solution qui ne dépend pas de la parfois buggy CV_CAP_PROP getters consiste à parcourir tout votre fichier vidéo en boucle

  • Augmentez une variable compteur d'images à chaque fois qu'une image valide est rencontrée et arrêtez-la lorsqu'une image invalide arrive (fin du fichier vidéo).
  • La collecte d'informations sur résolution est plus délicate car certains codecs prennent en charge une résolution variable (similaire au VBR dans les fichiers audio où le débit binaire n'est pas constant mais couvre une plage prédéfinie).

    • résolution constante - dans ce cas, vous n'avez besoin que de la première image pour déterminer la résolution de l'intégralité du fichier vidéo. Il n'est donc pas nécessaire de parcourir l'intégralité de la vidéo.
    • résolution variable - vous devez obtenir la résolution de chaque image (largeur et hauteur) et calculer une moyenne pour obtenir la résolution moyenne de la vidéo
  • FPS peut être calculé, mais vous rencontrez ici le même problème que pour la résolution - constante (CFR) vs variable (VFR). C’est plus un problème multi-threading. Personnellement, j'utiliserais un compteur de trames, qui augmentait après chaque trame valide alors qu'à intervalles de 1 seconde, une minuterie (s'exécutant dans un fil d'arrière-plan) déclencherait l'enregistrement de la valeur du compteur actuel, puis sa réinitialisation. Vous pouvez stocker les valeurs dans une liste afin de calculer le taux de trame moyen/constant à la fin, lorsque vous connaîtrez également le nombre total d'images de la vidéo.

L'inconvénient de cette façon de faire plutôt simpliste est qu'il faut parcourir l'ensemble du fichier, qui - au cas où il durerait plusieurs heures - sera certainement perceptible par l'utilisateur. Dans ce cas, vous pouvez être intelligent et le faire dans un processus en arrière-plan tout en laissant l'utilisateur faire autre chose pendant que votre application collecte ces informations sur le fichier vidéo chargé.

L'avantage est que peu importe le fichier vidéo que vous avez tant qu'OpenCV peut le lire, vous obtiendrez des résultats assez précis contrairement au CV_CAP_PROP qui peut ou peut ne pas fonctionner comme vous le souhaitez.

4
rbaleksandar