Comment savoir le nombre total d'images dans un fichier avec cv2 en python
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_*
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
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.
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 )