この記事では、Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔を検出する方法をソースコード付きで解説します。
Haar Cascade
Haar Cascadeは、Haar-like特徴から作成した複数の強識別器を連結したものです。
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)
サンプルプログラムのソースコードです。
# -*- coding: utf-8 -*- import cv2 def main(): # 入力画像の読み込み img = cv2.imread("test.png") # カスケード型識別器の読み込み cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") # グレースケール変換 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 顔領域の探索 face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30)) # 顔領域を赤色の矩形で囲む for (x, y, w, h) in face: cv2.rectangle(img, (x, y), (x + w, y+h), (0,0,200), 3) # 結果を出力 cv2.imshow("result.jpg",img) if __name__ == '__main__': main() 
0 件のコメント:
コメントを投稿