PythonのOpenCVを使った顔検出で顔以外を囲まないようにする方法
PythonのOpenCVを使って、顔検出をすると顔以外の場所を顔と検出されてしまいます。そして、検出した後に四角で囲む処理をすると顔以外の部分を四角で囲んでしまうので、それをさせない方法を紹介します。
OpenCVのhaarcascadeファイルのダウンロード方法はこちら↓の投稿で紹介しています。
まず、これが顔検出で使う画像になります。

そして、通常のcv2を使った顔検出のプログラミングコードと実行結果の画像が下になります。
cv2を使った顔検出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import cv2 face_cascade_path = "haarcascade_frontalface_alt2.xml" face_cascade = cv2.CascadeClassifier(face_cascade_path) def detectface(src): src_gray=cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(src_gray)#顔検出 for (x,y,w,h) in faces: cv2.rectangle(src, (x, y), (x+w, y+h), (0,0,255), thickness=3)#四角の枠で囲む frame=cv2.imread("画像名前") detectface(frame)#def文 size=(500,600) frame=cv2.resize(frame,size) cv2.imshow("face",frame) cv2.waitKey(0) cv2.destroyAllWindows() |

※顔以外にも手の部分も顔と検出されてしまいます
顔以外を囲まないようにする方法
解決策としては顔を検出した中に目を検出できれば、本物の顔として四角の枠で囲みます。
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 |
import cv2 face_cascade_path = "haarcascade_frontalface_alt2.xml" eye_cascade_path = "haarcascade_eye.xml" face_cascade = cv2.CascadeClassifier(face_cascade_path) eye_cascade = cv2.CascadeClassifier(eye_cascade_path) def detectface(src): src_gray=cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(src_gray)#顔検出 for (x,y,w,h) in faces: face_gray=src_gray[y:y+h,x:x+w]#グレーの顔 eye = eye_cascade.detectMultiScale(face_gray)#グレーにした顔から目を検出 list_data=len(eye)#目が検出されたらリストに目の座標が入る if list_data!=0:#目を検出した箇所だけに四角の枠で囲む cv2.rectangle(src, (x, y), (x+w, y+h), (0,0,255), thickness=3)#四角の枠で囲む frame=cv2.imread("画像名前") detectface(frame) size=(500,600) frame=cv2.resize(frame,size) cv2.imshow("face",frame) cv2.waitKey(0) cv2.destroyAllWindows() |
目の位置を検出したとこだけ、四角の枠で囲むようにすると正しく顔の部分が囲まれます。
