У меня есть следующая часть кода. Я читаю кадры из папки со скоростью 5 кадров в секунду, в бесконечном цикле и всего у меня в папке 2552 кадра.
Мне нужно прекратить чтение кадров, когда все кадры считываются из папки, потому что проблема, с которой я сталкиваюсь, мой код работает в бесконечном цикле, и считывается больше кадров, чем в папке. Я не хочу переодеваться во время бега. Как бы я останавливался, когда все кадры прочитаны, жестко останавливаются или плавно останавливаются в бесконечном цикле после обработки списка имен файлов, один раз и только один раз.
filenames = [img for img in glob.glob("video-frames/*.jpg")]
fps = 5
interval = int(1 / fps)
while running: # INFINITE LOOP
filenames = sorted(filenames, key=os.path.getctime)
for img in filenames:
frame = cv2.imread(img)
frame_count += 1
time.sleep(interval)
send_frame(frame,frame_count) # REPEAT INFINITE LOOP
Ваш код не меняет значение running
. Зачем нужен цикл while, если есть цикл for?
1/5
дает 0.20
но int(1/5)
дает 0
- надо убрать int()
- можно использовать sleep(1/5)
для получения 5 кадров в секунду.
Ваш код выглядит надуманным и бессистемным. Я бы предложил немного разбить вашу проблему.
Во-первых, ваше понимание списка ничего не делает, кроме как тратит впустую циклы процессора. glob.glob уже возвращает список. так:
filenames = glob.glob("video-frames/*.jpg")
должно хватить.
Во-вторых, просто удалите свое заявление while true
.
filenames = sorted(filenames, key=os.path.getctime)
for img in filenames:
frame = cv2.imread(img)
frame_count += 1
time.sleep(interval)
send_frame(frame, frame_count) # no more infinite loop :)
Это остановится, как только все jpg из списка filenames
будут исчерпаны.
Если вы не знакомы со списками или итерациями, я бы посоветовал взглянуть на документ
break
из него? Установитьrunning
ложное значение? Есть много способов. Ваш код не является полным примером. Вы даже не показываете, что такоеrunning
...