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

art*_*ckl 59 opencv image-recognition python-2.7

我正在尝试在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)
Run Code Online (Sandbox Code Playgroud)

它返回:

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
Run Code Online (Sandbox Code Playgroud)

我试着在这里搜索答案,但我能找到的最好的是我必须以错误的方式加载face_cascade ...有什么帮助吗?

Man*_*ter 106

我遇到过同样的问题。

我不需要下载任何其他东西来解决这个问题。CV2 拥有我需要的一切。

我没有尝试找出.xml文件的位置并对值进行硬编码,而是使用了 cv2 提供的属性。

来自 OP

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
Run Code Online (Sandbox Code Playgroud)

成为

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为正确答案,这会节省我的时间。 (13认同)
  • 这工作完美,应该标记为正确 (6认同)
  • 需要`pip install opencv-contrib-python`来获取`cv2.data` (2认同)

Per*_*son 55

缺少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')
Run Code Online (Sandbox Code Playgroud)


Kee*_*nan 14

我运行了相同的代码.这里有两点需要注意.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()
Run Code Online (Sandbox Code Playgroud)

例如,我的代码看起来像

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()
Run Code Online (Sandbox Code Playgroud)

我的输出看起来像在这里输入图像描述


Avn*_*hra 12

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


小智 9

使用整个文件路径并在xml文件路径中使用"\\"而不是"\".

文件路径应如下所示:

face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
Run Code Online (Sandbox Code Playgroud)

代替:

cascade_fn = args.get('--cascade', "..\..\data\haarcascades\haarcascade_frontalface_alt.xml")
Run Code Online (Sandbox Code Playgroud)


小智 7

如果您使用的是Anaconda,则应添加Anaconda路径.

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

face_cascade = cv2.CascadeClassifier(new_path + 'haarcascade_frontalface_default.xml')
Run Code Online (Sandbox Code Playgroud)


and*_*otn 7

此错误表示找不到 XML 文件。该库需要您将完整路径传递给它,即使您可能只是使用 OpenCV 库附带的文件。

您可以使用内置pkg_resources模块为您自动确定这一点。以下代码cv2在加载模块的任何位置查找文件的完整路径:

import pkg_resources
haar_xml = pkg_resources.resource_filename(
    'cv2', 'data/haarcascade_frontalface_default.xml')
Run Code Online (Sandbox Code Playgroud)

对我来说这是'/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)
Run Code Online (Sandbox Code Playgroud)

成功!


Cod*_*der 6

无需更改代码

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

它将解决错误(100%)


Mas*_*han 6

您只需要添加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')
Run Code Online (Sandbox Code Playgroud)


Mas*_*Bee 5

在带有自制软件的 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')
Run Code Online (Sandbox Code Playgroud)

注意路径中的版本号。