Чтение видеокадров cv2 приводит к тому, что генератор python задерживает вывод до конца - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть генератор python, который выводит изображения (кадры) cv2 из видео и обрабатываю его, используя concurrent.futures.ThreadPoolExecutor. Я вижу, что tqdm зависает, пока генератор не исчерпан. Тем не менее, если я получаю от исполнителя gen_frames_dummy, tqdm обновляется при каждом завершении задачи.

Любая помощь будет принята с благодарностью.

def gen_frames(s):
    for frame_num in frames_2_get:
        # skip to frame in video
        s.set(cv2.CAP_PROP_POS_FRAMES, frame_num-1)
        res, frame = s.read()
        if res:
            yield frame
def gen_frames_dummy(s):
    for frame_num in frames_2_get:
        yield np.zeros((16,16,3))
def frame_op(f):
    # process the frame
    pass
with ThreadPoolExecutor() as executor:
    frames_g = gen_frames(vid_capture)
    list(tqdm(executor.map(frame_op, frames_g), total=len(frames2get))

1 Ответ

0 голосов
/ 10 апреля 2020

map ждет, пока все рабочие не будут завершены, а затем результаты передаются в tqdm в вашем коде.

Полагаю, вы можете переписать это так, чтобы tqdm заработал как задумано.

    for args in tqdm(frames_g, total=len(frames_2_get)):
        executor.submit(frame_op, args)
...