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

基于PyQt5的人脸识别考勤系统打卡异常及摄像头卡顿问题求助

问题分析与解决方案

一、考勤记录重复/无法二次记录问题

你的核心问题出在mark_attendance函数的去重逻辑上,具体错误点:

  1. 判断逻辑完全错误:你把CSV里的所有人员ID存入self.already_in_file集合,但判断是否写入的条件却是date_time_string not in self.already_in_file——时间字符串和ID集合完全不相关,这个条件几乎永远成立,初始运行时自然会重复写入;如果是你误把判断逻辑写成ID not in self.already_in_file,那会导致只要ID曾经出现在CSV中,哪怕隔了几天也无法再次记录,这就是重启后无法考勤的原因。

  2. 重复读取文件效率低下:每次调用考勤函数都重新读取整个CSV文件并初始化集合,既浪费IO资源,也不符合“当日/时段内去重”的常规考勤需求。

修复方案(以「同一ID每日仅记录一次」为例)

修改mark_attendance函数,改为检查该ID当日是否已有记录:

def mark_attendance(ID):
    """记录考勤"""
    now = datetime.datetime.now()
    today = now.strftime("%y/%m/%d")
    date_time_string = now.strftime("%y/%m/%d, %H:%M")
    has_today_record = False

    # 检查文件中是否存在该ID今日的记录
    try:
        with open('Attendance1.csv', "r") as f:
            for line in f:
                line = line.strip()
                if not line:
                    continue
                parts = line.split(",")
                if len(parts) >= 2:
                    existing_id = parts[0].strip()
                    existing_date = parts[1].strip().split(",")[0]
                    if existing_id == ID and existing_date == today:
                        has_today_record = True
                        break
    except FileNotFoundError:
        # 文件不存在时直接跳过检查
        pass

    # 无今日记录则写入
    if ID and not has_today_record:
        with open("Attendance1.csv", "a") as f:
            f.writelines(f'\n{ID},{date_time_string}')

如果需要「同一ID N分钟内不重复记录」,可以修改逻辑为检查最近一次记录的时间差,这里不再展开。

二、摄像头卡顿问题

卡顿可能是代码优化不足或硬件性能限制导致,可按以下步骤排查:

代码层面优化点

  • 降低摄像头分辨率:过高的分辨率会大幅增加每帧的计算量,添加以下代码设置摄像头参数:
    import cv2
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
    
  • 帧跳过处理:无需每帧都执行人脸识别,比如每2-3帧处理一次,减少计算压力:
    frame_count = 0
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        frame_count += 1
        # 每2帧处理一次人脸识别
        if frame_count % 2 == 0:
            self.face_rec_(frame, encode_list_known, class_names)
        # 显示帧等操作
        cv2.imshow('Attendance', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
  • 减少IO操作:避免每次考勤都读取整个CSV文件,可在类初始化时读取已有的考勤记录并缓存,后续仅更新缓存即可。

硬件性能排查

打开任务管理器查看CPU/内存占用:

  • 如果CPU占用接近100%,说明人脸识别的计算量超出当前硬件能力,可考虑更换更轻量的人脸检测模型(比如用OpenCV的Haar级联代替dlib的HOG,或使用TensorFlow Lite的轻量化模型)。
  • 如果内存占用过高,检查是否有内存泄漏(比如未及时释放帧资源)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:45:16