Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用OpenCV时,人脸识别不会检测到任何错误_Python_Opencv_Face Recognition_Cascade Classifier - Fatal编程技术网

Python 使用OpenCV时,人脸识别不会检测到任何错误

Python 使用OpenCV时,人脸识别不会检测到任何错误,python,opencv,face-recognition,cascade-classifier,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'

我是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
但是,有时会检测到某些照片的人脸,而其他照片则不会。例如,在这张照片中,它的脸被切掉了:

但是,它没有检测到这张照片中的人脸

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

我的推荐信是

以下是代码和输出:

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


Haar级联不能提供很高的精度。如果您可以灵活地使用不同的型号,我建议您看看OpenCv的DNN模块的SSD caffe型号。你可以在这里读到更多关于它的内容:它应该是关于比例因子的,只是玩一下比例