PythonでOpenCVで顔認識するサンプルコード

Python

概要

PythonのOpenCVでカスケード分類器を使用して、画像から顔を検出するサンプルコードを紹介します。

顔認識に使う画像

  • ブッシュ大統領をはじめ、7名を顔認識できれば成功です。

サンプルコード

import numpy as np
import cv2

#分類器は、カスケード分類器を使います。
#引数に使用している.xmlは学習済みの検出器です。
#私の場合は、AnacondaでOpenCVを使っているので、下記のパスにありました。
#C:\Users\snuow\Anaconda3\pkgs\libopencv-3.4.2-h20b85fd_0\Library\etc\haarcascades\haarcascade_frontalface_default.xml

face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')

#画像を読み込み、グレースケールに変換します。
img = cv2.imread('sample_faces.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#顔の位置を検出します。
faces = face_cascade.detectMultiScale(gray,1.3,3)

#顔認識した場所に□を追加
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV CascadeClassifierの引数

#顔の位置を検出します。
faces = face_cascade.detectMultiScale(gray,1.3,3)
  • ここでは、3つの引数を与えています。
    • image:グレースケール画像
    • scaleFactor: 検索窓の拡大率 (1.0 より大きい値で指定、デフォルトは 1.1)
    • minNeighbors: 値を大きくするほど、誤検出は減りますが、未検出が増える可能性があります。(自然数で指定、デフォルトは3)

学習済み学習機のファイルパス

face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
  • ここで使用している学習機のファイルパスは、私の環境ではC:\Users\snuow\Anaconda3\pkgs\libopencv-3.4.2-h20b85fd_0\Library\etc\haarcascades\haarcascade_frontalface_default.xmlにありました。
  • なお、この学習機は正面の顔検出のものなので、正面以外の写真ではうまく検出できません。
  • 他の学習機も同一フォルダ内に存在しています。

結果

  • 結果はこんな感じで全員の顔を検出し、誤検出もなくできました。
  • 他にも複雑な写真の場合はもっと調整が必要かと思いますが、いったんはこんな感じで試せるかと思います。

コメント

タイトルとURLをコピーしました