但好像被河蟹了2333
openCV官方文档给出的example
import numpy as np
import cv2 as cv
face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv.CascadeClassifier('haarcascade_eye.xml')
img = cv.imread('sachin.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv.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:
cv.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
其中,我已经事先将例子中的
- haarcascade_frontalface_default.xml
- haarcascade_eye.xml
存放在项目的根目录中了,但是还是报错,如下:
OpenCV Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale, file D:\Build\OpenCV\opencv-3.4.0\modules\objdetect\src\cascadedetect.cpp, line 1698
Traceback (most recent call last):
File "C:/opencvtest/test01", line 21, in
faces = face_cascade.detectMultiScale(gray,1.1,3)
cv2.error: D:\Build\OpenCV\opencv-3.4.0\modules\objdetect\src\cascadedetect.cpp:1698: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
主要问题就是
error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
在网上通过查阅许多类似的问题和官方代码文档,发现添加如下代码就能解决:
pathf = 'C:\\opencvtest\\haarcascade_frontalface_default.xml'
face_cascade.load(pathf)
其中path为.xml文件的绝对路径
注意:Windows下路径要\\双反斜杠,但好像/也能正常加载到?
但其实face_cascade.load()函数只是重新加载了.xml文件,并且返回值是布尔值
所以其实只要将
face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
替换成绝对路径就好了
最后代码如下:
import cv2 as cv
import numpy as np
pathj = 'C:\\opencvtest\\face04.jpg'
pathf = 'C:\\opencvtest\\haarcascade_frontalface_default.xml'
pathe = 'C:\\opencvtest\\haarcascade_eye.xml'
face_cascade = cv.CascadeClassifier(pathf)
#face_cascade.load(pathf)
eye_cascade = cv.CascadeClassifier(pathe)
#eye_cascade.load(pathe)
img = cv.imread(pathj)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,1.1,3)
#print(faces)
for(x,y,w,h) in faces:
cv.rectangle(img,(x,y),(x+w,x+h),(255,0,0),2)
face_re = img[y:y+h, x:x+h]
face_re_g=gray[y:y+h, x:x+h]
eyes = eye_cascade.detectMultiScale(face_re_g)
for(ex,ey,ew,eh) in eyes:
cv.rectangle(face_re,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
其实我一开始遇到问题的原因还有haarcascade_frontalface_default.xml里少打了个c。。。233333
坑爹的键盘,c键有点不灵了,多检查路径名和文件名!!!多检查路径名和文件名!!!多检查路径名和文件名!!!