【OpenCV】cascade.detectMultiScale関数で顔認証
顔検出のアルゴリズムを使ったプログラムについて
OpenCVに含まれる物体・顔検出機能を使用すると、画像の中に含まれる特定の顔を検出することが可能になります。人間の顔検出を行うためにどんな特徴を持っているのか、人間の顔を含む学習用画像と含まない学習用画像を用意し、検出したい顔の特徴点を抽出します。これらの学習用画像のすべての特徴点をまとめたデータのことを「カスケード分類器」と呼びます。ここでは産業用カメラを使って、カスケード分類器を用いた顔認識の画像処理のプログラムについて解説します。
OpenCVのオープンソースのライブラリのみを用いたPythonのサンプルです。
検証のための準備
1.サンプルプログラムをダウンロード
モバイルサイトではご利用いただけません。
2.顔検出のためのカスケード型識別器ファイルをダウンロード
OpenCVでは、顔・目などを検出できるカスケード識別器の学習済みファイル(xmlファイル)を下記のGithub上に用意しています。
今回は顔検出のために「haarcascade_frontalface_default.xml」を使います。
1.と同じフォルダ内に「haarcascade_frontalface_default.xml」を投函してください。
https://github.com/opencv/opencv/tree/master/data/haarcascades
実行結果
※便宜上顔にはモザイク処理を行っております。
プログラム解説
OpenCVモジュールをインポートします。
import cv2
準備2.でダウンロードしたファイルの場所を指定し読み込みます。
# カスケード型識別器の読み込み
cascade_path="./haarcascade_frontalface_alt.xml"
#カスケード識別器のファイルパス
cascade=cv2.CascadeClassifier(cascade_path)
他にも以下のようなデータが存在します。
haarcascade_smile.xml | 笑顔検出 |
---|---|
haarcascade_eye.xml | 目検出 |
haarcascade_frontalface_default.xml | 顔検出 |
OpenCVライブラリを使ってVideoCaptureオブジェクトを取得します。
capture = cv2.VideoCapture(1)
下記のループにてOpenCVでカメラ映像を取得する手順は、リアルタイム静止画像の読み込みと表示をずっと繰り返すという処理の流れになります。
try:
while(True):
# フレームの読み取り
ret,frame=capture.read()
カラースケールのみでも十分顔検出が可能ですが、グレースケールを使用することで高速に顔検出できるのでグレー化します。
# グレースケール変換
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
読み込ませたxmlファイルにグレースケールのデータをセットし顔検出を行っています。検出に成功した場合は画像のサイズが出力されます。
# 顔の学習データ精査
front_face_list=cascade.detectMultiScale(gray,minSize=(50,50))
print(front_face_list)
顔認識しない場合は確認できるようにコマンドラインに"Failed"と出力します。
# 認識しない場合はコマンドラインに"Failed"と出力
if len(front_face_list) ==0:
print("Failed")
cv2.waitKey(100)
continue
検出した顔の座標で顔枠を白で囲っています。
#顔を四角で囲みWindowに表示する
for (x,y,w,h) in front_face_list:
cv2.rectangle(gray,(x,y),(x+w,y+h),(255,0,255),thickness=5)
cv2.imshow("frame_orig",gray)
cv2.waitKey(100)