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
#ソースコード
#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をインストール から顔認識のテストまで