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

face_recognition停止时触发KeyboardInterrupt报错问题排查

问题原因分析

该报错不属于业务逻辑错误,是手动终止程序时触发的标准中断异常,具体触发逻辑:

  • 你的代码通过while True无限循环实现实时人脸识别,循环内第73行调用的face_recognition.face_encodings()是CPU密集型操作,底层依赖dlib库完成128维人脸特征计算,单次执行有固定耗时
  • 当你通过Ctrl+C、IDE停止按钮等方式手动终止程序时,系统会向Python进程发送KeyboardInterrupt中断信号,如果信号送达时程序正好在执行人脸编码计算、尚未走完单次循环流程,解释器就会在当前执行的代码位置抛出中断,打印对应的栈追踪信息
  • 程序运行阶段功能完全正常,已经可以证明人脸识别的业务逻辑没有问题,这个报错仅会在手动强制终止时出现,不影响功能实际运行效果。
可行解决方法
  • 捕获中断信号实现优雅退出(推荐)
    将主循环逻辑包裹在异常捕获块中,拦截KeyboardInterrupt信号,完成摄像头资源释放后正常退出,不会抛出红色错误栈,参考代码:
    import cv2
    import face_recognition
    
    # 原有初始化逻辑
    cap = cv2.VideoCapture(0)
    try:
        while True:
            success, img = cap.read()
            if not success:
                break
            imgS = cv2.resize(img, (0,0), None, 0.25, 0.25)
            imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
        
            facedetectionFrame = face_recognition.face_locations(imgS)
            encodecurFrame = face_recognition.face_encodings(imgS, facedetectionFrame)
            # 原有后续人脸匹配、结果绘制、画面展示等逻辑
    except KeyboardInterrupt:
        # 拦截手动终止信号,不抛出异常栈
        pass
    finally:
        # 统一释放资源
        cap.release()
        cv2.destroyAllWindows()
    
  • 优化识别逻辑降低计算耗时
    调用face_encodings时保持num_jitters参数为默认值1,该参数控制编码时的图像重采样次数,数值越高计算耗时越长;另外可以设置隔帧检测(比如每2-3帧做一次人脸定位和编码),既能降低CPU占用,也能减少中断信号命中计算环节的概率。
  • 不推荐的临时方案:运行脚本时重定向错误输出到空设备,直接屏蔽所有错误打印,该方式会同时掩盖代码本身的真实运行报错,排查问题时很难定位故障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:39:16