在写人脸识别时,调用了opencv中的CascadeClassifier级联分类器,报错
完整代码:
import cv2
def face_test():
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_detect = cv2.CascadeClassifier('E:/python软件/Python/Lib/site-packages/cv2/data/haarcascade_frontalface_alt.xml')
face = face_detect.detectMultiScale(gray_img)
for x, y, w, h in face:
cv2.rectangle(img,(x, y, x+w, y+h),color=(0,0,255),thickness = 1)
cv2.imshow("result", img)
img = cv2.imread("1.jpg")
face_test()
while True:
if ord("q")==cv2.waitKey(0):
break
cv2.destroyAllWindows()
错误在这
#实例化级联分类器
face_detect = cv2.CascadeClassifier('E:/python软件/Python/Lib/site-packages/cv2/data/haarcascade_frontalface_alt.xml')
报错:
E:\python软件\Python\python.exe E:/python/学习代码/人脸识别尝试first/人脸识别.py
Traceback (most recent call last):
File "E:/python/学习代码/人脸识别尝试first/人脸识别.py", line 16, in <module>
face_test()
File "E:/python/学习代码/人脸识别尝试first/人脸识别.py", line 7, in face_test
face = face_detect.detectMultiScale(gray_img)
cv2.error: OpenCV(4.5.4) D:\a\opencv-python\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'
![](https://i-blog.csdnimg.cn/blog_migrate/da01ade4fb04f6d9c142e0463226e0fd.png)
以为是路径的问题,用win+r,输入cmd,输入指令pip show opencv-python,查找路径是否正确
![](https://i-blog.csdnimg.cn/blog_migrate/c3a7d34259bdffc40c5a68aab7a6ff78.png)
发现路径没有问题:
![](https://i-blog.csdnimg.cn/blog_migrate/bea2653bb14a509e229a28b588df67be.png)
查资料发现是路径中不能有中文,只能重下opencv,放在全英路径下。opencv下载链接:https://opencv.org/releases/
(这个下的也太慢了。。不知道是因为什么,直接百度找了一个压缩包下了)
更改路径后不报错
face_detect = cv2.CascadeClassifier('E:\python\opencv2\OpenCV\sdk\etc\haarcascades\haarcascade_frontalface_alt2.xml')
后来尝试了一下将原来下载的cv2文件夹复制到新下载的opencv文件夹下,再调用原来下载的cv2文件夹的级联器,也不报错。然后又尝试了一下将原来的cv2文件夹直接复制到一个新文件夹下,居然也可以,不报错。所以我是白下了一次吗www
![](https://i-blog.csdnimg.cn/blog_migrate/76cba19f391b5ae28f1bf6c04b1220a2.png)
import cv2
#'E:\python\opencv2\OpenCV\sdk\etc\haarcascades\haarcascade_frontalface_alt2.xml'
def face_test():
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_detect = cv2.CascadeClassifier("E:\\test\cv2\data\haarcascade_frontalface_alt2.xml")
face = face_detect.detectMultiScale(gray_img)
for x, y, w, h in face:
cv2.rectangle(img,(x, y, x+w, y+h),color=(0,0,255),thickness = 1)
cv2.imshow("result", img)
img = cv2.imread("1.jpg")
face_test()
while True:
if ord("q")==cv2.waitKey(0):
break
cv2.destroyAllWindows()
![](https://i-blog.csdnimg.cn/blog_migrate/62a168dcb73f5bf4e0b1df112db2e64a.png)
调整一下图片大小
img = cv2.resize(img,dsize=(700,650))
![](https://i-blog.csdnimg.cn/blog_migrate/88e34244eb250218ab16a968a3a8cf60.png)
发现框的太大了,对比一下发现是cv2.rectangle的问题
cv2.rectangle(img,(x, y, x+w, y+h),color=(0,0,255),thickness = 1)
#这里应改为(x, y), (x+w, y+h)
#因为(x,y,x+w,y+h)代表起始坐标(x,y),绘制矩形的长为x+w,宽为y+h
#而(x, y), (x+w, y+h)代表(x_min,x_max)(x_max, y_max)坐标,为绘制的边框的左上角和右下角
face = face_detect.detectMultiScale(gray_img)
#注意这里返回坐标x,y,w,h,即人脸的左上角和高度,宽度
修正后运行:
![](https://i-blog.csdnimg.cn/blog_migrate/dfecfbee3fa63c6f4f48d1f27553b270.png)
小白刚起步,如有不正确的地方希望各位大佬多多指教,感谢!