Il y avait une demande, et j'ai décidé d'apprendre automatiquement environ 10 heures de vidéos de jeux. J'ai créé un module pour lire la vidéo tout en sortant l'état d'avancement sur la console.
import cv2
import sys
fpath = 'data/videos/sample_video.mp4'
video = cv2.VideoCapture(fpath)
can_read, first = video.read()
if not can_read:
sys.exit()
progress_step = 60 #Afficher la progression une fois toutes les 60 images
count = 0
max = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
while video.isOpened():
if(count % progress_step == 0):
print(f'Progress rate: {count}/{max}')
ok, frame = video.read()
if ok:
#Que veux-tu faire
else:
break
video.release()
Progress rate: 0/2700
Progress rate: 60/2700
Progress rate: 120/2700
Progress rate: 180/2700
...
J'ai atteint le but, mais d'autres programmes ont également un traitement de chargement vidéo, et je veux le réutiliser là-bas, alors j'ai décidé d'en faire une fonction qui peut être appelée de n'importe où.
reader.py
def video_read(input):
"""
Parameters
----------
input: str
Input video path
Returns
------
Iterator[np.ndarray]
Generator of video frame
"""
# video capture start
video = cv2.VideoCapture(input)
can_read, first = video.read()
if not can_read:
print('Cannot read video file')
return
max = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
yield first
progress_step = 60 #Afficher la progression une fois toutes les 60 images
count = 0
while video.isOpened():
if(count % progress_step == 0):
print(f'Progress rate: {count}/{max}')
ok, frame = video.read()
if ok:
count += 1
yield frame
else:
break
video.release()
import reader
it = reader.video_read('data/videos/sample_video.mp4')
try:
first = next(it)
except StopIteration:
sys.exit()
for image in it:
#Que veux-tu faire
L'appelant était très rafraîchissant. Je pense que le processus de chargement de la vidéo et le processus principal que vous souhaitez effectuer ont été séparés et clarifiés. J'ai l'impression d'avoir fait un bon usage du générateur Python. Je suis désolé, je m'en fiche de cet article, Smasher ...