Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Python の OpenCV による画像認識で cv::CascadeClassifier::detectMultiScale のエラーに悩まされた話

More than 1 year has passed since last update.

概要

Python で OpenCV を用いた画像認識を行う際,分類器のパスを正しく指定しているにもかかわらず cv::CascadeClassifier::detectMultiScale に関するエラーが出る場合は,分類器のパスに全角文字が含まれていないかを確認する.

詳細

こちらの記事を参考に,facerecognition.py を次の通り作成した.

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 で指定しているパスを直したら,エラーは解消された.

facerecognition.pyの10行目
cascade = cv2.CascadeClassifier('data/haarcascade_frontalface_default.xml')

原因は何か?

最初に指定したフルパスの中には全角文字(筆者の場合「ユーザー名」がそうだった)が含まれていた.それが原因かどうかを調べるため,分類器を配置したフォルダ名を全角文字を含むもの あいうえお に変更して再度試してみる.

facerecognition.pyの10行目
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'

エラーの原因は分類器のパスに全角文字が含まれていたことで間違いなさそうだ.

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away