PR
更新:2023/04/18

OpenCVエラー集(Python版)

この記事では、pythonのOpenCVにおける、エラーの対処方法について解説しています。

目次

1. モジュール名を間違える

opencvをimportするときに、

import opencv-python

としていると

Input In [1]
    import opencv-python
                 ^
SyntaxError: invalid syntax

以上のようになります。OpenCVのtips(python版)で述べているようにモジュール名とパッケージ名は違います。正しくは以下のように記述します。

import cv2

また、name ‘cv2’ is not definedとなったら、importし忘れているため、cv2をimportしてください。

2. 日本語のファイルのパス

日本語のファイルのパスを含む画像のファイルを読み込むと以下のようになります。

img=cv2.imread("画像/src.png",1)
cv2.namedWindow("src")
cv2.imshow("src",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:967: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

なにが起こっているのかというと、print(img)を行うとわかると思います。print(img)を行うとNoneが出力されます。つまり、画像を読み込めていません。

実は、OpenCVは日本語(全角)のパスを含む画像のファイルを読み込むことはできません。そのため、以下のような改善策が考えられます。

2.1. numpyを使って読み込む

numpyでバイナリ形式で画像ファイルを読み込んで、それをOpenCVで読み込むことで解決することができます。具体的には以下のようになります。

import cv2
import numpy as np
imgBi = np.fromfile("画像/src.png", np.uint8)
img = cv2.imdecode(imgBi, 1)
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

まず、NumPyのfromfile()関数を使って、ファイルをバイナリ形式で読み込んで、NumPyのnumpy.ndarrayの型でimgBiに保存します。次に、OpenCVのimdecode()関数を使って、Numpy配列のデータを画像として読み込みます。

2.2. shutilとosを使って一時的にファイルを移動

力技になりますが、ファイルを移動することでも解決することができます。

import shutil
import os
import cv2
#移動
path="画像/src.png"
dirName=os.path.dirname(path)
shutil.move(path,".")
#ここから、OpenCVの処理
name=os.path.basename(path)
img=cv2.imread(name,1)
cv2.namedWindow("src")
cv2.imshow("src",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#ここまで、OpenCVの処理
#ファイルを戻す
shutil.move(name,dirName)

pathの部分を読み込みたい画像に変更すると、ファイルを移動して、処理を実行することができます。

osの使い方はこちらで解説しています。

3. mergeできない

OpenCVでmergeしようとしたときに、IndexError: tuple index out of rangeとなることがあります。

img=cv2.imread(name,0)
img_rgb=cv2.split(img)
img_merge=cv2.merge((img_rgb[2],img_rgb[0],img_rgb[1]))

例えば、以上のように画像をRGBで分けたときに、読み込んだ画像がカラーではなく実はグレースケールだった時などにおきます。

グレースケールで保存

以下のように、画像をカラーで読み込めば、mergeすることができます。

img=cv2.imread(name,1)
img_rgb=cv2.split(img)
img_merge=cv2.merge((img_rgb[2],img_rgb[0],img_rgb[1]))

OpenCVの基本的な使い方についてはこちらで解説しています。

PR