Python

OpenCVで画像ファイルを読み込み時にNonetypeが返ってくる原因と対処法

この記事は約3分で読めます。

 

OpenCVで画像ファイルを読み込むと画像ファイルの情報が読み込まれず、Nonetypeが返されるという現象に遭遇したので、原因とか解決法をメモっておきます。

 

OpenCVで画像が読み込まれない原因

 

openCVではcv2.imread()という関数で画像ファイルをバイナリデータを行列で読み込むことが可能なのですが、たまに「TypeError: object of type ‘NoneType’ has no ~」というエラーが起こります。

 

<コード例>

import cv2

#画像を読み込む
img = cv2.imread("ダウンロード.jpg")
cv2.imwrite("保存.jpg", img)  # エラー:!_img.empty() in function 'imwrit
len(img) # エラー:TypeError: object of type 'NoneType' has no len()

 

これの原因は主に2つあります。

 

まずそもそもの原因はcv2.imread()が画像データを読み込んだ際に、データが読み込めなくてもエラーを吐かずに戻り値でNoneを返すことにあり、変数imgにデータが格納されている前提で次の処理に移るためそこでエラーとなります。そして、Noneが返ってくる原因には以下が挙げられます。

 

  • 指定した画像のパスに日本語が含まれている
  • パスが存在しない

 

特に日本語が画像のパスに含まれている場合は、パスが正しくてもエラーになるので注意してください。

 

解決法

 

この場合の解決法は2つあります。

 

  • 日本語をパスから除去する
  • pillowで代用する

 

日本語のパスをどうしても使わないといけない場合はpillowを代用するしかないです。

 

<pillowのインストール>

$ pip install pillow

 

<pillowで代用する場合>

import numpy as np
from PIL import Image

img = Image.open('ダウンロード.jpg')
cvimage = np.asarray(img)

 

 

参照:http://solasyndrome.blog.fc2.com/blog-entry-16.html

 

 

コメント

タイトルとURLをコピーしました