使用HaarCascades人脸检测触发(-215)断言失败错误的求助
HaarCascades人脸检测Assertion错误修复方案
触发的错误信息
error: OpenCV(4.8.0) /io/opencv/modules/objdetect/src/cascadedetect.cpp:1389: error: (-215:Assertion failed) scaleFactor > 1 && _image.depth() == CV_8U in function 'detectMultiScale'
错误原因分析
- scaleFactor违反要求:代码里的while循环会持续把scale从1.3递减0.1,直到scale变为0.0。但
detectMultiScale要求scaleFactor必须严格大于1,当scale降到1或以下时,就会触发断言错误。 - 图像深度不匹配:输入的
img可能不是8位无符号整数格式(CV_8U),比如是16位或浮点格式,而detectMultiScale仅支持CV_8U格式的图像。
修复后的代码
import cv2 import os import numpy as np def face_detector(img): # 强制转换图像为CV_8U格式,解决深度不匹配问题 if img.dtype != np.uint8: img = cv2.convertScaleAbs(img) color_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) face_classifier = cv2.CascadeClassifier(os.path.join(cv2.data.haarcascades, 'haarcascade_frontalface_default.xml')) scale = 1.3 min_scale = 1.01 # 限制scale最小值,确保始终大于1 step = 0.1 faces = face_classifier.detectMultiScale(color_img, scale, 5) if len(faces) == 0: # 循环递减scale,但不低于最小值 while scale > min_scale: scale -= step faces = face_classifier.detectMultiScale(color_img, scale, 5) if len(faces) != 0: break if len(faces) != 0: x, y, w, h = faces[0] # 取第一个检测到的人脸 cv2.rectangle(color_img, (x, y), (x+w, y+h), (0, 255, 255), 2) roi = color_img[y:y+h, x:x+w] cv2_imshow(color_img) cv2_imshow(roi) return color_img, roi # 未检测到人脸的情况 cv2_imshow(color_img) return color_img, None
关键修改点
- 增加图像格式检查,通过
cv2.convertScaleAbs将非CV_8U格式的图像转换为符合要求的格式。 - 给scale设置最小值
1.01,确保循环中调用detectMultiScale时scaleFactor始终大于1。 - 优化循环逻辑,找到人脸后立即跳出循环,避免无效迭代;同时统一处理检测到人脸的分支,减少冗余代码。
内容的提问来源于stack exchange,提问作者Milena Smołka
相关产品推荐
相关产品推荐

