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

问题描述 投票:49回答:14

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

python-2.7 opencv image-recognition
14个回答
47
投票

缺少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
投票

无需更改代码

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

它会解决错误(100%)


1
投票

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


0
投票

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

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

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

0
投票

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


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

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


12
投票

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


11
投票

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


7
投票

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

7
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.