ここではOpenCVを用いた顔認識をするためのプログラムについて解説しています。
行ったこと
以下の写真で顔を認識して赤枠を付けることを行いました。
プログラム
import cv2
import sys
from matplotlib import pyplot as plt
plt.axis('off')
#1---ファイル指定
image_file = "women.jpg"
#2---カスケードファイルの指定
cascade = "haarcascade_frontalface_alt.xml"
#3---画像の読込
image = cv2.imread(image_file)
#4---グレースケールに変換
image_gs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#5---カスケードファイルの読込
cascade = cv2.CascadeClassifier(cascade)
#6---顔認識
face = cascade.detectMultiScale(image_gs,
scaleFactor=1.1,minNeighbors=1,minSize=(150,150))
#7---認識した場合
if len(face) > 0:
#8---認識した部分を赤で囲む
color = (0, 0, 255)
for f in face:
x,y,w,h = face
cv2.rectangle(image, (x,y), (x+w, y+h), color, thickness=8)
#9---出力
cv2.imwrite("cap_women.jpg", image)
#10---認識できなかった場合
else:
print("nothing")
上記がプログラムになります。
それでは解説していきます。
#1---ファイル指定
image_file = "women.jpg"
1の部分では、ファイル名を指定しています。
#2---カスケードファイルの指定
cascade = "haarcascade_frontalface_alt.xml"
2の部分ではカスケードファイルを指定しています。カスケードファイルは特徴量をすでに学習済みデータの分類器のことです。
カスケードファイルを入手する方法はこちらからダウンロードして下さい。ファイル名は「haarcascade_frontalface_alt.xml」になります。
#3---画像の読込
image = cv2.imread(image_file)
3の部分では、画像を読み込んでいます。opencvで読み込む場合はcv2.imread(ファイル名)と記述します。
#4---グレースケールに変換
image_gs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
4の部分では読み込んだ画像をグレースケールに変換しています。
#5---カスケードファイルの読込
cascade = cv2.CascadeClassifier(cascade)
5の部分ではカスケードファイルを読み込んでいます。次の6の部分で特徴量を元に顔認識を行う前準備になります。
#6---顔認識
face = cascade.detectMultiScale(image_gs,
scaleFactor=1.1,minNeighbors=1,minSize=(150,150))
6の部分では顔認識を行っています。detectMultiScale()メソッドを用いて、引数にminiSizeを指定して150×150ピクセル以下の範囲を無視するようにしています。上手く認識されないときは、ここの数値を変更すると上手く認識される場合があります。
#7---認識した場合
if len(face) > 0:
#8---認識した部分を赤で囲む
color = (0, 0, 255)
for f in face:
x,y,w,h = face
cv2.rectangle(image, (x,y), (x+w, y+h), color, thickness=8)
7の部分では認識した場合の条件を示しています。1個でもあったら8の部分で赤枠を用いて認識した範囲を矩形で描画します。
#9---出力
cv2.imwrite("cap_women.jpg", image)
9の部分では結果を出力しています。
#10---認識できなかった場合
else:
print("nothing")
10の部分では認識できなかった場合の合図を出力しています。
結果
上記が結果になります。ちなみに顔と認識した範囲の数値は「[2393 884 1035 1035]」となりました。
モザイク処理など、色々と応用できそうなことが分かります。