python_openCV例程遇到empty() in function cv::CascadeClassifier::detectMultiScale的解决方法

python_openCV例程遇到error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale的解决方法

转载自我的简书https://www.jianshu.com/p/11aaef259c97

但好像被河蟹了2333

在使用python下的openCV运行一个最简单的人脸识别例程时遇到一个很头疼的小问题

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键有点不灵了,多检查路径名和文件名!!!多检查路径名和文件名!!!多检查路径名和文件名!!!

附一张程序正常运行后大佬的照片
python_openCV例程遇到empty() in function cv::CascadeClassifier::detectMultiScale的解决方法_第1张图片
怎么识别鼻子给识别成眼睛了。。。233333
你们啊。。。还是要多提高姿势水平!!!

你可能感兴趣的:(毕设问题,学习)