错误: (- 215) ! 在函数检测 MultiScale 中为 void()

我尝试在 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

我试图在这里寻找答案,但我能找到的最好的是,我必须加载的脸级联错误的方式... 有什么帮助吗?

296525 次浏览

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

我的输出是这样的:

ouput

使用整个文件路径并在 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")

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

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_frontalface_default.xml')

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

face_cascade.empty()

如果它是空的,你会得到 True,这意味着你的文件在你提到的路径不可用。 尝试添加 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 文件没有正确加载。搜索文件 haarcascade_frontalface_default.xml使用您的操作系统的搜索引擎获得完整的路径,并把它作为参数 cv2.CascadeClassifier作为字符串

如果缺少 XML 文件,可以从 GitHub 存储库获取该文件,并将其放在与项目相同的目录中。链接到 GitHub 上的文件夹是 给你。只要下载名为 Haarcade _ Frontalface _ default. xml的文件。 实际上,这个文件存在于您的系统中。只需转到 python 安装文件夹的 网站套件文件夹并检查 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 文本文件。所以直接从给定的源下载文件。

“ Anaconda3Lib 站点-打包 cv2数据”我在这个 Anaconda 路径中找到了 xml 文件

我在使用 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

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

不需要改密码

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

它将解决误差(100%)

此错误意味着无法找到 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)

成功了!

我也有同样的问题。

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

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

观察所的

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 文件所在的同一目录中(从您试图包含该文件的位置)来解决此问题。下一步是使用 full path。比如说

这行不通的

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

使用全路径,现在它将工作正常

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

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

在我的例子中,我在 Anoconda env 中安装了 opencv,首先直接连接到 Anoconda 的 path,然后

  • 查找 .xml文件的路径:

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

  • 然后使用返回值 path:

eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_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_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')

我也遇到过类似的问题,似乎通过修正 XML 的路径,这个错误就消失了。

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

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

我也遇到过同样的问题,我试图在 springboot 应用程序中使用 open cv,因为 xml 文件和图像都在 resources 文件夹中。 试图给出从 src开始的路径或者像 C:\a\b.xml这样的绝对路径都不起作用。

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

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


// similarly for image paths

路径需要从 /开始,例如 /file.xml