wake-up-neo.com

Wie man die Gesamtzahl der Frames in einer Datei mit cv2 in python

Wie man die Gesamtzahl der Frames in einer Datei (.avi) durch Python mit open cv module erkennt.

Wenn möglich, welche Informationen (Auflösung, fps, Dauer, etc.) wir von einer Videodatei dadurch bekommen können.

46
Niraj

Mit einer neueren OpenCV-Version (ich benutze 3.1.0) funktioniert es so:

import cv2

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

Und ähnlich für andere Videoeigenschaften 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)

siehe hier für weitere Informationen.

außerdem sind nicht alle Requisiten obligatorisch. Einige sind möglicherweise nicht mit Ihrem Capture-/Video-Codec verfügbar

31
berak

So funktioniert es mit Python 3.6.5 (auf Anaconda) und OpenCV 3.4.2. [Anmerkung]: Sie müssen "CV_" aus "CV_CAP_PROP_xx" für jede Eigenschaft als löschen auf der offiziellen OpenCV angegeben Website .

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

Eine andere Lösung, die nicht von den manchmal fehlerhaften CV_CAP_PROP Gettern abhängt, besteht darin, Ihre gesamte Videodatei in einer Schleife zu durchlaufen

  • Erhöhen Sie die Variable Bildzähler jedes Mal, wenn ein gültiges Bild gefunden wird, und halten Sie an, wenn ein ungültiges kommt (Ende der Videodatei).
  • Das Sammeln von Informationen über Auflösung ist schwieriger, da einige Codecs eine variable Auflösung unterstützen (ähnlich wie bei VBR in Audiodateien, bei denen die Bitrate keine Konstante ist, sondern einen vordefinierten Bereich abdeckt).

    • konstante Auflösung - In diesem Fall benötigen Sie nur das erste Bild, um die Auflösung der gesamten Videodatei zu bestimmen, sodass das Durchlaufen des gesamten Videos nicht erforderlich ist
    • variable Auflösung - Sie müssen die Auflösung jedes einzelnen Frames (Breite und Höhe) ermitteln und einen Durchschnitt berechnen, um die durchschnittliche Auflösung des Videos zu ermitteln
  • FPS kann berechnet werden, hier haben Sie jedoch das gleiche Problem wie bei der Auflösungskonstante (CFR) vs. Variable (VFR). Dies ist eher ein Multithreading-Problem, oho. Persönlich würde ich einen Frame-Zähler verwenden, der sich nach jedem gültigen Frame erhöht, während in einem Intervall von 1 Sekunde ein Timer (der in einem Hintergrund-Thread ausgeführt wird) das Speichern des aktuellen Counter-Werts auslöst und ihn dann zurücksetzt. Sie können die Werte in einer Liste speichern, um die durchschnittliche/konstante Bildrate am Ende zu berechnen, wenn Sie auch die Gesamtzahl der Bilder im Video kennen.

Der Nachteil dieser eher simplen Vorgehensweise ist, dass Sie die gesamte Datei durchlaufen müssen, was für den Benutzer - falls diese mehrere Stunden dauert - auf jeden Fall spürbar ist. In diesem Fall können Sie es genau wissen und dies im Hintergrund tun, während der Benutzer etwas anderes tun kann, während Ihre Anwendung diese Informationen über die geladene Videodatei sammelt.

Der Vorteil ist, dass unabhängig davon, welche Videodatei Sie haben, solange OpenCV davon lesen kann, Sie im Gegensatz zu CV_CAP_PROP Ziemlich genaue Ergebnisse erhalten, die möglicherweise so funktionieren oder auch nicht, wie Sie es erwarten.

4
rbaleksandar