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,提问作者이시우
相关产品推荐
相关产品推荐

