以下のエラーが発生しました。
エラーが発生するコード
import cv2 import numpy as np im1 = cv2.imread('img/a1.png') im_v = cv2.vconcat([im1, im1]) cv2.imwrite('a1_a1.png', im_v)
libpng warning: Image width is zero in IHDR
libpng warning: Image height is zero in IHDR
libpng error: Invalid IHDR data
画像が正しく読み込みせているかassertを追加し確認したところ、
読み込めていないことが分かりました。
import cv2 img = cv2.imread('imag\img.png') assert img is not None
ではイメージが読み込めないのはなぜかですが、
指定したパスのフォルダとイメージファイル名のバックスラッシュ1つで記述していたためでした。
バックスラッシュで書く場合は、エスケープシーケンスであるため、2つ書く必要があります。
img = cv2.imread('imag\\img.png')
素直にスラッシュで書くの良いですね。これで解決です。
img = cv2.imread('imag/img.png')分かり難いのは、imwriteした際に表題のワーニングを含めエラーが発生する点です。
本来、imreadの呼び出しで読み込み失敗しているなら、その時点で例外発生してほしいところですが、noneを返却してくるため読み込みに失敗していることが分かりません。
そして、パスに日本語を使用している場合は、読み込みに失敗します。
アスキー文字にしか対応していないようです。
対応策はnp.fromfileとimdecodeに分解します。
import numpy as np import cv2 def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8): try: n = np.fromfile(filename, dtype) img = cv2.imdecode(n, flags) return img except Exception as e: print(e) return None