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

Python OpenCV实时疲劳检测程序报'NoneType'无shape属性错误求解

错误原因
  • 核心错误来源于缩进逻辑错误:代码中cv2.destroyAllWindows()和cap.release()两个资源释放方法错误缩进在while True循环内部,程序第一次执行完循环逻辑就会直接释放摄像头资源,第二次循环调用cap.read()无法读取到有效画面,返回的frame为None,后续调用imutils.resize尝试访问None.shape属性就触发了本次报错。
  • 缺少帧读取有效性校验:代码没有判断cap.read()返回的第一个参数ret的布尔状态,直接操作frame变量,当摄像头被占用、读取异常、设备断开时都可能出现同类报错。
  • 代码还存在隐含边界问题:若当前画面中没有检测到人脸,subjects为空列表,shape变量不会被初始化,后续调用face_utils.shape_to_np(shape)也会抛出未定义变量错误。
  • 开头的MSMF警告是Windows平台OpenCV默认使用MSMF摄像头驱动的通用提示,不影响核心功能运行。
解决方案
  1. 修正缩进错误
    将cv2.destroyAllWindows()和cap.release()移动到while循环外部,仅在按q退出循环后再执行资源释放,修正后的代码片段如下:
while True:
    # 原有循环内逻辑保持不变
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break
# 退出循环后再执行资源释放
cv2.destroyAllWindows()
cap.release()
  1. 新增帧读取有效性校验
    在读取帧之后先判断是否读取成功,读取失败直接终止程序,避免后续操作空对象:
ret, frame = cap.read()
# 新增校验逻辑
if not ret:
    print("摄像头读取失败,程序退出")
    break
frame = imutils.resize(frame, width=450)
  1. 修复人脸检测边界问题
    将人脸关键点处理、眼睛EAR计算、绘制的所有逻辑都放到人脸检测的for循环内部,避免无画面时的变量未定义错误:
subjects = detect(gray, 0)
for subject in subjects:
    shape = predict(gray, subject)
    shape = face_utils.shape_to_np(shape)
    # 原本放在for循环外的眼睛坐标提取、EAR计算、绘制、疲劳判断逻辑都移动到此处缩进
  1. (可选)消除MSMF警告
    实例化VideoCapture时指定使用DSHOW驱动,即可消除开头的警告信息:
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:24:03