cv2 读取视频帧导致 python 生成器延迟输出直到结束
cv2 reading video frames causes python generator to delay output till the end
我有一个 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))
map
等待所有工作人员完成,然后将结果传递给代码中的 tqdm
。
我想你可以像这样重写以使 tqdm
按预期工作。
for args in tqdm(frames_g, total=len(frames_2_get)):
executor.submit(frame_op, args)
我有一个 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))
map
等待所有工作人员完成,然后将结果传递给代码中的 tqdm
。
我想你可以像这样重写以使 tqdm
按预期工作。
for args in tqdm(frames_g, total=len(frames_2_get)):
executor.submit(frame_op, args)