OpenCV人脸识别采样代码运行detectMultiScale错误如何解决
错误原因
该报错的核心是CascadeClassifier级联分类器对象为空,触发了OpenCV源码中的!empty()断言校验,说明你写的分类器文件路径有误,没有成功加载到人脸检测模型文件。
解决步骤
- 修正分类器加载路径
无需手动下载分类器文件,直接调用OpenCV内置的分类器资源路径即可,将原有分类器加载代码替换为:detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') - 增加加载校验逻辑
加载分类器后增加校验代码,提前发现加载失败的问题,避免运行到检测步骤才报错:if detector.empty(): raise IOError("人脸分类器加载失败,请检查OpenCV安装是否完整") - 补充其他前置校验(规避后续潜在报错)
- 代码中写入样本的
samples文件夹如果不存在,会触发文件写入报错,提前创建文件夹:
import os if not os.path.exists("samples"): os.mkdir("samples")- 增加摄像头读取校验,避免摄像头占用/损坏时的程序崩溃:
ret, img = cam.read() if not ret: print("摄像头读取失败,程序退出") break - 代码中写入样本的
修正后完整代码
import cv2 import os # 提前创建样本保存目录 if not os.path.exists("samples"): os.mkdir("samples") cam = cv2.VideoCapture(0, cv2.CAP_DSHOW) cam.set(3, 640) cam.set(4, 480) # 加载OpenCV内置人脸分类器 detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # 校验分类器是否加载成功 if detector.empty(): raise IOError("人脸分类器加载失败,请检查OpenCV安装状态") face_id = input("请输入数字类型的用户ID: ") print("正在采集样本,请看向摄像头....... ") count = 0 while True: ret, img = cam.read() # 校验摄像头读取是否正常 if not ret: print("摄像头读取异常,程序终止") break converted_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = detector.detectMultiScale(converted_image, 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 cv2.imwrite("samples/face." + str(face_id) + '.' + str(count) + ".jpg", converted_image[y:y+h,x:x+w]) cv2.imshow('image', img) k = cv2.waitKey(100) & 0xff # 按ESC键提前退出 if k == 27: break elif count >= 10: break print("样本采集完成,正在关闭程序....") cam.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Frostfire246
相关产品推荐
相关产品推荐

