よちよちpython

独習 python/Qpython/Pydroid3/termux

Python/OpenCV 目の男たち

目の検出

前回と同じく、懲りずにOpenCVで画像からの検出です。今回は目の検出。

前回
Python/openCVで画像の顔検知 - よちよちpython

今回のプログラムは少し改良して賢くなりました。
一発で複数枚一気に処理できます。


下記のPythonスクリプトと同じフォルダに保存したすべての「jpg」拡張子の画像ファイルから目を検出します。


検出された場合は、目を黄色い枠で囲んで新しく画像ファイルを作成し、同じフォルダに保存します。

検出結果画像

ピシャッとキマッている。

f:id:chayarokurokuro:20190703060256j:plain


こちらもピシャリ。

f:id:chayarokurokuro:20190703060309j:plain


口まで目と認識している。

f:id:chayarokurokuro:20190703060329j:plain


眼鏡はどうも検出結果がよくない。

f:id:chayarokurokuro:20190703060651j:plain



やりたい放題

f:id:chayarokurokuro:20190703060757j:plain



多ければいいというものではない。

f:id:chayarokurokuro:20190703060800j:plain


目は難しい……


環境

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")