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

时间:2015-05-28 14:05:32

标签: python-2.7 opencv image-recognition

我试图在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 ......有什么帮助吗?

25 个答案:

答案 0 :(得分:53)

我有同样的问题。

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

我使用cv2给定的属性,而不是试图找出.xml文件的位置并对值进行硬编码。

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

答案 1 :(得分:44)

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

答案 2 :(得分:11)

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

我的输出看起来像enter image description here

答案 3 :(得分:9)

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

答案 4 :(得分:6)

使用整个文件路径并使用&#34; \\&#34;而不是&#34; \&#34;在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")

答案 5 :(得分:6)

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

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

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

答案 6 :(得分:3)

您只需要添加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')

答案 7 :(得分:3)

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

face_cascade.empty()

如果它是空的,您将获得True,这意味着您提供的路径中没有您的文件。 尝试添加xml文件的完整路径,如下所示:

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

答案 8 :(得分:3)

在使用自制软件安装的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')

注意路径中的版本号。

答案 9 :(得分:2)

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

答案 10 :(得分: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)

答案 11 :(得分:2)

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

这不起作用

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

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

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

答案 12 :(得分:2)

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

您可以使用内置的pkg_resources module为您自动确定。以下代码在从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)

成功!

答案 13 :(得分:2)

无需更改代码

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

它将解决错误(100%)

答案 14 :(得分:2)

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

答案 15 :(得分:1)

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

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

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

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

答案 16 :(得分:1)

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

答案 17 :(得分: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

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

答案 18 :(得分:0)

请不要复制粘贴xml文件的内容,因为一旦将其粘贴到记事本中,它将保存一个s文本文件。因此,可以直接从给定的源下载文件。

答案 19 :(得分:0)

由于缺少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()

答案 20 :(得分:0)

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

在我的情况下,我将opencv安装在anoconda env中,首先直接到达Anoconda的路径,然后

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

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

  • 然后使用返回值path

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

答案 21 :(得分:0)

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

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

答案 22 :(得分:0)

我遇到了类似的问题。似乎更正XML路径会使此错误消失。

答案 23 :(得分:0)

这似乎是文件路径问题。我改变了这样的代码,它起作用了。

haar_face_filename = "D:\Sandbox\Github\Faces\haar_face.xml"
haar_cascade = cv.CascadeClassifier(haar_face_filename)

答案 24 :(得分:0)

我遇到了同样的问题,并试图在我的 xml 文件和图像位于资源文件夹中的 springboot 应用程序中使用 open cv。 试图给出从 src 开始的路径或像 C:\a\b.xml 这样的绝对路径不起作用。

使用项目根路径动态创建文件路径。

String classifierPath = System.getProperty("user.dir") + "/src/main/resources/haarcascades/haarcascade_frontalface.xml";

// similarly for image paths