Es gab eine Anfrage und ich beschloss, ungefähr 10 Stunden Spielvideos maschinell zu lernen. Ich habe ein Modul zum Lesen des Videos erstellt, während der Fortschrittsstatus an die Konsole ausgegeben wurde.
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 #Zeige den Fortschritt einmal alle 60 Frames
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:
#Was willst du tun
else:
break
video.release()
Progress rate: 0/2700
Progress rate: 60/2700
Progress rate: 120/2700
Progress rate: 180/2700
...
Ich habe den Zweck erreicht, aber andere Programme haben auch eine Videoladeverarbeitung, und ich möchte sie dort wiederverwenden. Deshalb habe ich beschlossen, sie zu einer Funktion zu machen, die von überall aufgerufen werden kann.
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 #Zeige den Fortschritt einmal alle 60 Frames
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:
#Was willst du tun
Der Anrufer war sehr erfrischend. Ich denke, dass der Video-Ladevorgang und der Hauptvorgang, den Sie ausführen möchten, getrennt und geklärt wurden. Ich habe das Gefühl, den Python-Generator gut genutzt zu haben. Es tut mir leid, dass mir dieser Artikel egal ist, Smasher ...