【问题标题】:I am gettig an error in my program of face recognition. (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'我的人脸识别程序出错。 (-215:断言失败)函数'cv :: CascadeClassifier ::detectMultiScale'中的!empty()
【发布时间】:2020-07-17 05:33:42
【问题描述】:

我正在使用 LBPH 算法进行人脸检测。收集数据和训练部分工作正常,但在测试部分出现错误

这是测试代码

import cv2
import numpy as np
import webbrowser


face_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

def face_detector(img, size=0.5):

    faces = ()
    # Convert image to grayscale
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow('Printe1r', gray )
    if np.count_nonzero(gray) >= 0:
        print("in face detector")
        faces = face_classifier.detectMultiScale(gray, 1.3, 5)

    if faces is ():
        return img, []

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
        roi = img[y:y+h, x:x+w]
        roi = cv2.resize(roi, (200, 200))
    return img, roi



# Open Webcam
cap = cv2.VideoCapture(0)
print("WebCam opened")
while True:

    ret, frame = cap.read()
    cv2.imshow('Printe1rwer', frame )
    image, face = face_detector(frame)
    cv2.imshow('Printe1aas r', image )
    print(face)

    try:
        print("hell1o")
        face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
        print("hello")
        # Pass face to prediction model
        # "results" comprises of a tuple containing the label and the confidence value
        results = model.predict(face)
        print("Helo",results)

        if results[1] < 500:
            print("in results < 500")
            confidence = int( 100 * (1 - (results[1])/400) )
            display_string = str(confidence) + '% Confident it is User'

        cv2.putText(face, display_string, (100, 120), cv2.FONT_HERSHEY_COMPLEX, 1, (255,120,150), 2)

        if confidence > 75:
            print("in confidence < 75")
            cv2.putText(face, "Hey Vimal", (250, 450), cv2.FONT_HERSHEY_COMPLEX, 1, (0,255,0), 2)
            cv2.imshow('Face Recognition', face )
            webbrowser.open('')
            break
        else:
            print("in else")
            cv2.putText(face, "Locked", (250, 450), cv2.FONT_HERSHEY_COMPLEX, 1, (0,0,255), 2)
            cv2.imshow('Face Recognition', face )

    except Exception as e:
        print(e)
        cv2.putText(frame, "No Face Found", (220, 120) , cv2.FONT_HERSHEY_COMPLEX, 1, (0,0,255), 2)
        cv2.putText(frame, "Locked", (250, 450), cv2.FONT_HERSHEY_COMPLEX, 1, (0,0,255), 2)
        cv2.imshow('Face Recognition', frame )
        pass

    if cv2.waitKey(1) == 13: #13 is the Enter Key
        break

cap.release()
cv2.destroyAllWindows() 

我得到的错误是:

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-1-3a076399e5b1> in <module>
     34     ret, frame = cap.read()
     35     cv2.imshow('Printe1rwer', frame )
---> 36     image, face = face_detector(frame)
     37     cv2.imshow('Printe1aas r', image )
     38     print(face)

<ipython-input-1-3a076399e5b1> in face_detector(img, size)
     14     if np.count_nonzero(gray) >= 0:
     15         print("in face detector")
---> 16         faces = face_classifier.detectMultiScale(gray, 1.3, 5)
     17 
     18     if faces is ():

error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: 
error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'`

有人能帮帮我吗? 我正在使用 OpenCV 4.2.0 版 一件事是人脸检测器函数中的变量 gray 的值始终是一个所有值都为零的 numpy 数组。我已经检查过了,但它总是为零。

【问题讨论】:

  • 您是否正确地看到了face_detectorcv2.imshow('Printe1r', gray ) 行的图像? 'haarcascade_frontalface_default.xml'的文件路径是否正确?
  • 文件路径正确但 cv2.imshow('Printe1r', gray ) 显示空白屏幕。这就是我要问的,灰色总是零数组。

标签: opencv face-recognition lbph-algorithm


【解决方案1】:

我已经测试了您的代码的第一部分。它似乎正在工作,打印gray 我得到:

TEMP.py:20: SyntaxWarning: "is" with a literal. Did you mean "=="?
  if faces is ():
WebCam opened
[[162 162 162 ...  97  97  97]
 [161 161 160 ...  95  95  95]
 [159 159 161 ...  95  95  95]
 ...
 [252 252 252 ... 164 164 164]
 [236 233 229 ... 165 164 164]
 [164 158 153 ... 164 164 164]]

除了按照解释器的建议用== 更正() 之外,我会检查:

  1. 人脸检测器中的img 非零(打印出来,我的没问题)。
  2. 您实际上在cap = cv2.VideoCapture(0) 中加载了正确的输入源(您是否连接了多个网络摄像头?)
  3. 尝试在ret, frame = cap.read() 之后插入if frame: 块。 可能只有第一帧是“无”,它会给您带来所有问题。

如果以上都ok,那么唯一的嫌疑人就是gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)...

附注:ret, frame = cap.read() 从相机连续读取所有输入,但在处理每一帧时,电脑可能比您的算法慢。我通常避免使用技巧来创建长缓冲区。解决上述问题后,看看this

【讨论】:

  • 感谢您的建议,我已经尝试过了。我更改了“ haarcascade_frontalface_default.xml ”的路径目录。它对我有用。
  • 如果可行,请将其设置为答案。谢谢。
【解决方案2】:

我尝试更改“haarcascade_frontalface_default.xml”的文件路径,它对我有用。我的意思是我提供了该位置的确切路径。

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 2021-11-08
    • 2019-06-04
    • 2021-02-26
    • 2021-11-02
    • 2022-06-22
    • 2021-11-18
    • 2022-10-15
    相关资源
    最近更新 更多