Comment savoir le nombre total d'images dans un fichier avec cv2 en python

Comment savoir le nombre total de Frame dans un fichier ( .avi) via Python en utilisant le module cv ouvert.

si possible toutes les informations (résolution, fps,durée,etc) que nous pouvons obtenir d'un fichier vidéo à travers ceci.

32
demandé sur Niraj 2014-08-18 12:41:13

4 réponses

avec une version OpenCV plus récente (j'utilise 3.1.0) cela fonctionne comme ceci:

import cv2

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

et similaire pour les autres propriétés vidéo cv2.CAP_PROP_*

48
répondu phev8 2016-05-24 14:33:09
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 en savoir plus.

aussi, le tout avec un grain de sel, pas tous ces accessoires sont obligatoires, certains peuvent ne pas être disponibles avec votre capture / vidéo codec

29
répondu berak 2015-05-15 23:13:08

une autre solution qui ne dépend pas du buggy parfois CV_CAP_PROP accesseurs est de traverser l'intégralité de votre fichier vidéo dans une boucle

  • Augmenter un compteur variable chaque fois qu'une image valide est rencontrée et s'arrête lorsqu'une image invalide arrive (fin du fichier vidéo).
  • rassembler des informations sur le résolution est plus compliqué parce que certains codecs prennent en charge la résolution variable (similaire à VBR dans les fichiers audio où le bitrate n'est pas une constante mais couvre une plage prédéfinie).

    • constante résolution - vous n'avez besoin que de la première image pour déterminer la résolution de l'ensemble du fichier vidéo dans ce cas, donc traverser toute la vidéo n'est pas nécessaire
    • résolution variable
  • FPS peut être calculé mais ici vous avez le même problème qu'avec la constante de résolution (CFR) vs variable (VFR). C'est plus un problème de multi-threading omho. Personnellement, j'utiliserais un compteur frame, qui augmenterait après chaque frame valide alors qu'à un intervalle de 1 seconde une minuterie (tournant dans un thread d'arrière-plan) déclencherait l'enregistrement de la valeur du compteur courant et ensuite la Réinitialiser. Vous pouvez stocker les valeurs dans une liste ordre pour calculer le taux de trame moyen/constant à la fin quand vous connaîtrez aussi le nombre total de trames de la vidéo.

L'inconvénient de cette simplistes façon de faire les choses que vous avez à parcourir l'ensemble du fichier, ce qui - dans le cas où il est de plusieurs heures - sera certainement perceptible par l'utilisateur. Dans ce cas, vous pouvez être intelligent à ce sujet et le faire dans un processus de fond tout en laissant l'Utilisateur faire quelque chose d'autre alors que votre application est rassembler cette information sur le fichier vidéo chargé.

l'avantage est que peu importe quel fichier vidéo Vous avez aussi longtemps Qu'OpenCV peut lire à partir de celui-ci, vous obtiendrez des résultats tout à fait précis contrairement à la CV_CAP_PROP ce qui peut ou peut ne pas fonctionner comme vous l'attendez.

1
répondu rbaleksandar 2016-02-12 21:27:38

Voici comment cela fonctionne avec Python 3.6.5 (sur Anaconda) et OpenCV 3.4.2. [Note]: vous devez supprimer le " CV_ " du "CV_CAP_PROP_xx" pour toute propriété indiquée sur L'option officielle 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 )
1
répondu MGLondon 2018-08-21 16:06:20