OpenCV的detectMultiScale报错,如何解决?(语言-python)

我的detectMultiScale报错,不知道是哪里的问题
这是代码


import cv2 as cv
def face_detect_demo(img):
    #将图片灰度
    gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    #加载特征数据
    face_detector = cv.CascadeClassifier('D:\\下载的软件\\OpenCV\\opencv-4.6.0-vc14_vc15\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml')
    faces = face_detector.detectMultiScale(gray)
    for x,y,w,h in faces:
        print(x,y,w,h)
        cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=2)
    #显示图片
    cv.imshow('result',img)

#加载图片
img=cv.imread('face.jpg')
#调用人脸检测方法
face_detect_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()

这个是显示的错误


OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'
  File "D:\新建文件夹\opencv人脸识别\6多个人脸识别.py", line 7, in face_detect_demo
    faces = face_detector.detectMultiScale(gray)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\新建文件夹\opencv人脸识别\6多个人脸识别.py", line 18, in <module>
    face_detect_demo(img)
cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'

根据你的报错信息,我可以明确的告诉你就是由于opencv不支持中文路径的读写

img


你这face的路径这么写的话,绝对路径里面就是有中文,图片读取失败了导致后面的问题。

另外,学编程的第一步就是不要用中文路径,英语差,你路径就算是用拼音都行(代码中不建议拼音,用拼音坑多),不然就会像现在这样,出现问题你都不知道为啥,这还是python3优化了很多的情况下,要是早期python2的时代,问题更多

在cv.CascadeClassifier( 这里加上r 即 cv.CascadeClassifier(r 防止路径被解析错。
将文件夹路径C:\Users\John\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\opencv\sources\data\haarcascades\xxxxx.xml 复制到你现在这个路径试下。
在faces = face_detector.detectMultiScale(gray)前加一句判断,检查gray是否是空。

这是一个没有指定scaleFactor参数的detectMultiScale方法,可以把scaleFactor添加到函数中,如下:

face_detector.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)

scaleFactor参数代表每次图片尺寸减小的比例,一般设置为1.2-1.3,minNeighbors代表每个目标至少被检测到的次数,一般设置为3-6次。