LoginSignup
160
166

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-03-21

「顔認識ってサクッとできないのー?」って聞かれたので試してみた。
細かいチューニングとかはできてない。

インストール

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

160
166
0

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
160
166