使用OpenCV绘制人脸与人体检测框时出现'faces'未定义错误
OpenCV人脸/人体检测框绘制:NameError错误修复
问题重现
运行人脸和人体检测框绘制代码时触发NameError,代码如下:
while True: _, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) bodies = body_cascade.detectMultiScale(gray, 1.3, 5) # draws box on faces for (x, y, width, height) in faces: cv2.rectangle(frame, (x, y), (x + width, y + height), (255, 0, 0,), 3) for (x, y, width, height) in bodies: cv2.rectangle(frame, (x, y), (x + width, y + height), (255, 0, 0,), 3)
报错内容:
for (x, y, width, height) in faces:
NameError: name 'faces' is not defined
错误原因
出现该错误的核心是:执行到for循环时,faces变量并未被成功定义。常见诱因包括:
- 级联分类器未加载:缺失
face_cascade = cv2.CascadeClassifier(...)代码,或分类器文件路径错误,导致detectMultiScale执行失败 - 帧读取失败:
cap.read()未成功获取视频帧,frame为空,后续cv2.cvtColor报错,中断了faces变量的赋值流程
修复步骤
1. 正确加载级联分类器
在代码开头添加分类器加载逻辑,使用OpenCV自带的预训练模型:
# 加载人脸与人体检测的级联分类器 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') body_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_fullbody.xml')
cv2.data.haarcascades会直接指向OpenCV安装目录下的haarcascades文件夹,无需手动填写路径。
2. 添加帧有效性判断
在处理帧前检查读取状态,避免空帧导致后续代码报错:
while True: ret, frame = cap.read() # 帧读取失败时退出循环 if not ret: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) bodies = body_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, width, height) in faces: cv2.rectangle(frame, (x, y), (x + width, y + height), (255, 0, 0), 3) for (x, y, width, height) in bodies: cv2.rectangle(frame, (x, y), (x + width, y + height), (255, 0, 0), 3)
3. 修正语法小问题
原代码中颜色参数(255, 0, 0,)多了一个冗余逗号,建议修正为(255, 0, 0),避免潜在语法问题。
内容的提问来源于stack exchange,提问作者Toshiro Nakamoto
相关产品推荐
相关产品推荐

