Face detection throws error: !empty() in function cv::CascadeClassifier::detectMultiScale

Face detection throws error: !empty() in function cv::CascadeClassifier::detectMultiScale

我正在使用内置的级联分类器进行人脸检测。 代码是这样的(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 Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale, file C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp, line 1634 Traceback (most recent call last): File "C:/Users/DELL/Downloads/Amma/code/fd.py", line 10, in faces = face_cascade.detectMultiScale(img, 1.3, 5) cv2.error: C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp:1634: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

参考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')

或者将这些文件放到包含您的脚本的目录中。

我遇到类似问题时刚好看到这个 post。我通过执行以下两行成功解决了错误:

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

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

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

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

您不需要下载或复制 .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))

这个 post 是旧的,但仍然是我的答案。使用绝对路径不起作用。事实证明,我下载(使用 curl)的 XML 文件已损坏。我不得不手动复制并粘贴 github 文件夹中的内容,然后一切都开始工作了。 Zhanwen Chen 的回答也有效(我认为这是 in-built 分类器的正确方法)。

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

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

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

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

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

关注了以下评论后。在你的 jupyter 实验室中,从 'File'、'Edit'、'View' 等选项中打开内核。现在选择 'Change Kernel' 和 select 'Python [conda env:root]'.

这样做就大功告成了。