как справиться с OverflowError: невозможно преобразовать бесконечность с плавающей точкой в ​​целое число - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь прочитать кадры с помощью 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:

 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 было значением с плавающей запятой, затем я попытался преобразоватьэто в целое число, но затем я получаю OverflowError. Я буду признателен за ваш совет по этому вопросу.Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

В соответствии с новой версией обновления 201.0 2.5.0 от imageio: «Считыватель плагина ffmpeg теперь всегда сообщает inf как количество кадров. Используйте reader.count_frames(), чтобы получить фактическое число, илиоцените его по fps и продолжительности в метаданных. " imageio update

0 голосов
/ 20 февраля 2019

В Python тип float может быть infinity .Чтобы исправить вашу ошибку, вы проверяете, является ли значение inf ou -inf, прежде чем конвертировать в int:

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, чтобы решить проблему бесконечного плавания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...