【问题标题】:Face detection throws error: !empty() in function cv::CascadeClassifier::detectMultiScale在opencv python中使用级联分类器进行人脸检测
【发布时间】:2023-04-08 00:49:01
【问题描述】:

我正在使用内置的级联分类器进行人脸检测。 代码是这样的(OpenCV Python Tutorials):

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread('ammma.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

for (x,y,w,h) in faces:
    cv2.Rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for(ex,ey,ew,eh) in eyes:
        cv2.Rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

但是当我运行代码时出现以下错误:

C:\Python27\python.exe C:/Users/DELL/Downloads/Amma/code/fd.py

OpenCV 错误: cv::CascadeClassifier::detectMultiScale 中的断言失败 (!empty()),文件 C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp,行1634 回溯(最近一次通话最后): 文件“C:/Users/DELL/Downloads/Amma/code/fd.py”,第 10 行,在 faces = face_cascade.detectMultiScale(img, 1.3, 5) cv2.error: C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp:1634: 错误: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

【问题讨论】:

  • 应该是cv2.rectangle(...) 而不是cv2.Rectangle(...)

标签: python-2.7 opencv computer-vision face-detection


【解决方案1】:

参考this 代码行,检查级联是否为非空失败。请使用经过训练的级联检查 XML 文件的路径。您可能需要像这样指定 XML 的完整路径:

face_cascade = cv2.CascadeClassifier('D:\opencv\data\haarcascades\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('D:\opencv\data\haarcascades\haarcascade_eye.xml')

或者只是把这些文件放到包含你的脚本的目录中。

【讨论】:

【解决方案2】:

您不需要下载或复制 .xml 文件。根据OpenCV-Python PyPi page,您可以简单地使用已安装级联的打包路径-cv2.data.haarcascades

import cv2

# Globals
FACE_CLASSIFIER = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
EYE_CLASSIFIER = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
SCALE_FACTOR = 1.3
BLUE_COLOR = (255, 0, 0)
MIN_NEIGHBORS = 5

# Then use it however you'd like
try:
    faces = FACE_CLASSIFIER.detectMultiScale(gray, SCALE_FACTOR, MIN_NEIGHBORS)
    for (x, y, w, h) in faces:
        cv2.rectangle(self.roi_frame, (x, y), (x+w, y+h), BLUE_COLOR, HAAR_LINE_THICKNESS)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = self.roi_frame[y:y+h, x:x+w]
        eyes = EYE_CLASSIFIER.detectMultiScale(roi_gray)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), GREEN_COLOR, HAAR_LINE_THICKNESS)
except Exception as e:
    warnings.warn('{}.show_haar_features: got exception {}'.format(__name__, e))

【讨论】:

    【解决方案3】:

    当我遇到类似问题时,我碰巧看到了这篇文章。我通过执行以下 2 行成功解决了错误:

    face_cascade = cv2.CascadeClassifier('opencv-3.0.0/data/harcascades/haarcascade_frontalface.xml')
    
    eye_cascade = cv2.CascadeClassifier('opencv-3.0.0/data/harcascades/haarcascade_eye.xml')
    

    也许,它会帮助其他人解决同样的问题!

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题。首先,您必须将文件的正确路径提供给系统,如下所示: /home/xxxx/Desktop/Projects/haarcascade_eye.xml。 接下来,您必须在 github 上打开代码并保存代码的原始版本以供其运行。 建议将这两个文件都放在存储项目文件的文件夹中。 快乐编码

      【讨论】:

        【解决方案5】:

        好吧,如果您收到此错误,那么您需要下载这 2 个 .xml 文件,因为 python 在 pc 上找不到它们。 我有同样的问题,然后我下载了 .xml 文件并将其保存在我的 .py 文件所在的文件夹中。然后我得到了完美的输出。 要下载文件,请搜索文件名并从 sourceforge 下载。

        【讨论】:

          【解决方案6】:

          这篇文章很旧,但这是我的答案。使用绝对路径不起作用。原来我下载的 XML 文件(使用 curl)已损坏。我不得不手动复制并粘贴 github 文件夹中的内容,之后一切都开始工作了。 Zhanwen Chen 的回答也有效(我相信这是内置分类器的正确方法)。

          【讨论】:

            【解决方案7】:

            也许,你像我一样为 python 使用 virtualenv。你试试这个。

            import os
            
            base_directory = os.path.abspath(os.getcwd())
            directory_cv2 = os.path.join(base_directory, "Lib", "site-packages", "cv2","data")
            print("la carpeta es: {}".format(directory_cv2))
            

            【讨论】:

              【解决方案8】:

              在较新版本的 opencv haarcascades 中也安装了你只需要 haarcascades 的文件位置,你可以使用 cv2.data.haarcascades 来获取它,如下所示

              cascPath = "haarcascade_frontalface_default.xml"
              faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + cascPath)
              
              

              【讨论】:

                【解决方案9】:

                https://github.com/udacity/P1_Facial_Keypoints/issues/13#issuecomment-385461579

                在关注以下评论之后。在您的 jupyter 实验室中,从“文件”、“编辑”、“查看”等选项中打开内核。现在选择“更改内核”并选择“Python [conda env:root]”。

                这样做,你就完成了。

                【讨论】:

                  猜你喜欢
                  • 2016-10-26
                  • 2014-06-28
                  • 2013-10-23
                  • 1970-01-01
                  • 2013-03-23
                  • 2017-10-02
                  • 2014-11-09
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多