基于PyQt5的人脸识别考勤系统打卡异常及摄像头卡顿问题求助
问题分析与解决方案
一、考勤记录重复/无法二次记录问题
你的核心问题出在mark_attendance函数的去重逻辑上,具体错误点:
判断逻辑完全错误:你把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中,哪怕隔了几天也无法再次记录,这就是重启后无法考勤的原因。重复读取文件效率低下:每次调用考勤函数都重新读取整个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
相关产品推荐
相关产品推荐

