以下のエラーが発生しました。
エラーが発生するコード
- 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')
素直にスラッシュで書くの良いですね。これで解決です。
分かり難いのは、imwriteした際に表題のワーニングを含めエラーが発生する点です。
- img = cv2.imread('imag/img.png')
本来、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