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 | 上半身 |
【サンプルコード】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...
コメント
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ファイル(分類器)」が
同じフォルダにある必要がございますのでご確認ください。
cascadeがあるフォルダをWinPythonのフォルダの中に移して実行したところ、上記のエラーは出なくなりました。
しかし、実行後タスクバーに出てきた画像をクリックするとresult.jpg(応答なし)という名前の全面灰色の画像がずっと読み込み中のまま表示されているだけでした。
画像を閉じようとすると、「Pythonは応答していません 」というメッセージが表示されてしまい、仕方なくプログラムを終了するしかありません。
コードはほぼ記載されている通りのまま実行しているのですが、何か他に要因があるのでしょうか?
※TTT様
コメントありがとうございます。
掲載中のソースコードを一部修正しました。
そちらでどうでしょうか。
正しく動作しました。ありがとうございます。