人脸识别调级联器报错: !empty() in function‘cv::CascadeClassifier::detectMultiScale‘

在写人脸识别时,调用了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'

以为是路径的问题,用win+r,输入cmd,输入指令pip show opencv-python,查找路径是否正确

发现路径没有问题:

查资料发现是路径中不能有中文,只能重下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

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

调整一下图片大小

img = cv2.resize(img,dsize=(700,650))

发现框的太大了,对比一下发现是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,即人脸的左上角和高度,宽度

修正后运行:

小白刚起步,如有不正确的地方希望各位大佬多多指教,感谢!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值