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
コメント