失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Python+OpenCV 轻松实现人脸识别签到考勤系统

Python+OpenCV 轻松实现人脸识别签到考勤系统

时间:2020-10-28 05:53:20

相关推荐

Python+OpenCV 轻松实现人脸识别签到考勤系统

大家好,今天本文给大家利用Python+OpenCV 人脸识别签到考勤系统。

系统实现功能:

1.人员人脸识别并完成签到/签退2.考勤时间计算3.保存考勤数据为CSV格式

本系统2D人脸识别,节约了繁琐的人脸识别训练部分,简洁快捷,喜欢本文记得收藏、点赞、关注。

注:完整版代码、资料、技术交流文末获取。

项目效果图

系统初始化登陆界面

主界面展示图:

签到功能展示

签退功能展示

后台签到数据记录

是否签到/退判断

项目需要的环境

核心环境:

OpenCV-Python 4.5.5.64

face_recognition 1.30

face_recognition_model 0.3.0

dlib 19.23.1

UI窗体界面:

PyQt5 5.15.4

pyqt5-plugins 5.15.4.2.2

PyQt5-Qt5 5.15.2

PyQt5-sip 12.10.1

pyqt5-tools 5.15.4.3.2

编译器

Pycham .1.3

Python版本 3.9.12

Anaconda

辅助开发QT-designer

项目配置

代码部分

核心代码

MainWindow.py

UI文件加载:

class Ui_Dialog(QDialog):def __init__(self):super(Ui_Dialog, self).__init__()loadUi("mainwindow.ui", self) self.runButton.clicked.connect(self.runSlot)self._new_window = Noneself.Videocapture_ = None

摄像头调用:

def refreshAll(self):print("当前调用人俩检测摄像头编号(0为笔记本内置摄像头,1为USB外置摄像头):")self.Videocapture_ = "0"

OutWindow.py

获取当前系统时间

class Ui_OutputDialog(QDialog):def __init__(self):super(Ui_OutputDialog, self).__init__()loadUi("./outputwindow.ui", self) now = QDate.currentDate()current_date = now.toString('ddd dd MMMM yyyy') current_time = datetime.datetime.now().strftime("%I:%M %p")self.Date_Label.setText(current_date)self.Time_Label.setText(current_time)self.image = None

签到时间计算

def ElapseList(self,name):with open('Attendance.csv', "r") as csv_file:csv_reader = csv.reader(csv_file, delimiter=',')line_count = 2Time1 = datetime.datetime.now()Time2 = datetime.datetime.now()for row in csv_reader:for field in row:if field in row:if field == 'Clock In':if row[0] == name:Time1 = (datetime.datetime.strptime(row[1], '%y/%m/%d %H:%M:%S'))self.TimeList1.append(Time1)if field == 'Clock Out':if row[0] == name:Time2 = (datetime.datetime.strptime(row[1], '%y/%m/%d %H:%M:%S'))self.TimeList2.append(Time2)

人脸识别部分

faces_cur_frame = face_recognition.face_locations(frame)encodes_cur_frame = face_recognition.face_encodings(frame, faces_cur_frame)for encodeFace, faceLoc in zip(encodes_cur_frame, faces_cur_frame):match = pare_faces(encode_list_known, encodeFace, tolerance=0.50)face_dis = face_recognition.face_distance(encode_list_known, encodeFace)name = "unknown" best_match_index = np.argmin(face_dis)if match[best_match_index]:name = class_names[best_match_index].upper()y1, x2, y2, x1 = faceLoccv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.rectangle(frame, (x1, y2 - 20), (x2, y2), (0, 255, 0), cv2.FILLED)cv2.putText(frame, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 255), 1)mark_attendance(name)return frame

签到数据保存与判断

def mark_attendance(name):""":param name: 人脸识别部分:return:"""if self.ClockInButton.isChecked():self.ClockInButton.setEnabled(False)with open('Attendance.csv', 'a') as f:if (name != 'unknown'): buttonReply = QMessageBox.question(self, '欢迎 ' + name, '开始签到' ,QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if buttonReply == QMessageBox.Yes:date_time_string = datetime.datetime.now().strftime("%y/%m/%d %H:%M:%S")f.writelines(f'\n{name},{date_time_string},Clock In')self.ClockInButton.setChecked(False)self.NameLabel.setText(name)self.StatusLabel.setText('签到')self.HoursLabel.setText('开始签到计时中')self.MinLabel.setText('')self.Time1 = datetime.datetime.now()self.ClockInButton.setEnabled(True)else:print('签到操作失败')self.ClockInButton.setEnabled(True)elif self.ClockOutButton.isChecked():self.ClockOutButton.setEnabled(False)with open('Attendance.csv', 'a') as f:if (name != 'unknown'):buttonReply = QMessageBox.question(self, '嗨呀 ' + name, '确认签退?',QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if buttonReply == QMessageBox.Yes:date_time_string = datetime.datetime.now().strftime("%y/%m/%d %H:%M:%S")f.writelines(f'\n{name},{date_time_string},Clock Out')self.ClockOutButton.setChecked(False)self.NameLabel.setText(name)self.StatusLabel.setText('签退')self.Time2 = datetime.datetime.now()self.ElapseList(name)self.TimeList2.append(datetime.datetime.now())CheckInTime = self.TimeList1[-1]CheckOutTime = self.TimeList2[-1]self.ElapseHours = (CheckOutTime - CheckInTime)self.MinLabel.setText("{:.0f}".format(abs(self.ElapseHours.total_seconds() / 60)%60) + 'm')self.HoursLabel.setText("{:.0f}".format(abs(self.ElapseHours.total_seconds() / 60**2)) + 'h')self.ClockOutButton.setEnabled(True)else:print('签退操作失败')self.ClockOutButton.setEnabled(True)

项目目录结构

正式版改进

1.加入TensorFlow深度学习,提高系统人脸识别安全性与准确性

2.加入MySQL数据库,对签到数据进行更安全保护,不易被修改

3.美化优化UI设计

项目

/BIGBOSS-dedsec/Python-Face-recognition-Attendance

推荐文章

李宏毅《机器学习》国语课程()来了

有人把吴恩达老师的机器学习和深度学习做成了中文版

上瘾了,最近又给公司撸了一个可视化大屏(附源码)

如此优雅,4款 Python 自动数据分析神器真香啊

梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学

年终汇总:20份可视化大屏模板,直接套用真香(文末附源码)

技术交流

欢迎转载、收藏、有所收获点赞支持一下!数据、代码可以找我获取

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

方式①、发送如下图片至微信,长按识别,后台回复:加群;方式②、添加微信号:dkl88191,备注:来自CSDN方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

如果觉得《Python+OpenCV 轻松实现人脸识别签到考勤系统》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。