Mee
Mee

Reputation: 1651

face recognition does not detect any with OpenCV

I am beginner at using OpenCv2, I am trying to detect faces with the following function:

def faceDetection(test_img):
    gray_img=cv2.cvtColor(test_img,cv2.COLOR_BGR2GRAY)#convert color image to grayscale
    face_haar_cascade=cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')#Load haar classifier
    faces=face_haar_cascade.detectMultiScale(gray_img,scaleFactor=1.32,minNeighbors=5)#detectMultiScale returns rectangles

    return faces,gray_img

However, sometimes the faces are detected for some of the photos and the others not. For example it's dected the face in this photo: enter image description here

However, it didn't detect the face in this photo enter image description here

I do not know what went wrong in the second picture, as I believe it's with good quality and the face is shown almost similar to the first photo. Any idea?

Upvotes: 0

Views: 1778

Answers (1)

Yunus Temurlenk
Yunus Temurlenk

Reputation: 4352

My reference is here.

Here is the code and output:

import cv2
import sys

def detectFaceOpenCVHaar(faceCascade, frame, inHeight=300, inWidth=0):
    frameOpenCVHaar = frame.copy()
    frameHeight = frameOpenCVHaar.shape[0]
    frameWidth = frameOpenCVHaar.shape[1]
    if not inWidth:
        inWidth = int((frameWidth / frameHeight) * inHeight)

    scaleHeight = frameHeight / inHeight
    scaleWidth = frameWidth / inWidth

    frameOpenCVHaarSmall = cv2.resize(frameOpenCVHaar, (inWidth, inHeight))
    frameGray = cv2.cvtColor(frameOpenCVHaarSmall, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(frameGray)
    bboxes = []
    for (x, y, w, h) in faces:
        x1 = x
        y1 = y
        x2 = x + w
        y2 = y + h
        cvRect = [int(x1 * scaleWidth), int(y1 * scaleHeight),
                  int(x2 * scaleWidth), int(y2 * scaleHeight)]
        bboxes.append(cvRect)
        cv2.rectangle(frameOpenCVHaar, (cvRect[0], cvRect[1]), (cvRect[2], cvRect[3]), (0, 255, 0),
                      int(round(frameHeight / 150)), 4)
    return frameOpenCVHaar, bboxes

if __name__ == "__main__" :
   
    faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')       
    frame = cv2.imread("/ur/image/directory/to/face.jpg")
    outOpencvHaar, bboxes = detectFaceOpenCVHaar(faceCascade, frame)   
    cv2.imshow("Face Detection Comparison", outOpencvHaar)
    key = cv2.waitKey(0)            
    cv2.destroyAllWindows()  

Output

enter image description here

enter image description here

Upvotes: 1

Related Questions