Python+OpenCVで顔認識してみた

プログラミング

こんにちは。最近、Webカメラやスマートフォンのカメラなどを取り上げているので、今回も似たようなことをしてみます。

顔認識するプログラム

早速ですが、プログラムです。いくつかのサイトに載っているプログラムを参考にして、不要な箇所を削除するなどにより短くしています。

このプログラムでは、顔を認識したら、顔の範囲に枠を付けてその範囲にモザイクをかける処理をしています。

import cv2

capture = cv2.VideoCapture( 0 )

INTERVAL= 33

cascade_file = "haarcascade_frontalface_default.xml"
cascade = cv2.CascadeClassifier(cascade_file)

ratio = 1/15

while True:

    ret, frame = capture.read()
    faces = cascade.detectMultiScale( frame, minSize=(100, 100) )

    for x, y, w, h in faces:
        face = frame[ y:y+h, x:x+w ]
        small = cv2.resize( face, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST )
        frame[ y:y+h, x:x+w ] = cv2.resize( small, (w,h), interpolation=cv2.INTER_NEAREST )
        color = ( 0, 0, 225 )
        pen_w = 3
        cv2.rectangle( frame, (x, y), (x+w, y+h), color, thickness=pen_w )

    cv2.imshow( 'frame', frame )

    key = cv2.waitKey( INTERVAL ) & 0xFF
    if key == ord('q'):
        break

cv2.destroyAllWindows()
cap.release()

Webカメラからキャプチャーする部分については、以前の記事を参考にしてください。

7・8行目でカスケードファイルを読み込み、15行目で顔認識しています。

カスケードファイルにより顔認識される仕組みは、次のリンク先にあります。

haarcascade-・・・というファイルがいろいろありますが、これらの違いについて書いてあるページは次のリンク先にあります。

17~23行目で、認識した顔を加工しています。 19行目では認識した顔を縮小し、20行目で元のサイズに戻すことでモザイクにしています。 21・22行目は枠の色と太さを決めて、23行目で枠を付けています。

カスケードファイルを読み込むところで、ハマったぞ・・・

ここまで、簡単に認識できそうに書いてきましたが、実はカスケードファイルを読み込むところでハマりました。

はじめはGitHubに上がっているカスケードファイルを使っていました。ところが、どうやらそれがよくなかったようです。

公式サイトからソースをダウンロード・解凍して、opencv-3.*.*/data/haarcascades フォルダ内にあるカスケードファイルをプログラムと同じフォルダにコピーしたら、あっさり動作しました。

それでは実行結果

実行結果は、次のようになりました。実はスクリーンショットはうまく顔を認識しているところで取っていますが、認識しなかったり違う部分が誤認識されてしまったりということはあります。

顔認識の結果

今回も短いですが、これでおしまいにします。それではまた。

Posted by 春日井 優