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.
3 Réponses :
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()
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()
Un problème est time.time () - prev est un runtime d'ordinateur et pas nécessairement égal au temps vidéo.
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.
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