今回はOpenCVで顔を検出する方法です。今回はカスケード型検出器である"haarcascade_frontalface_default.xml"というものを用いました。

プログラムは以下の通りです。プログラムの後に解説を付けておきます。
  1. %matplotlib inline
  2. import cv2
  3. import matplotlib.pyplot as plt
  4.  
  5. img = cv2.imread('input2.jpg')
  6.  
  7. gry_img = cv2.imread('input2.jpg', 0)
  8.  
  9. cascade = cv2.CascadeClassifier(cascade_path)
  10.  
  11. facerect = cascade.detectMultiScale(gry_img, scaleFactor=1.1, minNeighbors=5, minSize=(100, 100))
  12.  
  13. rectangle_color = (0, 255, 0)
  14.  
  15. if len(facerect) > 0:
  16.     for rect in facerect:
  17.         cv2.rectangle(img, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), rectangle_color, thickness=2)
  18.  
  19. cv2.imwrite('output.jpg',threshold_img)
5行目で結果表示用の画像を読み込みます。
7行目で処理用の白黒画像を読み込みます。
9行目でカスケード検出器の特徴量を取得します。
11行目で顔検出をします。

初めはプログラム内で検出器のパスを指定していたのですが、うまくいかずエラーを吐いてしまったので"haarcascade_frontalface_default.xml"をOpenCVのファイル内から探してきて直接フォルダ内に入れることで解決しています。


 試しにフリー素材(https://www.pakutaso.com/)から顔を検出した結果、いい感じに検出できました。

output1
output2
output3
output4