Edited at

OpenCVで顔認識をしてみた

OpenCVは画像処理に使えるオープンソースのライブラリです。これはPythonでも使うことができるので機械学習でも使うことができます。今回はこのOpenCVを利用して顔認識をやってみようと思います。

今回の動作環境


  • Ubuntu 14.04

  • Python 3.6.1

  • OpenCV 3.1.0


今回やること

画像を読み込み、画像の中に顔を認識したら顔の座標と大きさを表示させます。その後、認識した顔を赤い四角形で表示させます。OpenCVには顔認識に使える特徴データのファイル(カスケードファイル)がいくつか用意されています。今回は正面を向いた時の顔を認識するデータファイルとして、haarcascade_frontalface_alt.xmlを使用します。なお、今回は以下の画像を使用して認識をします(ソースコード上ではbefore.jpgとしています)。

参照元:https://www.pakutaso.com/assets_c/2016/03/SAYA151005380I9A8403-thumb-autox1600-21549.jpg


ソースコード


front_face.py

#coding: utf-8

import cv2

cascade_file = "haarcascade_frontalface_alt.xml"
image_file = "before.jpg"

img = cv2.imread(image_file)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cascade = cv2.CascadeClassifier(cascade_file)
face_list = cascade.detectMultiScale(img_gray, minSize=(150, 150))

if len(face_list) == 0:
print("Fail recognise")
quit()

for (x, y, w, h) in face_list:
print("顔の座標 =", x, y, w, h)
color = (0, 0, 225)
pen_w = 8
cv2.rectangle(img, (x, y), (x+w, y+h), color, thickness = pen_w)

cv2.imwrite("after.jpg", img)


実行したところ、こんなエラーが出ました。

OpenCV Error: Assertion failed (!empty()) in detectMultiScale, file /home/travis/miniconda/conda-bld/conda_1486587069159/work/opencv-3.1.0/modules/objdetect/src/cascadedetect.cpp, line 1639

Traceback (most recent call last):
File "face_front.py", line 11, in <module>
face_list = cascade.detectMultiScale(img_gray, minSize=(150, 150))
cv2.error: /home/travis/miniconda/conda-bld/conda_1486587069159/work/opencv-3.1.0/modules/objdetect/src/cascadedetect.cpp:1639: error: (-215) !empty() in function detectMultiScale


  • 原因

調べてみたら、カスケードファイルのパスが間違っていることで起こっているエラーのようです。


  • 解決策

応急処置としてこのカスケードファイルをソースコードのあるディレクトリにコピーしてきて使うことが出来ました。


結果

実行結果として以下のような画像になりました。


参考

Ubuntu16.04 LTSにOpenCV3.1をインストール から顔認識のテストまで