CV(2) Face Detection

Python, OpenCVで顔検出と瞳検出(顔認識、瞳認識)

Contents

静止画の特徴検出

静止画: 画像ファイルを読み込んで顔検出と瞳検出

Macにhomebrewでopencv3をインストールした場合、

/usr/local/opt/opencv/share/OpenCV/haarcascades/
に学習済のHaar-like特徴を用いた分類器のデータ(xmlファイル)がある。

以下のようにいくつかの種類のデータが用意されている。

  • 正面の顔検出用: haarcascade_frontalface_default.xml
  • 瞳検出用: haarcascade_eye.xml
  • 笑顔検出用: haarcascade_smile.xml

cv2.CascadeClassifier()でパスを指定してxmlファイルを読み込む。

サンプル画像の用意

上の写真をダウンロードして保存し、必要なフォルダを作成して、写真を移動してください。

$ mkdir data
$ mkdir data/src
$ mkdir data/dst
$ cp ~/Downloads/Lenna_test_image.png data/src/lena_square.png

検出領域の枠を描画

そしてViでサンプルコードを作成

$ vi test2.py 

サンプルコード(test2.py)

import cv2
  
face_cascade_path = '/usr/local/opt/opencv/share/'
                    'OpenCV/haarcascades/haarcascade_frontalface_default.xml'
eye_cascade_path = '/usr/local/opt/opencv/share/'
                   'OpenCV/haarcascades/haarcascade_eye.xml'

face_cascade = cv2.CascadeClassifier(face_cascade_path)
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

src = cv2.imread('data/src/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_gray[y: y + h, x: x + w]
    eyes = eye_cascade.detectMultiScale(face_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

cv2.imwrite('data/dst/opencv_face_detect_rectangle.jpg', src)

 

処理結果

$ python2 test2.py
[ INFO:0] Initialize OpenCL runtime…

$ ls -al data/dst/
total 256
drwxr-xr-x 3 chen staff 96 6 20 00:48 .
drwxr-xr-x 5 chen staff 160 6 20 00:50 ..
-rw-r–r–@ 1 chen staff 110477 6 25 01:07 opencv_face_detect_rectangle.jpg

ファイル data/dst/opencv_face_detect_rectangle.jpg が作成されたことが確認した。

 

参考