我正在尝试在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 ...有什么帮助吗?
缺少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')
无需更改代码
下载.xml文件,然后放入该文件的路径
它会解决错误(100%)
错误可能是由于,所需的xml文件未正确加载。使用你的操作系统的搜索引擎搜索文件haarcascade_frontalface_default.xml
获取完整路径并将其作为参数放入cv2.CascadeClassifier
作为字符串
找不到您的XML文件。尝试使用绝对路径,如:
/path/to/my/file (Mac, Linux)
C:\\path\\to\\my\\file (Windows)
由于缺少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文本文件。所以直接从给定的源下载文件。
我和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
请确保您使用的是绝对路径。否则,它将无法正常工作。
我运行了相同的代码。这里有两点需要注意。 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
缺少XML文件,您可以从GitHub存储库获取文件并将其放在与项目相同的目录中。链接到GitHub上的文件夹是here。只需下载名为haarcascade_frontalface_default.xml的文件即可。实际上,该文件存在于您的系统上。只需转到python安装文件夹的site-packages文件夹,然后检查文件的cv2 / data文件夹
使用整个文件路径并在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')
在使用自制软件安装的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')
请注意路径中的版本号。
可能face_cascade
是空的。您可以通过键入以下命令来检查变量是否为空:
face_cascade.empty()
如果它是空的,你会得到True
,这意味着你提到的路径中没有你的文件。尝试添加xml文件的完整路径,如下所示:
r'D:\folder Name\haarcascade_frontalface_default.xml'
“\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \”我在此路径中找到了Anaconda的xml文件
如果未定义XML文件的完整路径,则可能会发现此类错误。如果你在raspberrypi 3中使用opencv3.1.0,试试这个:“faceCascade = cv2.CascadeClassifier('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml')”