Edited at

python+OpenCVで顔認識をやってみる

More than 5 years have passed since last update.

「顔認識ってサクッとできないのー?」って聞かれたので試してみた。

細かいチューニングとかはできてない。


インストール

Macだと結構簡単。OpenCVをbrewを使ってインストールする。

pythonはbrewで入れたものを使ってる。

numpyも必要みたいだけど、インストール済みだったんで省略。

どうやら、OpenCVをインストールする時にPython用のパッケージcv2がsite-packageにコピーされるみたいなので、インストール順としてはPython→numpy→OpenCVがいいみたい。


bash

brew tap homebrew/science

brew install opencv


Pythonで動かす

とりあえず、先にコードを晒す。

試行錯誤に使った時のコメントも、汚いけど残しておくことにした。

パラメータチューニング用の説明まで残しているがwww


recognize.py

# -*- coding: utf-8 -*-


import cv2

#HAAR分類器の顔検出用の特徴量
#cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml"
cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"
#cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml"
#cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_alt_tree.xml"

image_path = "lena.jpg"

color = (255, 255, 255) #白
#color = (0, 0, 0) #黒

#ファイル読み込み
image = cv2.imread(image_path)
#グレースケール変換
image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)

#カスケード分類器の特徴量を取得する
cascade = cv2.CascadeClassifier(cascade_path)

#物体認識(顔認識)の実行
#image – CV_8U 型の行列.ここに格納されている画像中から物体が検出されます
#objects – 矩形を要素とするベクトル.それぞれの矩形は,検出した物体を含みます
#scaleFactor – 各画像スケールにおける縮小量を表します
#minNeighbors – 物体候補となる矩形は,最低でもこの数だけの近傍矩形を含む必要があります
#flags – このパラメータは,新しいカスケードでは利用されません.古いカスケードに対しては,cvHaarDetectObjects 関数の場合と同じ意味を持ちます
#minSize – 物体が取り得る最小サイズ.これよりも小さい物体は無視されます
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
#facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=3, minSize=(10, 10), flags = cv2.cv.CV_HAAR_SCALE_IMAGE)

print "face rectangle"
print facerect

if len(facerect) > 0:
#検出した顔を囲む矩形の作成
for rect in facerect:
cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)

#認識結果の保存
cv2.imwrite("detected.jpg", image)


今回は学習用の画像を用意していないので、OpenCVに一緒に付いているHAAR分類器の特徴量を利用している。HAAR分類器についてはこちらを参照(第10回CV勉強会 OpenCV祭り 物体検出徹底解説!)。

有名なレナさんの画像だとどの特徴量でも認識できたが、他の画像で試すとhaarcascade_frontalface_default.xmlはあんまり上手く認識できなかったので、色々試したほうが良さげ。

元の画像

lena.jpg

認識後の画像

detected.jpg