2 votes

Extraire des images chaque seconde de toutes les vidéos dans le dossier

Je suis en train d'essayer d'extraire une image par seconde d'une vidéo, tout en ayant plusieurs vidéos dans un dossier. J'ai réussi à le faire pour une vidéo comme ceci, mais je pense que je me suis trompé dans ma boucle pour toutes les vidéos. Ci-dessous se trouve le code pour une vidéo qui fonctionne.

import cv2
pathOut = r"C:/Users/Me/Out/"
vidcap = cv2.VideoCapture(r'C:\Me\Desktop\test.mp4');
count = 0
success = True
while success:
    success,image = vidcap.read()
    print('read a new frame:',success)
    if count%30 == 0 :
         cv2.imwrite(pathOut + 'frame%d.jpg'%count,image)
    count+=1

Avec la boucle pour toutes les vidéos que j'ai faite comme ceci.

import os
import cv2
pathOut = r"C:/Users/Me/Out/"
count = 0
success = True
counter = 1
listing = os.listdir(r'C:/Users/Me/videos/train')
for vid in listing:
    vid = r"C:/Users/Me/videos/train/"+vid
    cap = cv2.VideoCapture(vid)
    count = 0
    counter += 1
    while success:
        success,image = cap.read()
        print('read a new frame:',success)
        if count%30 == 0 :
             cv2.imwrite(pathOut + 'frame%d.jpg'%count,image)
        count+=1

Ma boucle de vidéo ne semble pas fonctionner car elle ne prend qu'une seule vidéo. Ensuite, elle affiche faux, probablement parce qu'il ne reste plus d'images, mais je ne sais pas comment passer à la vidéo suivante. Je pense que j'ai besoin de faire quelques ajustements mineurs, est-ce que quelqu'un a une idée de ce que c'est exactement ?

2voto

thogra Points 120

Il semble s'agir d'une petite erreur logique : une fois que le succès a été défini sur faux par la première vidéo, il ne sera jamais redéfini sur vrai et toutes les boucles while suivantes pour toutes les vidéos seront ignorées. Essayez de modifier votre programme comme suit :

import os
import cv2
pathOut = r"C:/Users/Me/Out/"
count = 0
counter = 1
listing = os.listdir(r'C:/Users/Me/videos/train')
for vid in listing:
    vid = r"C:/Users/Me/videos/train/"+vid
    cap = cv2.VideoCapture(vid)
    count = 0
    counter += 1
    success = True
    while success:
        success,image = cap.read()
        print('lecture d\'une nouvelle image :',success)
        if count%30 == 0 :
             cv2.imwrite(pathOut + 'frame%d.jpg'%count,image)
        count+=1

1voto

madmatrix Points 158

Tant qu'il n'y a que des fichiers de type vidéo et pas d'autres types dans le répertoire spécifié, cela devrait fonctionner (Remarque : il n'y a pas d'expression régulière pour sélectionner des fichiers avec une extension spécifique).

Note supplémentaire : Je n'ai pas assez de réputation pour ajouter un commentaire, donc je l'ajoute en réponse.

Quel est le besoin de vid = r"C:/Users/Me/videos/train/"+vid ? Vouliez-vous ajouter le nom du fichier et le nom du répertoire ? Si oui, essayez os.path.join

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X