Open CVのeye_cascadeを使用した目の認識を行なっているのですが、誤検知を減らす上で、表題のような課題に突き当たりました。
実際に書いたコード
下記コードのように、写真を読み込ませて顔認識した範囲で目認識をしようとします
pyton
1import os 2import cv2 3 4face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#学習データ 5eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')#学習データ 6 7img = cv2.imread('DSC_0064.JPG') 8gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 9faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.1, minSize = (400,400), maxSize = (int(width*0.8),int(width*0.8))) 10face_max = faces[faces[:, 2].argmax()] 11 12img1 = img[int(face_max[1]) : int(face_max[1]+face_max[2]), int(face_max[0]): int(face_max[0]+face_max[3])]#元画像を顔部分のみクロップ→その範囲のみ目顔認証をかける 13gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 14eyes = eye_cascade.detectMultiScale(gray1, scaleFactor = 1.1,minNeighbors=10, minSize = (50,50), maxSize = (350,350)) 15 16print(type(eyes)) 17print(eyes)#[x,y,w,h]の形で書き出される
結果
<class 'numpy.ndarray'> [[ 99 143 112 112] [298 154 102 102] [141 37 80 80]]
ndarray形式でこのような結果が書き出され、左右2つの目を認識したいにも関わらず3箇所認識されている結果となりました。(前髪や口が誤認識されているようです。)
そこで考えたのですが、目というものは、左右2つはほぼ水平に写真に収められるものなので、各要素の2番目のy座標の値に注目し、上から143と154と37だと、37の値が他の2つに比べて逸脱しているのでこれが誤検知なのだと判断できます。
このように、y座標の値が近似な2つの要素のみ抽出する
[[ 99 143 112 112] [298 154 102 102]]
といった処理を行い誤検知の値を排除したいと考えているのですが、なかなかうまい方法が思いつきません。
良い方法をご存知でしたらご教授いただけたらと思い、質問させていただきました。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー