OpenCVを使った顔と目の検出方法 Python
PythonのOpenCVを使った顔と目の検出をする方法とhaarcascadeファイルのダウンロード方法について投稿します。
プログラミングはColaboratoryで実行しています。
この投稿では以下2つのhaarcascadeファイルを使って顔検出と目の検出を行います。
haarcascade_frontalface_alt2.xml
haarcascade_eye.xml
目次
・haarcascadeファイルのダウンロード方法
・OpenCVを使った顔と目を検出するプログラム
・実行して表示した画像
haarcascadeファイルのダウンロード方法
プログラムで扱う2つのhaarcascadeファイルのダウンロード方法は
OpenCVの公式GitHubにあるdataフォルダの中のhaarcascadesフォルダからダウンロードするファイルを右クリックをし、名前を付けてリンク先を保存でダウンロードできます。
これが公式のサイトのリンクですhttps://github.com/opencv/opencv
ダウンロードができたらColaboratoryのプログラムを実行する場所に新規 > ファイルのアップロードから持ってきます。
OpenCVを使った顔と目を検出するプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import cv2 import matplotlib.pyplot as plt face_cascade = cv2.CascadeClassifier("./drive/My Drive/haarcascade_frontalface_alt2.xml") eye_cascade = cv2.CascadeClassifier("./drive/My Drive/haarcascade_eye.xml") def face_eye(image): img_gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#グレイ画像 faces = face_cascade.detectMultiScale(img_gray)#顔の検出 for (x,y,w,h) in faces: face=image[y:y+h,x:x+w]#読み込んだ画像から検出した顔の座標を使って顔を切り取る face_gray=img_gray[y:y+h,x:x+w]#グレイ画像から顔を切り取る eye = eye_cascade.detectMultiScale(face_gray)#目の検出 #表示 frame=cv2.resize(face,(300,300)) face_show=cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)#顔の表示 face_show=plt.imshow(face_show) plt.show() for (ex,ey,ew,eh) in eye:#目の位置 eye=face[ey:ey+eh,ex:ex+ew]#目を切り取る #表示 eye_show=cv2.resize(eye,(300,300)) eye_show=cv2.cvtColor(eye_show, cv2.COLOR_BGR2RGB)#目の表示 plt.imshow(eye_show) plt.show() #目の位置を四角の枠で囲む cv2.rectangle(face, (ex, ey), (ex+ew, ey+eh), (255,0,0), thickness=3)#目を囲む image=cv2.imread("./drive/My Drive/girl_green.jpg")#画像の読み込み face_show=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)#画像の表示 face_show=plt.imshow(face_show)# plt.show() face_eye(image)#自作関数 face_eyeの呼び出し face_show=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)#目の位置を四角で囲んだ画像の表示 face_show=plt.imshow(face_show) plt.show() |
顔と目を検出するプログラムを説明をします。
まず、画像を読み込むためにドライブをマウントします。そして、30行目のcv2.imreadで読み込んでplt.imshowで表示します。
※cv2で読み込んだ画像はRGBではなくBGRになっているので、plt.imshowで表示するときはRGBに変換して表示します。
35行目は読み込んだ画像データを変数imageに入れ、顔の検出と目の検出をする自作関数face_eye(image)に渡します。
9行目はグレイにした画像から、顔を検出するhaarcascadeファイルを使って顔を検出します。検出した顔の座標は変数facesに入ります。
※顔と目を検出するときはグレイにした画像を使います。グレイ画像にして、色を少なくすることで処理を行いやすくしています。
10行目から18行目までは読み込んだ画像から顔を検出した座標を使って、顔の部分を切り取ります。それから、目を検出するためにグレイにした画像からも検出した座標を使って、顔の部分を切り取ります。そして、13行目で目を検出するhaarcascadeファイルを使って目を検出します。検出した目の座標は変数eyeに入ります。その後、切り取った顔の表示をします。
19行目から27行目は検出した目の座標を使って切り取った顔から目の部分だけを切り取ります。そして、目だけを表示し、cv2.rectangleを使って四角の枠で目を囲みます。
36行目から38行目は四角の枠で目を囲んだ画像を表示します。
↓実行結果↓


実行して表示した画像



