LoginSignup
132

More than 5 years have passed since last update.

OpenCVを使った顔認識(Haar-like特徴分類器)

Last updated at Posted at 2016-08-15

Haar-like特徴分類器

 「Haar-like特徴を用いたブースティングされた分類器のカスケード」とは、Haar-likeとよばれる明暗で構成される矩形のパターンを検出に使う手法です。Haar-like特徴と対象画像を重ね合わせ、パターンがあるかないかを判定します。
 haar.png

OpenCVには以下のHaar-like特徴分類器があらかじめ用意されています。
[OpenCV Install Dir]/Library/etc/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 上半身

今回は、OpenCVのHaar-like特徴分類器を使って、顔認識をしてみます。

OpenCV

OpenCV(Open Source Computer Vision Library)はBSDライセンスの映像/画像処理ライブラリ集です。画像のフィルタ処理、テンプレートマッチング、物体認識、映像解析、機械学習などのアルゴリズムが多数用意されています。

■ OpenCVを使った動体追跡の例 (OpenCV Google Summer of Code 2015)
https://www.youtube.com/watch?v=OUbUFn71S4s

■ インストールと簡単な使い方はこちら
OpenCV 3(core + contrib)をPython 3の環境にインストール&OpenCV 2とOpenCV 3の違い&簡単な動作チェック
  ★ モーションテンプレートを実行するために、core + opencv_contrib をインストールしてください。

■ 静止画像のフィルター処理についてはこちら
OpenCVでエッジ検出してみる
OpenCVで各種フィルター処理をする(グラディエント、ハイパス、ラプラシアン、ガウシアン)
OpenCVで特徴点を抽出する(AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob)

■ 動画ファイルの処理についてはこちら
OpenCVで動画をリアルタイムに変換してみる
OpenCVでWebカメラ/ビデオカメラの動画をリアルタイムに変換してみる
OpenCVでオプティカルフローをリアルタイムに描画する(Shi-Tomasi法、Lucas-Kanade法)
OpenCVを使った物体追跡(マウスで指定した特徴点をLucas-Kanade法で追跡する
OpenCVを使ったモーション テンプレート解析(リアルタイムに物体とその動く方向を認識する)

プログラム

流れは、下記のようになっています。
1. cv2.CascadeClassifier([Haar-like特徴ファイル.xml])でHaar-like特徴分類器を作成
2. Haar-like特徴分類器に対して画像を指定
3. 画像に対して検出した領域を矩形で囲む

face.py
import cv2

# Haar-like特徴分類器の読み込み
face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_eye.xml')

# イメージファイルの読み込み
img = cv2.imread('face.png')

# グレースケール変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 顔を検知
faces = face_cascade.detectMultiScale(gray)
for (x,y,w,h) in faces:
    # 検知した顔を矩形で囲む
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    # 顔画像(グレースケール)
    roi_gray = gray[y:y+h, x:x+w]
    # 顔g増(カラースケール)
    roi_color = img[y:y+h, x:x+w]
    # 顔の中から目を検知
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        # 検知した目を矩形で囲む
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

# 画像表示
cv2.imshow('img',img)

# 何かキーを押したら終了
cv2.waitKey(0)
cv2.destroyAllWindows()

実行結果

こんな画像だと、こんな感じで認識します。
顔は全て認識しているものの、目はぼんやりとした画像のためかあまり認識してくれていません。
result.png

こんな画像だと、こんな感じで認識します。
顔全体は、かなり認識してくれます。一方、目は視線が正面を向いていれば認識してくれています。
result12.png

目や横顔などの検出パターンをある程度把握していけば、目線や目線の先にある物を推測することもできそうです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
132