Python+OpenCV人脸识别签到考勤系统实现(附demo)

作者:BIGBOSSyifi 时间:2022-01-25 14:05:50 

前言

本项目为IOT实验室人员签到考勤设计,系统实现功能:
1.人员人脸识别并完成签到/签退
2.考勤时间计算
3.保存考勤数据为CSV格式(Excel表格)

PS:本系统2D人脸识别,节约了繁琐的人脸识别训练部分,简洁快捷

该项目为测试版,正式版会加入更多的功能,持续更新中…
测试版项目地址我会放到结尾

项目效果图

系统初始化登陆界面

Python+OpenCV人脸识别签到考勤系统实现(附demo)

主界面展示图:

Python+OpenCV人脸识别签到考勤系统实现(附demo)

签到功能展示

Python+OpenCV人脸识别签到考勤系统实现(附demo)

Python+OpenCV人脸识别签到考勤系统实现(附demo)

签退功能展示

Python+OpenCV人脸识别签到考勤系统实现(附demo)

后台签到数据记录

Python+OpenCV人脸识别签到考勤系统实现(附demo)

是否签到/退判断

Python+OpenCV人脸识别签到考勤系统实现(附demo)

项目需要的环境

核心环境:

  • 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 2021.1.3

Python+OpenCV人脸识别签到考勤系统实现(附demo)

Python版本 3.9.12

Python+OpenCV人脸识别签到考勤系统实现(附demo)

Anaconda

Python+OpenCV人脸识别签到考勤系统实现(附demo)

辅助开发QT-designer

Python+OpenCV人脸识别签到考勤系统实现(附demo)

Python+OpenCV人脸识别签到考勤系统实现(附demo)

项目配置

Python+OpenCV人脸识别签到考勤系统实现(附demo)

代码部分

核心代码

MainWindow.py
UI文件加载:

class Ui_Dialog(QDialog):
   def __init__(self):
       super(Ui_Dialog, self).__init__()
       loadUi("mainwindow.ui", self)       #加载QTUI文件

self.runButton.clicked.connect(self.runSlot)

self._new_window = None
       self.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)   #加载输出窗体UI

#datetime 时间模块
       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 = 2

Time1 = 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 = face_recognition.compare_faces(encode_list_known, encodeFace, tolerance=0.50)
           face_dis = face_recognition.face_distance(encode_list_known, encodeFace)
           name = "unknown"    #未知人脸识别为unknown
           best_match_index = np.argmin(face_dis)
           if match[best_match_index]:
               name = class_names[best_match_index].upper()
               y1, x2, y2, x1 = faceLoc
               cv2.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

签到数据保存与判断

# csv表格保存数据
       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)

项目目录结构

Python+OpenCV人脸识别签到考勤系统实现(附demo)

后记

因为本系统没有进行人脸训练建立模型,系统误识别率较高,安全性较低
系统优化较差,摄像头捕捉帧数较低(8-9),后台占有高,CPU利用率较高
数据保存CSV格式,安全性较低

正式版改进

1.加入TensorFlow深度学习,提高系统人脸识别安全性与准确性
2.加入MySQL数据库,对签到数据进行更安全保护,不易被修改
3.美化优化UI设计

项目下载

IOT人脸识别签到系统测试版V0.99

来源:https://blog.csdn.net/weixin_50679163/article/details/124310679

标签:Python,OpenCV,人脸识别,签到
0
投稿

猜你喜欢

  • 详解Python中list[::-1]的几种用法

    2021-10-12 23:51:40
  • python编程通过蒙特卡洛法计算定积分详解

    2022-05-31 10:45:01
  • asp如何显示一个等待或欢迎信息?

    2010-06-08 09:39:00
  • Python图像处理之图片文字识别功能(OCR)

    2023-10-29 17:38:00
  • SQL Server Alwayson创建代理作业的注意事项详解

    2024-01-19 06:03:15
  • Python单体模式的几种常见实现方法详解

    2021-02-24 04:45:51
  • 如何理解及使用Python闭包

    2021-12-22 23:50:59
  • 在python中计算ssim的方法(与Matlab结果一致)

    2023-08-19 03:33:21
  • 十分钟轻松掌握dataframe数据选择

    2021-03-03 11:11:40
  • 对tensorflow中cifar-10文档的Read操作详解

    2022-08-10 06:59:10
  • selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)

    2022-08-16 16:42:00
  • Python中docx2txt库的使用说明

    2022-03-23 18:58:46
  • django 使用全局搜索功能的实例详解

    2023-01-26 05:56:56
  • 如何安装控制器JavaScript生成插件详解

    2024-04-10 10:51:51
  • sql server 2008数据库连接字符串大全

    2024-01-18 13:42:09
  • Python在字典中查找元素的3种方式

    2023-08-07 21:33:35
  • MySql表、字段、库的字符集修改及查看方法

    2024-01-19 19:39:38
  • 用原生js做单页应用

    2024-04-16 09:51:27
  • 用XML和XSL来生成动态页面

    2008-09-04 10:35:00
  • 详解Vue中使用v-for语句抛出错误的解决方案

    2024-04-09 10:44:34
  • asp之家 网络编程 m.aspxhome.com