opencv-pythonのimreadで画像を開き、以下のようなフィルタ処理を行うプログラムを実行すると、エラーが表示される場合があります。
import cv2
# OpenCVで画像ファイルを開く
img = cv2.imread("Mandrill.bmp", cv2.IMREAD_UNCHANGED)
# ガウシアンフィルタ
dst = cv2.GaussianBlur(img, (3, 3), 0)
cv2.imshow("Image", dst)
cv2.waitKey(0)
エラー内容
OpenCV(4.5.5) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\smooth.dispatch.cpp:617: error: (-215:Assertion failed) !_src.empty() in function ‘cv::GaussianBlur’ |
OpenCVの場合、エラー内容の最後の方を見ると、だいたいエラーの原因がわかる場合が多いのですが、今回のエラーの内容の場合
!_src.empty() in function ‘cv::GaussianBlur’
の部分が大事です。
直訳的に言うと、
’cv::GaussianBlur’関数の入力画像(src)は空(empty)ではいけません。
と言われています。
入力画像が空になる原因は imread()関数で画像ファイルが読み込めない場合がほとんどなのですが、読み込めない原因は、主に以下の2つです。
●画像ファイルがみつからない。(カレントディレクトリに画像ファイルが無い)
●ファイル名、ディレクトリ名に日本語が含まれている
画像ファイルがみつからない場合
imread()関数で、ファイル名の部分に相対パスでファイル名を指定すると、カレントディレクトリにあるファイルを探しに行くため、画像ファイルがカレントディレクトリに無いと、画像ファイルを開く事ができません。
【対策】
①ファイル名を相対パスではなく、絶対パス(フルパス)で指定する。
(例)
img = cv2.imread(r"C:\temp\Mandrill.bmp", cv2.IMREAD_UNCHANGED)
②カレントディレクトリを確認し、カレントディレクトリにファイルを置く。
カレントディレクトリは以下のようにすると、確認ができます。
import os
# カレントディレクトリの表示
print(os.getcwd())
ファイル名、ディレクトリ名に日本語が含まれている場合
OpenCVでは日本語を扱う事ができません。
そのため、画像ファイル名においても日本語が含まれるとimread関数で画像ファイルの読み込みに失敗します。
日本語ファイル名の画像を開くには、OpenCVではなく、PillowやNumPyを使って画像ファイルを開き、OpenCVの画像形式である ndarray へ変換する事ができます。
Pillowで画像ファイルを開いた方が、さまざまな画像ファイルフォーマットに対応しているので、汎用性が高いと思います。
(参考)