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では、顔・目などを検出できるカスケード識別器の学習済みファイルを事前に用意されています。
学習済みファイルは下記リンク先からダウンロードできます。

【URL】https://github.com/opencv/opencv/tree/master/data/haarcascades

今回は顔検出のために「haarcascade_frontalface_default.xml」を使います。

ファイル名 検出対象
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とNumPyライブラリが必要です。
■ライブラリの導入方法はこちら。
【Python3】OpenCV3をインストール(Windows編)
NumPyのインストール (Windows、Linux、Ubuntu)

■Python, NumPyの基本的な使い方についてはこちら。
Python入門 サンプル集
NumPy入門 サンプル集

実行結果

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

【おすすめ記事】
PythonでOpenCV入門 サンプル集
【Python】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!