目の検出
前回と同じく、懲りずにOpenCVで画像からの検出です。今回は目の検出。
前回
Python/openCVで画像の顔検知 - よちよちpython
今回のプログラムは少し改良して賢くなりました。
一発で複数枚一気に処理できます。
下記のPythonスクリプトと同じフォルダに保存したすべての「jpg」拡張子の画像ファイルから目を検出します。
検出された場合は、目を黄色い枠で囲んで新しく画像ファイルを作成し、同じフォルダに保存します。
検出結果画像
ピシャッとキマッている。
こちらもピシャリ。
口まで目と認識している。
眼鏡はどうも検出結果がよくない。
やりたい放題
多ければいいというものではない。
目は難しい……
環境
Windows10
Anaconda
Python3.6
Jupyter Notebook
Pythonスクリプト作成
import cv2 import sys,os import glob os.chdir(os.path.dirname(os.path.abspath('__file__'))) # ディレクトリ内のjpgファイルを全て取得しリスト化 image_files = glob.glob('*.jpg') # ファイル名を拡張子と切り離し、一つずつ目の検出処理 for image_file in image_files: image_file_name = image_file.split(".") # image_file_head image_file_head = image_file_name[0] # image_file_tail image_file_tail = image_file_name[1] print(image_file_head) # カスケードファイルのパスを指定 (注意 : 環境に合わせてパスを変えてください。 dir_name = "C:\\Users\\ユーザー名\\Anaconda3\\envs\\tensorflow\\Lib\\site-packages\\cv2\\data\\" cascade_file = dir_name + "haarcascade_eye.xml" # 画像の読込 image = cv2.imread(image_file) # グレースケールに変換 image_gs = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) # カスケードファイルの読込 cascade = cv2.CascadeClassifier(cascade_file) # 目検出の実行(リスト型) face_list = cascade.detectMultiScale( image_gs, scaleFactor=1.1, minNeighbors=1, minSize=(10,10), ) # 目が検出されたら(リスト要素があれば) if len(face_list) > 0: # 認識した部分を囲む print(face_list) # 黄色で囲む color = (0,255,255) for face in face_list: x,y,w,h = face cv2.rectangle(image,(x,y),(x+w,y+h), color,thickness=2) #新規ファイル名作成 New_file_name = image_file_head + "DetectEyeOutput.PNG" # 描写結果をファイルに書き込む cv2.imwrite(New_file_name,image) # 目が検出されなければ else: print("no eye")