2
votes

Comment puis-je extraire des images d'une vidéo à un certain FPS?

Je suis capable d'extraire les cadres d'un certain fichier test.mp4 en utilisant le code suivant:

import cv2
def get_frames():
    cap = cv2.VideoCapture('test.mp4')
    i = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        cv2.imwrite('test_'+str(i)+'.jpg', frame)
        i += 1

    cap.release()
    cv2.destroyAllWindows()

Un grand nombre des cadres extraits sont inutiles (ils sont presque identiques). Je dois pouvoir définir une certaine vitesse à laquelle l'extraction de l'image peut être effectuée.


2 commentaires

Peut-être mettre un petit délai ( Sleep ) dans la boucle.


n'a pas marché. t.sleep (0.2) vient de le faire fonctionner un peu plus longtemps. Il a extrait le même nombre d'images


3 Réponses :


1
votes

Je pense que vous devez simplement ignorer les images en fonction d'un cycle fixe.

import cv2


def get_frames():
    cap = cv2.VideoCapture('test.mp4')
    i = 0
    # a variable to set how many frames you want to skip
    frame_skip = 10
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        if i > frame_skip - 1:
            cv2.imwrite('test_'+str(i)+'.jpg', frame)
            i = 0
            continue
        i += 1

    cap.release()
    cv2.destroyAllWindows()


0 commentaires

1
votes

Essayez la logique ci-dessous. Ici, nous attendons un certain temps (basé sur la fréquence d'images) et lisons la dernière image.

def get_frames():
    cap = cv2.VideoCapture('test.mp4')
    frame_rate = 10
    prev = 0
    i = 0
    while cap.isOpened():
        time_elapsed = time.time() - prev
        ret, frame = cap.read()
        if not ret:
            break

        if time_elapsed > 1./frame_rate:
            # print(time_elapsed)
            prev = time.time()
            cv2.imwrite('./data/sample1/test_'+str(i)+'.jpg', frame)
            i += 1

    cap.release()
    cv2.destroyAllWindows()


1 commentaires

Un problème est time.time () - prev est un runtime d'ordinateur et pas nécessairement égal au temps vidéo.



0
votes

Au lieu d'écrire votre propre code pour ce faire, avez-vous envisagé d'utiliser FFMPEG? FFMPEG a la capacité d'extraire toutes les images d'une vidéo et de les enregistrer sous forme d'images, il peut également extraire des images à une fréquence d'images inférieure à celle de la vidéo source.

Voir ici pour une démonstration de ce que je pense que vous essayez de faire, et les arguments à donner à ffmpeg pour le faire.


0 commentaires