OpenCV 4.7.0中CascadeClassifier初始化报错求助
Haar级联文件加载失败:SystemError与cv2.error(-215)问题解决
当使用OpenCV 4.7.0加载haarcascade_frontalface_default.xml时出现SystemError: <class 'cv2.CascadeClassifier'> returned a result with an exception set,底层关联cv2.error: (-215:Assertion failed) buf in function 'open'错误,即便确认路径正确,也可以尝试以下几种排查和解决方法:
1. 验证文件完整性与路径有效性
- 手动打开xml文件,确认内容完整无损坏(若文件为空或乱码,说明下载过程中出现问题,需重新获取)。
- 在代码中添加路径验证代码,确认文件确实存在:
若输出import os cascade_path = '/Users/*********/workspace/Facial Recognition Project/haarcascade_frontalface_default.xml' print(os.path.exists(cascade_path))False,说明路径存在问题:- 尝试将路径改为原始字符串(前缀加
r),避免特殊字符转义问题:r'/Users/*********/workspace/Facial Recognition Project/haarcascade_frontalface_default.xml' - 检查路径中的空格或特殊字符是否被正确识别,可尝试将文件移动到无空格的目录下。
- 尝试将路径改为原始字符串(前缀加
2. 使用OpenCV自带的Haar级联文件
OpenCV安装包中自带了官方的Haar级联模型文件,直接调用可避免路径错误:
face_detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
这种方式无需手动指定绝对路径,兼容性更强。
3. 重新下载官方Haar级联文件
若当前使用的xml文件存在版本兼容问题,可重新获取官方最新的haarcascade_frontalface_default.xml文件,替换现有文件后重试。
4. 检查文件读取权限
在macOS或Linux系统中,确认当前用户对该xml文件拥有读取权限:
- 右键文件选择「显示简介」,在「共享与权限」中添加当前用户的读取权限;
- 或通过终端执行命令:
chmod +r /Users/*********/workspace/Facial Recognition Project/haarcascade_frontalface_default.xml
修改后的示例代码
import cv2 import os cam = cv2.VideoCapture(0) cam.set(3, 640) # 设置视频宽度 cam.set(4, 480) # 设置视频高度 # 调用OpenCV自带的Haar级联文件 face_detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # 输入用户ID face_id = input('\n 输入用户ID后按回车 ==> ') print("\n [提示] 初始化人脸采集,请面向摄像头等待...") count = 0 while(True): ret, img = cam.read() if not ret: print("无法读取摄像头画面") break img = cv2.flip(img, -1) # 垂直翻转视频画面 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2) count += 1 # 自动创建dataset目录(若不存在) os.makedirs("dataset", exist_ok=True) # 保存采集到的人脸图像 cv2.imwrite(f"dataset/User.{face_id}.{count}.jpg", gray[y:y+h,x:x+w]) cv2.imshow('image', img) k = cv2.waitKey(100) & 0xff # 按ESC键退出视频采集 if k == 27: break elif count >= 30: # 采集30张人脸样本后停止 break # 清理资源 print("\n [提示] 退出程序,清理资源") cam.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Sashu Ponnaganti
相关产品推荐
相关产品推荐

