【Python版OpenCV】Haar Cascadeで顔検出、アニメ顔検出、顔にモザイク処理

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

【はじめに】Haar Cascadeとは

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

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 上半身

【補足】
以下エラーが出る場合、公式ページ(https://opencv.org/releases/)から、自分が利用しているopencvバージョンに合わせてresourceファイルを入手することで解決できるようです。

systemError: returned a result with an error set

コメント欄でご指摘いただきました。ありがとうございました。

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

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


実行結果

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

【応用例】動画の顔に自動でモザイク処理

動画を読み込んで、顔部分に自動でモザイクをかけてみました。

【Python版OpenCV】動画の顔に自動でモザイク処理
Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔を検出する方法をソースコード付きで解説します。

ソースコード

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


実行結果

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

【Python版OpenCV】動画の顔に自動でモザイク処理
Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔を検出する方法をソースコード付きで解説します。

【参考例】アニメ顔の検出

アニメの顔を検出するために有志がGithubで公開してくださっている「lbpcascade_animeface.xml」を使います。
ただし、こちらは弱識別器にHaar-Like特徴ではなく、計算コストがより低いLBP特徴(Local Binary Patterns)が用いられています。
このカスケード型識別器は下記URL先から入手できます。
https://github.com/nagadomi/lbpcascade_animeface

ソースコード

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


実行結果

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

お借りした画像:プロ生ちゃん(暮井 慧)

【Python版OpenCV】アニメ顔を検出
Python+OpenCVでCascade識別器(分類器)を実装し、画像からアニメ顔を検出する方法をソースコード付きで解説します。
【Python/OpenCV】人の検出(HoG + SVM識別器)
この記事では、Python+OpenCVでHoG SVM識別器(分類器)を実装し、画像から人を検出する方法をソースコード付きで解説します。
【Python/OpenCV】HoG特徴+SVM識別器の学習/作成
Python版OpenCVでHoG特徴+SVM識別器(分類器・xmlファイル)を作成する方法をソースコード付きで解説します。
【Python版OpenCV入門】使い方とサンプル集
OpenCV(Intel Open Source Computer Vision Library)とは、インテル社で開発された画像処理・画像認識用のオープンソースライブラリです。Python/C++/Java/Android/Node.js...

コメント

  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様
          コメントありがとうございます。
          掲載中のソースコードを一部修正しました。
          そちらでどうでしょうか。

  2. aiuueo より:

    jupyter notebookで実行したところ以下のようなエラーが出ました。

    error: OpenCV(3.4.2) c:\miniconda3\conda-bld\opencv-suite_1534379934306\work\modules\imgproc\src\color.hpp:253: error: (-215:Assertion failed) VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) in function ‘cv::CvtHelper<struct cv::Set,struct cv::Set,struct cv::Set,2>::CvtHelper’

    この原因として考えられることは何かありますか?

    • 管理人 より:

      画像が正しく読み込まれてない可能性がありますので、画像のファイルパスが正しいか、画像データがロードされてるか確認されると良いと思います。

  3. たんたんたぬきのたぬき汁 より:

    急なコメント失礼いたします。
    このページ内に記載されているgithubからHaar Cascadeの各xmlファイルをダウンロードしてきて使用すると、以下エラーが出ます。
    systemError: returned a result with an error set

    調べてみたところ、どうやらgithub上の各xmlファイルはopencvのバージョンによって適宜選択する必要があるようです。

    以下から、自分の環境で使用しているopencvバージョンに合わせてresourceファイルを落としてくることで解決できるようです。
    https://opencv.org/releases/
    参考にお願いします。

    • 管理人 より:

      コメントありがとうございます。
      記事を書いたときからバージョンも大きく異なり、合わせる必要があるようですね。
      記事にも補足を追加しました。

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