はじめに
今回はPythonでPCのカメラからリアルタイムで人の顔を認識して顔認識していないとカメラのシャッターを切れないようなプログラムを作成しました。
全体のプログラム
import cv2 as cv
from datetime import datetime
HAAR_FILE = "haarcascade_frontalface_default.xml"
cascade = cv.CascadeClassifier(HAAR_FILE)
cap = cv.VideoCapture(0)
while(True):
ret, frame = cap.read()
face = cascade.detectMultiScale(frame)
k = cv.waitKey(1)&0xff # キー入力を待つ
for x, y, w, h in face:
cv.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),1) #顔を認識したら長方形を描画
#顔認識している間のみ写真を撮影可能
if k == ord('p'):
# 「p」キーで画像を保存
date = datetime.now().strftime("%Y%m%d_%H%M%S")
path = "./img/" + date + ".png"
cv.imwrite(path, frame) # ファイル保存
cv.imshow(path, frame) # キャプチャした画像を表示
cv.imshow('frame',frame)
if k == ord('q'):
# 「q」キーが押されたら終了する
break
cap.release()
cv.destroyAllWindows()
上記のコードで顔認識を可能にしております。
プログラムの詳細
1.カスケード分類機の読み込み
import cv2 as cv
from datetime import datetime
HAAR_FILE = "haarcascade_frontalface_default.xml"
cascade = cv.CascadeClassifier(HAAR_FILE)
カスケード分類機とは・・・画像からある物体を検出するためには、大量の画像からある物体の特徴を学習し、この特徴をまとめたデータが必要となります。この特徴をまとめたデータのことを「カスケード分類器」と呼びます。
つまり、大量の画像の学習素材が必要になりますが今回使用しているOpenCVというライブラリはの顔を集めた大量画像から人の顔の特徴量をまとめたHaar-Cascadeが用意されています。
これはGithubからダウンロード可能ですので、pyファイルと同じディレクトリに保存してください。
2.映像の読み込みと顔認識
cap = cv.VideoCapture(0)
while(True):
ret, frame = cap.read()
face = cascade.detectMultiScale(frame)
VideoCaptureクラスを利用することでWebカメラの映像をよみこみ処理することができる。
また、detectMultiScaleメゾットで映像内の顔を検出。顔の位置のx座標、y座標、横幅、縦幅の四つの戻り値が渡されます。
3.顔部を枠線で囲む
for x, y, w, h in face:
cv.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),1)
前述したとおり、変数faceには4つの戻り値が格納されているため、ループでx,y,w,hに代入し、rectangle関数で枠線を描画する。
rectangle関数は第1引数は対象の画像(映像)データ、第2引数は矩形の左上頂点座標、第3引数は矩形の右下頂点座標、第4引数は描画する線の色である。
4.顔認識しているとき
if k == ord('p'):
# 「p」キーで画像を保存
date = datetime.now().strftime("%Y%m%d_%H%M%S")
path = "./img/" + date + ".png"
cv.imwrite(path, frame) # ファイル保存
cv.imshow(path, frame) # キャプチャした画像を表示
「p」のキーを押したら画像を保存し、ファイル名を指定してあります。また、imshowでキャプチャした画像を表示します。
このプラグラム部分を枠線描画のfor文の中に組み込むことによって、顔認識している間のみシャッターを切れるように制御しています。
5.顔認識していないとき
if k == ord('q'):
# 「q」キーが押されたら終了する
break
cap.release()
cv.destroyAllWindows()
「q」のキーが押されたらwhile分を抜けてプログラムを終了します。release()メソッドで読み込んでいる映像データやカメラデバイスを閉じる。
明示的にrelease()を実行しなくてもVideoCaptureオブジェクトのデストラクタが正常に実行されれば自動的にrelease()が実行される。
おわりに
今回は顔認識プログラムをPython + OpenCVを利用して作成しました。機械学習は全くの素人ですので様々なサイトを参考にして作成したので無駄な作業が含まれていたりしますが参考になれば幸いです。
今後は学習素材を複数与えて女性と男性の識別のプログラムを作成してみたいと思います。