OpenCVの顔検出と目検出をPythonでの実装はと短いコードで実現します。
難しいことはOpenCVがやってくれるので結果をどのように応用するかに専念することができます。
顔の検出などは分類器がやってくれます。いろいろな分類器をダウンロードして使うことができます。
分類器を自分で作ると正解のデータ7000枚、間違いのデータ3000枚を用意して作成するので気個人では不可能です。
このような膨大なデータを容易しなくても済む方法があるようですが、それでも大変です。
分類器のダウンロード
mkdir classifier
cd classifier
wget https://github.com/opencv/opencv/archive/master.zip
unzip master.zip
分類器が格納されているフォルダー
~/classifier/opencv-master/data/haarcascades
以下のソースファイルと分類器
haarcascade_frontalface_default.xml
haarcascade_eye.xml
を同じフォルダーに格納してください。
ラズベリーパイ用のカメラを使う人はカメラの設定を有効にしてください。
ソースコード
# -*- coding: utf-8 -*-
import cv2
# 顔検出用の分類器を読み込む
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 目検出用の分類器を読み込む
eyeCascade = cv2.CascadeClassifier('haarcascade_eye.xml')
# カメラで動画を撮影する カメラ1台の場合は引数に0 or -1を設定する
cap = cv2.VideoCapture(0)
cap.set(3,640) # 横幅を設定
cap.set(4,480) # 縦幅を設定
while True:
# フレーム毎にキャプチャする
ret, img = cap.read()
# 顔検出の負荷軽減のために、キャプチャした画像をモノクロにする
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 顔検出のパラメータの設定
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=5,
minSize=(20, 20)
)
#目検出のパラメータの設定
eyes = eyeCascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=5,
minSize=(20, 20)
)
# 顔検出時に四角い枠を表示
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 目検出時に四角い枠を表示
for (x,y,w,h) in eyes:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
# imshow関数で結果を表示する
cv2.imshow('顔と目の検出中',img)
# ESCキーが押されたら終了
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
顔か検出されると青い四角で表示されます。また、目が検出されると赤い四角で表示されます。
眼の誤検出が多いように感じました。
ラズベリーパイなので顔が検出されたら電気錠をあけるなどいろいろ応用が期待されます。
|