You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行OpenCV人脸检测结果展示代码时出现NameError: name 'left' is not defined报错求助

解决NameError: name 'left' is not defined的问题

这个错误看起来有点费解——毕竟你明明在循环里定义了left变量对吧?别着急,大概率是下面这几个常见问题导致的:

1. 缩进搞错了:绘制代码跑到循环外面去了

你贴出来的代码里,绘制矩形和文字的代码都是缩进在for循环块里的,但如果实际写代码时,你不小心把这些代码的缩进弄没了(比如和for循环对齐,而不是嵌套在里面),那left变量就只在循环的每一次迭代里存在,循环外面的代码自然找不到它,就会报这个错。

举个错误缩进的例子:

# Display the results
for (top, right, bottom, left),name in zip(face_locations, face_names):
    top *= 4
    right *= 4
    bottom *= 4
    left *= 4
# 这里缩进错了!这些代码不在循环里
cv2.rectangle(frame, (left, top), (right, bottom), 2)
cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
# ... 其他代码

解决办法:仔细检查所有绘制代码的缩进,确保它们和top *= 4这些行保持相同的缩进级别,都嵌套在for循环内部。

2. face_locations里的元素格式不对

如果face_locations列表中的某个元素不是包含4个值的元组(比如只有3个值),那在解构赋值的时候会出问题,但通常这种情况会报ValueError,不过也不排除某些边缘情况导致left没被正确定义。

解决办法:在循环之前加一段检查代码,确认每个人脸位置的格式:

# 检查face_locations的格式是否正确
for loc in face_locations:
    if len(loc) != 4:
        print(f"Invalid face location detected: {loc}")

3. 人脸列表为空,且绘制代码被意外执行

如果face_locations和face_names都是空列表,那for循环根本不会运行,要是你在循环外面还有一模一样的绘制代码,就会触发left未定义的错误。

解决办法:要么确保只有当两个列表都不为空时才执行绘制逻辑,要么把所有绘制代码都放到循环内部。

最后建议

先优先检查缩进问题——这是新手最容易踩的坑。如果缩进没问题,再去排查face_locations的数据源,确保每个检测到的人脸都返回了正确的4个坐标值(top, right, bottom, left)。

内容的提问来源于stack exchange,提问作者Sriharsha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:29:08