Adsenseリンクユニット

2019年9月1日日曜日

libpng warning: Image width is zero in IHDR

Pythonでcv2を使ってみたところ、
以下のエラーが発生しました。

エラーが発生するコード
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

0 件のコメント:

コメントを投稿

スポンサードリンク