2

我正在尝试使用 imageio API 读取帧。我有一个读者作为我收到的对象imageio.get_reader(video_path,"ffmpeg")

nframes =int(reader.get_length())     
for ii in range(nframes):
    while frame_q.qsize() > 500: # so that we dont use huge amounts of memory
        time.sleep(1)
    cur_img = reader.get_next_data()
    frame_q.put(cur_img)
    #shape = cur_img.shape
    #noisy_img = np.uint8(cur_img.astype(np.float) + np.random.randn(*shape) * 20)
    #frame_q.put(noisy_img)
    if ii % 100 == 0:
        print("%i / %i frames in queue" % (ii, nframes))
print("All %i frames in queue" % (nframes))

追溯:

 Traceback (most recent call last):
  File "/home/prashantb/anaconda3/envs/demo/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/home/prashantb/anaconda3/envs/demo/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "multiprocess_detect_actions.py", line 61, in read_frames
    nframes =int(reader.get_length())
OverflowError: cannot convert float infinity to integer

最初,它nframe是一个浮点值,然后我尝试将其转换为整数,但后来我得到了一个溢出错误。我将感谢您对此的建议。谢谢你。

4

2 回答 2

4

根据新的 2019 更新 2.5.0 版本来自imageio:“ffmpeg插件的阅读器现在总是报告inf为帧数。用于获取实际数量,或从元数据中 reader.count_frames()的和持续时间估计。” 图像更新fps

于 2019-02-22T06:11:01.833 回答
1

在 Python 中,浮点类型可以是无穷大。要修复您的错误,请在转换为 int 之前检查该值是否为infou :-inf

def float_to_int(x):
    if x == float('inf') or x == float('-inf'):
        return float('nan') # or a large value you choose
    return int(x)

正如@ShadowRanger 指出的那样,这个解决方案只是防止OverflowError错误。您应该研究reader解决无限浮动的问题。

于 2019-02-20T02:57:16.220 回答