【Python版OpenCV】Haar Cascadeで顔検出

Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔を検出する方法をソースコード付きで解説します。

【はじめに】Haar Cascadeとは

Haar Cascadeは、Haar-like特徴から作成した複数の強識別器を連結したものです。
Haar Cascadeの詳細は下記事で解説しています。

参考記事
原理はこちら Haar Cascadeによる顔検出の原理

このアルゴリズムは、OpenCVを使うと簡単に実装できます。
今回はOpenCVの「cv2.CascadeClassifier」「cascade.detectMultiScale」を使って入力画像から顔を検出してみました。

実行例

書式

cascade = cv2.CascadeClassifier(path)
face = cascade.detectMultiScale(src, scaleFactor, minNeighbors, minSize)
パラメータ名 説明
path 使用するカスケード識別器のファイルパス
src 入力画像
scaleFactor 画像スケールにおける縮小量
minNeighbors 矩形を要素とするベクトル
minSize 探索窓の最小サイズ(これより小さい対象は無視)
face 探索結果(見つかった場所の左上座標・幅・高さを格納したリスト)
カスケード型識別器のファイル
説明 OpenCVでは、顔・目などを検出できるカスケード識別器の学習済みファイルを事前に用意されています。学習済みファイルは下記リンク先からダウンロードできます。今回は顔検出のために「haarcascade_frontalface_default.xml」を使います。
URL https://github.com/opencv/opencv/tree/master/data/haarcascades
ファイル名 検出対象
haarcascade_eye.xml
haarcascade_eye_tree_eyeglasses.xml 眼鏡
haarcascade_frontalcatface.xml 猫の顔(正面)
haarcascade_frontalcatface_extended.xml 猫の顔(正面)
haarcascade_frontalface_alt.xml 顔(正面)
haarcascade_frontalface_alt2.xml 顔(正面)
haarcascade_frontalface_alt_tree.xml 顔(正面)
haarcascade_frontalface_default.xml 顔(正面)
haarcascade_fullbody.xml 全身
haarcascade_lefteye_2splits.xml 左目
haarcascade_licence_plate_rus_16stages.xml ロシアのナンバープレート(全体)
haarcascade_lowerbody.xml 下半身
haarcascade_profileface.xml 顔(証明写真)
haarcascade_righteye_2splits.xml 右目
haarcascade_russian_plate_number.xml ロシアのナンバープレート(数字)
haarcascade_smile.xml 笑顔
haarcascade_upperbody.xml 上半身

【サンプルコード】Python3 + OpenCV

サンプルプログラムのソースコードです。

実行結果

サンプルプログラムの実行結果です。

関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング
Python 画像処理
技術雑記

コメント

  1. TTT より:

    Haar Cascadeを使って上と同じような顔認識プログラムを組んだところ、以下のようなエラーが出てしまいます。

    error: OpenCV(3.4.1) D:\Build\OpenCV\opencv-3.4.1\modules\objdetect\src\cascadedetect.cpp:1698: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

    このエラーの原因は何なのでしょうか?教えていただきたいです。

    • 管理人 より:

      ※TTT様
      コメントありがとうございます。
      ファイルパスが間違っていてファイルを読み込めないときのエラーですね。
      この記事のソースコードをお使いの場合、「Pythonファイル」「画像ファイル」「XMLファイル(分類器)」が
      同じフォルダにある必要がございますのでご確認ください。

      • TTT より:

        cascadeがあるフォルダをWinPythonのフォルダの中に移して実行したところ、上記のエラーは出なくなりました。
        しかし、実行後タスクバーに出てきた画像をクリックするとresult.jpg(応答なし)という名前の全面灰色の画像がずっと読み込み中のまま表示されているだけでした。
        画像を閉じようとすると、「Pythonは応答していません 」というメッセージが表示されてしまい、仕方なくプログラムを終了するしかありません。
        コードはほぼ記載されている通りのまま実行しているのですが、何か他に要因があるのでしょうか?

        • 管理人 より:

          ※TTT様
          コメントありがとうございます。
          掲載中のソースコードを一部修正しました。
          そちらでどうでしょうか。

タイトルとURLをコピーしました