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

VS2019运行OpenCV+Dlib眨眼检测代码报landmarks未定义NameError错误

错误原因

报错NameError: name 'landmarks' is not defined的根本原因是:当dlib的人脸检测器没有在当前帧检测到人脸时,faces = detector(gray)会返回空列表,for face in faces循环直接跳过,landmarks变量从未被定义,后续调用特征点计算函数时自然会抛出未定义错误。

修复方案

将原有代码中人脸检测后的逻辑修改为增加空判断,仅当检测到人脸时才执行后续的特征点计算、眨眼和张嘴检测逻辑,修改后的代码如下:

faces = detector(gray)                         

# 新增人脸非空判断
if not faces:
    # 无检测到人脸时可增加提示,直接跳过当前帧的计算逻辑
    cv2.putText(image, "未检测到人脸", (50, 100), font, 1, (0, 0, 255), 2)
else:
    # 直接取第一张检测到的人脸,避免多人脸场景下landmarks被反复覆盖
    face = faces[0]
    landmarks = predictor(gray, face)          
    
    mouths = get_mouth_pen_ratio( mouth_points, landmarks)
    if mouths <= 5.0: 
        count_mouth_open += 1

    left_eye_ratio = get_blinking_ratio( l_eye_points, landmarks)
    right_eye_ratio = get_blinking_ratio( r_eye_points, landmarks)

    blinking_ratio = (left_eye_ratio + right_eye_ratio) / 2

其他问题说明

你看到的terminating async callback警告是Windows系统下OpenCV调用默认摄像头驱动的常见提示,不影响功能运行,介意的话可以把创建摄像头实例的代码修改为指定驱动,即可消除警告:

capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)

内容的提问来源于stack exchange,提问作者이시우

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:24:06