基于openc的考勤系统代码
时间: 2023-08-30 17:12:35 浏览: 37
以下是一个基于 OpenCV 的简单考勤系统的 Python 代码示例,仅供参考:
```python
import cv2
import numpy as np
import os
# 加载人脸识别模型和标签
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
labels = {"person_name": 1}
with open("labels.pickle", 'rb') as f:
labels = pickle.load(f)
labels = {v:k for k,v in labels.items()}
# 初始化摄像头
cap = cv2.VideoCapture(0)
cap.set(3, 640) # 设置摄像头宽度
cap.set(4, 480) # 设置摄像头高度
# 初始化计数器和记录
font = cv2.FONT_HERSHEY_SIMPLEX
count = 0
attendance = {}
# 读取考勤名单
with open('attendance_list.txt', 'r') as f:
for line in f:
attendance[line.strip()] = False
while True:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
id_, confidence = recognizer.predict(gray[y:y+h,x:x+w])
# 如果匹配度大于50,认为是已知人员,否则是未知人员
if confidence < 50:
name = labels[id_]
if attendance.get(name) is not None and not attendance[name]:
attendance[name] = True
count += 1
else:
name = "unknown"
cv2.putText(img, name, (x+5,y-5), font, 1, (255,255,255), 2)
# 显示当前签到人数和考勤情况
cv2.putText(img, "Count: {}".format(count), (10,20), font, 0.6, (0,255,0), 2)
for i, name in enumerate(attendance.keys()):
color = (0,255,0) if attendance[name] else (0,0,255)
cv2.putText(img, "{}: {}".format(name, "Present" if attendance[name] else "Absent"), (10,50+i*20), font, 0.6, color, 2)
cv2.imshow('Attendance System',img)
k = cv2.waitKey(30) & 0xff
if k == 27: # 按下 ESC 键退出程序
break
# 保存考勤记录
with open('attendance_record.txt', 'w') as f:
for name, present in attendance.items():
f.write("{}: {}\n".format(name, "Present" if present else "Absent"))
cap.release()
cv2.destroyAllWindows()
```
该代码使用 OpenCV 进行人脸识别,并根据考勤名单记录签到情况。在代码中,我们首先加载人脸识别模型和标签,然后初始化摄像头和计数器。接着,我们读取考勤名单,对于每个检测到的人脸,我们使用人脸识别模型进行识别,并根据匹配度判断该人脸是否是已知人员。如果是已知人员且尚未签到,则将其标记为已签到。最后,我们根据签到情况显示当前签到人数和考勤情况,并保存考勤记录。