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

Python 错误:(-215)!函数detectMultiScale中的空(),python,python-2.7,opencv,image-recognition,Python,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.CO

我试图在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_detection.py”,第11行,在
面=面\级联。检测多尺度(灰色,1.3,5)
cv2.error:/home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/objdetect/src/cascadetext.cpp:1595:error:(-215)!函数detectMultiScale中的空()

我试图在这里搜索答案,但我能找到的最好的答案是,我一定是以错误的方式加载了face_cascade。。。有什么帮助吗?

XML或文件丢失,或者指向它的路径不正确,或者创建捕获路径不正确

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

我运行了相同的代码。这里有两件事需要注意。 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()
我的输出如下所示:

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

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

文件路径应如下所示:

face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
r'D:\folder Name\haarcascade_frontalface_default.xml'
而不是:

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

如果您使用的是蟒蛇,则应添加蟒蛇路径

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

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

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

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

当您没有定义XML文件的完整路径时,您可能会发现此类错误。 如果您在raspberrypi 3中使用opencv3.1.0,请尝试此选项:


faceCascade=cv2.CascadeClassifier('/home/pi/opencv-3.1.0/data/haarcascades/haarcascade\u frontalface\u default.xml')
可能
faceCascade
是空的。通过键入以下命令,可以检查变量是否为空:

face_cascade.empty()
如果为空,您将获得
True
,这意味着您的文件在您提到的路径中不可用。 尝试按如下方式添加xml文件的完整路径:

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

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

注意路径中的版本号。

错误可能是由于未正确加载所需的xml文件。使用ur OS的搜索引擎搜索文件
haarcascade_frontalface_default.xml
,获取完整路径并将其作为
cv2.CascadeClassifier
的参数作为字符串如果xml文件丢失,您可以从GitHub存储库获取该文件并将其放置在与项目相同的目录中。GitHub上文件夹的链接为。只需下载名为haarcascade_frontalface_default.xml的文件。
实际上,该文件存在于您的系统中。只需转到python安装文件夹的site packages文件夹,并检查cv2/data文件夹中的文件

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

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

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

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

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

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


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

无需更改代码

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


它将解决错误(100%)

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

您可以使用内置的为您自动确定这一点。以下代码查找
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_参考资料
library来解决这个问题

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

我也有同样的问题

我不需要下载任何其他东西来解决这个问题。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')

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

face_cascade = cv2.CascadeClassifier('./model/haarcascade_frontalface_default.xml')
我发现我需要声明完整路径来删除错误

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

您可以通过将XML放在主python文件所在的目录中来解决这个问题。现在,下一步是使用完整路径。比如说

这行不通

front_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')
使用完整路径,现在可以正常工作

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

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

在我的例子中,我在anoconda env中安装了opencv,首先直接指向anoconda的路径,然后

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

    $find-名称“haarcascade_eye.xml”
    (例如,在当前目录(.)中搜索
    haarcascade_eye.xml
    文件)

  • 然后使用返回路径:


eye\u cascade=cv2.CascadeClassifier(path+'haarcascade\u eye.xml')
我在其他答案中找到了这一点,但当我添加这两个答案时,这一点最终对我有效

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)

您只需添加
haarcascade\u frontalface\u default.xml的正确路径
文件,即您只需