OpenCV无法识别人脸

时间:2020-07-27 19:41:51

标签: python opencv face-recognition cascade-classifier

我是使用OpenCv2的初学者,我正在尝试使用以下功能检测人脸:

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

但是,有时某些照片被检测到脸部,而其他照片则未被检测到。例如,它是这张照片中的人脸: enter image description here

但是,它没有在这张照片中检测到脸部 enter image description here

我不知道第二张照片出了什么问题,因为我相信它的质量很好,并且所显示的脸部几乎与第一张照片相似。有想法吗?

1 个答案:

答案 0 :(得分:1)

我的推荐人是here

代码和输出如下:

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

输出

enter image description here

enter image description here