概要
Python で OpenCV を用いた画像認識を行う際,分類器のパスを正しく指定しているにもかかわらず cv::CascadeClassifier::detectMultiScale
に関するエラーが出る場合は,分類器のパスに全角文字が含まれていないかを確認する.
詳細
こちらの記事を参考に,facerecognition.py
を次の通り作成した.
# ! Python 3.7
# OpenCVを用いた物体認識
imgPath = 'img.jpg' # 物体認識させる画像の相対パス
outputName = 'img_cascade.jpg' # 物体認識後の出力画像名
print('ただいま実行中です。ひと口チョコでも食べながらお待ちください。')
import cv2, os
cascade = cv2.CascadeClassifier('C:/Users/ユーザー名/AppData/Local/Programs/Python/Python37/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
img = cv2.imread(imgPath) # 処理する画像の指定
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 画像のグレースケール化
rects = cascade.detectMultiScale(gray, 1.1, 3, 0, (20,20)) # 物体認識
# 物体認識した部分を四角囲み
if len(rects) > 0:
for rect in rects:
cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0, 255), thickness=2)
else:
print("検出なし")
# 物体認識が済んだ画像の出力
cv2.imwrite(outputName, img)
print('実行が完了しました。結果を ' + outputName + ' に出力しました。')
しかし,これを実行すると次のようなエラーを吐いた.
Traceback (most recent call last):
File "facerecognition.py", line 13, in <module>
rects = cascade.detectMultiScale(gray, 1.1, 3, 0, (20,20)) # 物体認識
cv2.error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'
エラーメッセージで検索してみると,分類器の場所をフルパスで指定しなさいとか,そもそも分類器のパス指定が間違っているなどの原因が出てくるが,いずれにも該当せず困った.
最終的にこちらのブログ記事にたどり着き,facerecognition.py
と同じディレクトリに作成した data
フォルダに分類器を配置し,それにあわせて変数 cascade
で指定しているパスを直したら,エラーは解消された.
cascade = cv2.CascadeClassifier('data/haarcascade_frontalface_default.xml')
原因は何か?
最初に指定したフルパスの中には全角文字(筆者の場合「ユーザー名」がそうだった)が含まれていた.それが原因かどうかを調べるため,分類器を配置したフォルダ名を全角文字を含むもの あいうえお
に変更して再度試してみる.
cascade = cv2.CascadeClassifier('あいうえお/haarcascade_frontalface_default.xml')
すると,先ほどと全く同じエラーメッセージが出た.
Traceback (most recent call last):
File "facerecognition.py", line 13, in <module>
rects = cascade.detectMultiScale(gray, 1.1, 3, 0, (20,20)) # 物体認識
cv2.error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'
エラーの原因は分類器のパスに全角文字が含まれていたことで間違いなさそうだ.