pythonopencvface-detectionhaar-classifiereye-detection

OpenCV & Python : Face Detection using haarcascades is detecting many boxes as eyes.


I am using Haarcascades for detecting faces and eyes. My problem is, its bounding many boxes as eyes. My syntax is

face_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_eye.xml')
img = cv2.imread('SAM7.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,1.2,6)

I am currently using 1.2 and 6. What should be the value of the parameters in faces(5 line) like scaleFactor, minNeighbors ??


Solution

  • You really need to play with the parameters and find the ones works fine for you. Always there is a better way to do it but remember you'll never achieve 100% accuracy. You can learn about the parameters here.

    An example of face and eyes detection in python that works for me:

        import cv2
    
        face_cascade = cv2.CascadeClassifier("../haarcascades/haarcascade_frontalface_default.xml")
        eye_cascade = cv2.CascadeClassifier("../haarcascades/haarcascade_eye.xml") 
    
        cap = cv2.VideoCapture(0)
    
            while cap.isOpened():
                ret, frame = cap.read()
                if ret:
                    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                    faces = face_cascade.detectMultiScale(
                            gray,
                            scaleFactor=1.3,
                            minNeighbors=5,
                            minSize=(50, 50)
                           )
    
                    for (x, y, w, h) in faces:
                        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0),2)
                        roi_gray = gray[y:y + h, x:x + w]
                        roi_color = frame[y:y + h, x:x + w]
                        eyes = eye_cascade.detectMultiScale(
                               roi_gray,
                               scaleFactor=1.2,
                               minNeighbors=5,
                               minSize=(10, 10)
                               )
    
                        for (ex, ey, ew, eh) in eyes:
                            cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (255, 0, 0), 2)
    
                cv2.imshow("Faces found", frame)
    
                k = cv2.waitKey(10) & 0xff
                if k == 27:
                    break
    
        cv2.destroyAllWindows()
        cap.release()   
    

    I hope this helps you. If you need help with the code let me know.