この記事では、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 件のコメント:
コメントを投稿