人脸识别考勤脚本重复写入记录问题求助(附代码)
问题分析与解决方案
你的考勤重复写入问题主要来自两个核心问题:
markAttendance函数中,在遍历考勤记录的循环内部就执行写入判断,此时nameList还没收集完所有已存在的名字,会导致错误判断;- 主循环每捕捉到一次人脸就调用
markAttendance,没有做去重缓存,导致每帧检测都可能触发写入。
修复步骤
1. 修正markAttendance函数逻辑
先完整收集所有已存在的考勤姓名,再统一判断是否需要写入新记录:
def markAttendance(name): with open('Attendance.csv','r+') as f: myDataList = f.readlines() nameList = [] # 先遍历所有记录,收集已存在的名字 for line in myDataList: entry = line.split(',') nameList.append(entry[0]) # 全部收集完后再判断是否写入 if name not in nameList: now = datetime.now() dtString = now.strftime('%H:%M:%S') f.writelines(f'\n{name},{dtString}')
2. 主程序添加已标记缓存,避免重复调用
在主循环外定义一个集合,记录已经打过考勤的人,避免每帧检测都触发写入:
# 新增:用于记录已经打过考勤的人 marked_names = set() cap = cv2.VideoCapture(0) while True: success, img = cap.read() imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25) imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB) facesCurFrame = face_recognition.face_locations(imgS) encodesCurFrame = face_recognition.face_encodings(imgS, facesCurFrame) for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame): matches = face_recognition.compare_faces(encodeListKnown, encodeFace) faceDis = face_recognition.face_distance(encodeListKnown, encodeFace) matchIndex = np.argmin(faceDis) if matches[matchIndex]: name = classNames[matchIndex].upper() y1, x2, y2, x1 = faceLoc y1, x2, y2, x1 = y1*4, x2*4, y2*4, x1*4 cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.rectangle(img, (x1, y2-35), (x2, y2), (0, 255, 0), cv2.FILLED) cv2.putText(img, name, (x1+6, y2-6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2) # 新增:只有名字不在已标记集合里才调用考勤函数 if name not in marked_names: markAttendance(name) marked_names.add(name) cv2.imshow('Webcam', img) cv2.waitKey(1)
额外优化建议
- 如果需要支持每日重复考勤,可以在
markAttendance里同时记录日期,判断时同时检查姓名和日期; - 可以给
marked_names添加过期逻辑,比如隔1小时清空一次,避免程序长时间运行后无法重新标记。
内容的提问来源于stack exchange,提问作者Daksh Jain
相关产品推荐
相关产品推荐

