错误:函数detectMultiScale中的(-215)!empty()


88

我正在尝试在python 2.7中学习cv2,但是当我运行代码时,在它的特定部分:

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


img = cv2.imread('2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

它返回此:

File "face_detection.py", line 11, in <module>
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/objdetect/src/cascadedetect.cpp:1595: error: (-215) !empty() in function detectMultiScale

我试图在此处搜索答案,但我能找到的最好的办法是,我必须以错误的方式加载face_cascade ...有帮助吗?


28
找不到您的xml文件。尝试像“ /my/files/bla/cacade.xml”这样的绝对路径
白俄罗斯

@berak我将原来的路径替换为您建议的路径,但是代码返回了相同的错误
arthurckl 2015年

您是否可以通过添加测试或图像显示来验证图像是否为空(例如,如果未正确加载)?
米卡,2015年

2
哦,我明白了,我以错误的方式写了fila路径。谢谢您的帮助 !
arthurckl

1
我有同样的问题,无论我怎么努力我都无法解决。您能告诉我们您如何解决吗?@arthurckl
aysebilgegunduz

Answers:


61

XML或文件丢失或其路径不正确或create_capture路径不正确。

opencv示例中的路径如下所示:

cascade_fn = args.get('--cascade', "../../data/haarcascades/haarcascade_frontalface_alt.xml")
nested_fn  = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml")

cam = create_capture(video_src, fallback='synth:bg=../data/lena.jpg:noise=0.05')

44

我遇到过同样的问题。

我不需要下载其他任何文件即可解决此问题。CV2具有我需要的一切。

而不是试图找出哪里 .xml文件值进行硬编码,而是使用了cv2给定的属性。

从OP

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

成为

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

6
应该将其标记为正确答案,这样可以节省我的时间。
Joe Albowicz

2
这工作得很好,应该标记为正确
Seaver Olson

您收到@VIVID什么错误?是cv2.data.haarcascades还是cv2.CascadeClassifie?
曼德布鲁特

@Mandelbrotter这里是我的问题:stackoverflow.com/questions/63423843/...
VIVID

16

我运行了相同的代码。这里有两件事要注意。1.给出.xml文件的完整路径。2.最后给出按键事件说明。

最后添加此代码块并运行文件,对我有用:

k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()

例如,我的代码看起来像

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml')

img = cv2.imread('lena.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

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

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)

k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()

我的输出看起来像这样:

输出


我的绝对路径错误,必须包含CWD(C:驱动器/项目目录/),即'C:/ Flask / venv / Lib / site-packages / cv2 / data /'
ThomasLYIT

11

使用整个文件路径,并在xml文件路径中使用“ \\”而不是“ \”。

文件路径应如下所示:

face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')

代替:

cascade_fn = args.get('--cascade', "..\..\data\haarcascades\haarcascade_frontalface_alt.xml")

11

XML文件丢失,您可以从GitHub存储库中获取文件,并将其放置在与项目相同的目录中。链接到GitHub上的文件夹在这里。只需下载名为haarcascade_frontalface_default.xml的文件。实际上,该文件存在于您的系统上。只需转到python安装文件夹的site-packages文件夹,然后在cv2 / data文件夹中检查该文件


8

如果您正在使用Anaconda,则应添加Anaconda路径。

new_path = 'C:/Users/.../Anaconda/Library/etc/haarcascades/'

face_cascade = cv2.CascadeClassifier(new_path + 'haarcascade_frontalface_default.xml')

8

无需更改代码

下载该.xml文件,然后放入该文件的路径

它将解决错误(100%)


5

此错误意味着找不到XML文件。该库需要您传递完整路径,即使您可能只是在使用OpenCV库随附的文件。

您可以使用内置pkg_resources模块为您自动确定。以下代码在从何处cv2加载模块的地方查找文件的完整路径:

import pkg_resources
haar_xml = pkg_resources.resource_filename(
    'cv2', 'data/haarcascade_frontalface_default.xml')

对我来说是'/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'; 您的保证会有所不同。只需让python的pkg_resources库找出来即可。

classifier = cv2.CascadeClassifier(haar_xml)
faces = classifier.detectMultiScale(frame)

成功!


4

在使用自制软件的OSX上,可以使用opencv文件夹的完整路径:

face_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_eye.xml')

请注意路径中的版本号。


3

可能face_cascade是空的。您可以通过键入以下命令来检查变量是否为空:

face_cascade.empty()

如果为空,您将得到True,这意味着您提到的路径中的文件不可用。尝试添加xml文件的完整路径,如下所示:

r'D:\folder Name\haarcascade_frontalface_default.xml'

3

“ \ Anaconda3 \ Lib \ site-packages \ cv2 \ data \”,我在此路径中找到了Anaconda的xml文件


2

如果您没有定义XML文件的完整路径,则可能会发现此类错误。如果您在raspberrypi 3中使用opencv3.1.0,请尝试以下方法:“ faceCascade = cv2.CascadeClassifier('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')”


2

您可以通过将XML放在主python文件所在的目录(尝试包含该文件的位置)中来解决此问题。现在,下一步是使用完整路径。例如

这行不通

front_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')

使用完整路径,现在可以正常使用

front_cascade = cv2.CascadeClassifier('/Users/xyz/Documents/project/haarcascade_eye.xml')

2

我在其他答案中找到了这个答案,但是当我添加两个答案时最终为我工作。

import cv2
from matplotlib import pyplot as plt
import numpy as np
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_eye.xml")

img = cv2.imread('image1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

2

您只需要添加haarcascade_frontalface_default.xml文件的正确路径,只需添加前缀(cv2.data.haarcascades

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

1
这种方法对我也
有用

1

找不到您的XML文件。尝试使用绝对路径,例如:

/path/to/my/file (Mac, Linux)
C:\\path\\to\\my\\file (Windows)

1

该错误可能是由于所需的xml文件未正确加载引起的。haarcascade_frontalface_default.xml 使用您的操作系统的搜索引擎搜索文件,获取完整路径并将其作为参数cv2.CascadeClassifier作为字符串



1

我遇到了同样的问题。但是写了正确的位置。

face_cascade = cv2.CascadeClassifier('./model/haarcascade_frontalface_default.xml')

我发现我需要声明完整路径来删除该错误。

face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')

解决了我的问题!将其与stackoverflow.com/a/3430395/3525780结合使用,始终获取当前工作目录
Fusseldieb

0

我遇到了同样的问题,opencv-python并且使用了虚拟环境。如果是您的情况,应该xml在以下位置找到文件:

/home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_frontalface_default.xml

/home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_eye.xml

请确保您使用的是绝对路径。否则,它将无法正常工作。


0

上述解决方案的主要思想是:找到.xml文件的正确路径,并使用它正确访问文件。

就我而言,我将opencv安装在anoconda env中,首先直接到达Anoconda的路径,然后

  • 使用以下命令查找.xml文件的路径:

    $ find . -name 'haarcascade_eye.xml' (例如,haarcascade_eye.xml在当前目录(。)中搜索文件)

  • 然后使用return path

eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')


-1

由于缺少xml文件或xml文件路径不正确而发生该错误。

请尝试以下代码,

import numpy as np
import cv2

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

cap = cv2.VideoCapture(0)

while 1:
    ret, img = cap.read()
    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)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.