産業用UVCカメラのすすめ 産業用UVCカメラのすすめ

【OpenCV】cascade.detectMultiScale関数で顔認証

顔検出のアルゴリズムを使ったプログラムについて

OpenCVに含まれる物体・顔検出機能を使用すると、画像の中に含まれる特定の顔を検出することが可能になります。人間の顔検出を行うためにどんな特徴を持っているのか、人間の顔を含む学習用画像と含まない学習用画像を用意し、検出したい顔の特徴点を抽出します。これらの学習用画像のすべての特徴点をまとめたデータのことを「カスケード分類器」と呼びます。ここでは産業用カメラを使って、カスケード分類器を用いた顔認識の画像処理のプログラムについて解説します。
OpenCVのオープンソースのライブラリのみを用いたPythonのサンプルです。

検証のための準備

1.サンプルプログラムをダウンロード

サンプルデータはPCにてダウンロードをお願いいたします。
モバイルサイトではご利用いただけません。

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)