Python, OpenCVで顔検出と瞳検出(顔認識、瞳認識)
静止画の特徴検出
静止画: 画像ファイルを読み込んで顔検出と瞳検出
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 が作成されたことが確認した。