Проблема с вашим кодом в том, что строки, которые используют f
, vidcap
, et c. находятся за пределами l oop, поэтому не будут меняться каждый раз. Вам необходимо изменить структуру так, чтобы f
, sec
, count
и vidcap
менялись с каждой итерацией l oop. Вам также следует стараться избегать функций, слишком полагающихся на глобальные переменные, так как становится все труднее узнать, какими будут их значения во время выполнения функции - обычно вместо этого значения должны передаваться в функцию в качестве параметров. Вот несколько возможных способов реорганизации кода:
...
def do_stuff(path):
print(path)
vidcap = cv2.VideoCapture(path)
frameRate = 0.5
i = 0
while True:
success = printar(frameRate*i, vidcap, i+1)
if not success:
return # add a return value if needed
i += 1
def printar(sec, vidcap, count):
vidcap.set(cv2.CAP_PROP_POS_MSEC,sec*10000)
hasFrames,image = vidcap.read()
if hasFrames:
cv2.imwrite("image"+str(count)+".jpg", image)
return hasFrames
for f in files:
do_stuff(f)
Или, возможно, проще и лучше:
from itertools import count
...
def do_stuff(path):
vidcap = cv2.VideoCapture(path)
frameRate = 0.5
for i in count():
vidcap.set(cv2.CAP_PROP_POS_MSEC, i * frameRate * 10000)
has_frames, image = vidcap.read()
if has_frames:
cv2.imwrite("image{}.jpg".format(i+1), image)
else:
return
for f in files:
print(f)
do_stuff(f)