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.
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_*
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.
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 )
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
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).
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.