OpenCV读发布libpng错误:IEND:CRC错误,未加载图像

时间:2019-01-08 16:36:50

标签: python opencv libpng

以下代码将该错误输出到终端,但不停止执行: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透露,libac的Anaconda软件包在不久前存在一个错误,可能会导致此问题,因此建议对其进行更新。我这样做没有任何效果,因此,在很大程度上,我还回过头来确保我的计算机上安装了最新版本的libpng。同样,没有变化。

最重要的是,我尝试了代码的许多不同变体和操作条件,但仍然没有更改。具体来说,我已经尝试过:

  • 将图像更改为.jpg。该错误不会弹出,显然是因为它不再使用libpng,但是图像仍然以NoneType的形式返回。
  • 传入额外的标志,例如cv2.IMREAD_GRAYSCALE
  • 在virtualenv中安装opencv(版本3.4.4.19和3.4.5.20)和numpy并运行它。
  • 使用WSL和Raspberry Pi(3.5.3)在Windows笔记本电脑(Anaconda 3.6.5)上运行它

顺便说一句,我已经使用OpenCV了两年多了,几乎没有遇到任何问题,而我无法获得如此简单/愚蠢的工作让我感到骄傲。我将开始研究libpng文档,但是,如果您有任何意见或想法,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果在图像上运行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