さて、前回はWindows上にPythonとOpenCVの環境を作り、カメラを表示するところまでやってみましたが、今回は顔の認識をしてみたいと思います。やってみると分かるのですが、非常に簡単に実現できます。
##顔分類器の用意
OpenCVにはあらかじめトレーニング済みの分類器がサンプルとして付属しますので今回はこれを利用してみたいと思います。WinPythonにライブラリを追加する方法ですとサンプルが付属しませんのでこちらから環境にあったものをダウンロードしてください。
##顔分類器の利用
サンプルとしては正面の顔を認識するものや、猫の顔を認識するものなどいくつか含まれますが、今回はこちらを利用することにします。
\data\haarcascades\haarcascade_frontalface_default.xml
使い方は非常に簡単で、以下の2行です。
cascade = cv2.CascadeClassifier(cascade_path)
facerect = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))
まず、cv2.CascadeClassifier(分類器のパス)分類器を用意します。
そして、detectMultiScaleを呼び出します。imgは対象のイメージです。それ以外の引数はこちらを参照していろいろ試してみてください。
たったこれだけです。
これだけで、認識した顔の位置を含む配列が返されます。
##動画中の顔の認識
では、カメラからの画像を表示する前回のコードにこの顔認識のコードを埋め込んで見ましょう。
# -*- coding: utf-8 -*-
import cv2
import time
cascade_path="C:\Python\opencv-master\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml"
window = "Push ESC key to stop this program"
if(__name__ == '__main__'):
# デフォルトカメラ
capture = cv2.VideoCapture(0)
# キャプチャ処理
while(True):
key = cv2.waitKey(1)
if(key == 27):
print("exit.")
break
# 画像キャプチャ
ret, img = capture.read()
# 取り込み開始になっていなかったら上の処理に戻る
if(ret == False):
print("Capture Failed. ")
break
#顔検出
cascade = cv2.CascadeClassifier(cascade_path)
facerect = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))
print(facerect)
cv2.imshow(window, img)
time.sleep(0.050)
# ループ
capture.release()
cv2.destroyAllWindows()
実行して以下のように顔を認識した場合に座標が表示されれば成功です。
[[258 224 217 217]]
[[256 223 219 219]]
[[254 224 217 217]]
[[255 221 221 221]]
##まとめ
今回は、あらかじめ用意された分類器を使用して顔の検出をしてみました。
簡単に顔を認識できることが分かりましたが、やはり、配列を見ているだけでは楽しくなく、認識した顔に四角を表示したくなります。というわけで、次回は、認識した顔を四角で囲んでみたいと思います。