OpenCV imread posting libpng error: IEND: ошибка CRC и не загружаются изображения - PullRequest
0 голосов
/ 08 января 2019

Следующий код выводит эту ошибку на терминал, но не останавливает выполнение: libpng error: IEND: CRC error

import numpy as np
import cv2
import os

# image is stored in the same location as the python file
dir_path = os.path.dirname(os.path.realpath(__file__))
path = dir_path+'/test.png'

# img always gets set as a NoneType
img = cv2.imread(path)

Вот тестовое изображение, о котором идет речь (да, оно пустое): enter image description here

Некоторые Google-Fu показали, что в пакете Anaconda libpng была ошибка, которая могла вызвать эту проблему, и было предложено обновить ее. Я сделал это безрезультатно, поэтому, для хорошей меры, я также вернулся и убедился, что на моих машинах установлена ​​самая последняя версия libpng. Опять без изменений.

Кроме того, я попробовал несколько различных вариантов и условий работы кода без изменений. Конкретно я пробовал:

  • изменив изображение на .jpg. Ошибка не появляется, очевидно, потому что она больше не использует libpng, но изображение все еще возвращается как NoneType.
  • передает дополнительные флаги, такие как cv2.IMREAD_GRAYSCALE
  • Установка opencv (обе версии 3.4.4.19 и 3.4.5.20) и numpy в virtualenv и запуск его.
  • Запуск его на моем ноутбуке с Windows (Anaconda 3.6.5) с использованием WSL и Raspberry Pi (3.5.3)

Кроме того, я использую OpenCV более двух лет без особых проблем, и мне больно, что я не могу заставить что-то настолько простое / глупо работать. Я собираюсь начать изучать документы libpng, но я был бы очень признателен за любые ваши комментарии или мысли.

1 Ответ

0 голосов
/ 08 января 2019

Если вы запустите pngcheck для образа, он сообщит вам, что контрольная сумма блока IEND неверна:

pngcheck -v blank.png 

выход

File: blank.png (79830 bytes)
  chunk IHDR at offset 0x0000c, length 13
    2560 x 1600 image, 32-bit RGB+alpha, non-interlaced
  chunk IDAT at offset 0x00025, length 8192
    zlib: deflated, 32K window, fast compression
  chunk IDAT at offset 0x02031, length 8192
  chunk IDAT at offset 0x0403d, length 8192
  chunk IDAT at offset 0x06049, length 8192
  chunk IDAT at offset 0x08055, length 8192
  chunk IDAT at offset 0x0a061, length 8192
  chunk IDAT at offset 0x0c06d, length 8192
  chunk IDAT at offset 0x0e079, length 8192
  chunk IDAT at offset 0x10085, length 8192
  chunk IDAT at offset 0x12091, length 5937
  chunk IEND at offset 0x137ce, length 0
  CRC error in chunk IEND (computed ae426082, expected ae426080)

Если вы выгружаете файл в шестнадцатеричном формате:

xxd image.png > hex

А затем отредактируйте последний байт в любом обычном редакторе, чтобы исправить его, вы можете перестроить файл с помощью:

xxd -r < hex > recovered.png
...