OpenCV HOG级联分类器调用detectMultiScale报!empty()断言错误
报错原因
触发(-215:Assertion failed) !empty()报错的直接原因是调用detectMultiScale时,对应的分类器对象是空的,没有成功加载模型,代码里共存在3个明确问题:
- 模型用途不匹配:要实现人脸检测,却加载了
hogcascade_pedestrians.xml,这是用于行人检测的级联模型,不具备人脸检测能力 - 变量未定义:代码中调用了
eye_cascade.detectMultiScale,但全程没有定义、加载eye_cascade对象,就算人脸分类器加载正常,运行到人眼检测环节也会触发相同的空对象报错 - 模型路径无效:OpenCV 4.3.0版本的默认haarcascades目录下,本身就不附带
hogcascade_pedestrians.xml文件,拼接的文件路径不存在,直接导致分类器初始化后是空对象。
修复方案
按以下步骤调整代码即可正常运行:
- 替换为正确的人脸、人眼检测级联模型,OpenCV自带的Haar人脸模型文件名为
haarcascade_frontalface_default.xml,人眼模型文件名为haarcascade_eye.xml - 所有分类器、图片加载完成后增加空校验,第一时间发现路径错误、文件缺失问题,避免跑到检测逻辑才崩溃
- 补充通道转换逻辑:OpenCV默认以BGR通道顺序读取图片,matplotlib以RGB顺序渲染,直接显示会出现颜色错位
修复后的完整代码:
import cv2 import matplotlib.pyplot as plt # 加载对应检测模型 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_eye.xml") # 校验模型加载状态 if face_cascade.empty(): raise RuntimeError("人脸检测模型加载失败,请检查OpenCV级联文件完整性") if eye_cascade.empty(): raise RuntimeError("人眼检测模型加载失败,请检查OpenCV级联文件完整性") def detect(gray, frame): faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2) roi_gray = gray[y:y+h, x:x+w] roi_color = frame[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray, 1.1, 18) for (ex, ey, ew, eh) in eyes: cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2) return frame frame = cv2.imread('./data/images/cctv_still.JPG') # 校验图片读取状态 if frame is None: raise RuntimeError("图片读取失败,请检查输入图片路径是否正确") gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) canvas = detect(gray, frame) # 转换通道适配matplotlib显示规则 canvas = cv2.cvtColor(canvas, cv2.COLOR_BGR2RGB) plt.imshow(canvas) plt.show()
补充说明
如果你确实需要使用HOG特征做检测,不要用CascadeClassifier接口加载旧的hog级联文件。OpenCV提供了独立的HOG检测器接口cv2.HOGDescriptor(),和Haar/LBP级联检测器是两套独立实现,调用逻辑完全不同。
内容的提问来源于stack exchange,提问作者jack gell
相关产品推荐
相关产品推荐

