700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【优秀毕设】基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发 可基于树

【优秀毕设】基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发 可基于树

时间:2023-11-26 23:32:37

相关推荐

【优秀毕设】基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发 可基于树

【优秀毕设】基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发、可基于树莓派)

该系统利用Harr级联检测和LPBH进行人脸检测和训练、识别

利用Tkinter完成界面搭建

利用Flask+HTML完成网络实时图像推流及控制

利用captcha.image 完成验证码功能

利用xlsxwriter将数据保存为Excel文档

利用email库发送邮件

功能如下图所示 所有功能均可实现

部分资源:

/download/weixin_53403301/85545163

基础完整资源:

/download/weixin_53403301/85744946

部分代码:

# -*- coding: utf-8 -*-"""Created on Mon May 31 23:39:19 @author: ZHOU"""# -*- coding: utf-8 -*-import tkinter as tk # 调用窗口tkfrom tkinter import ttkfrom tkinter.filedialog import askopenfilenameimport tkinter.messageboxfrom PIL import Image, ImageTk, ImageDraw, ImageFont # 调用图像处理库pillowimport cv2 # 调用OpenCV图像处理库import threading # 调用threading多线程运行库import time # 调用系统时间戳库import os # 调用os多操作系统接口库import reimport numpy as npfrom captcha.image import ImageCaptchaimport random import string import xlsxwriterimport smtplibimport email.mime.multipartimport email.mime.textfrom email.mime.application import MIMEApplicationfrom flask import Flask,render_template, request, Responseimport socketglobal network_flagnetwork_flag = 0local_post = 1212local_ip = Nonefor i in range(12):try:s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.connect(("8.8.8.8",80))local_ip = str(s.getsockname()[0])s.close()print("Network Enable")network_flag = 1breakexcept: print("Network Error...")network_flag = 0time.sleep(5)app = Flask(__name__)star_pic_path = "./star.png"pic_path = "./dataset"train_path = "./trainer"data_path = "./data"train_nb_path = "/train_nb.txt"train_time_path = "/train_time.txt"name_id_path = "/name_id.txt"email_set_path = "/email_set.txt"admin_path = "/admin.txt"yml_path = "/trainer.yml"temp_path = "./temp"save_path = "./save"date_path = "/date.txt"sign_in_mode_path = "/sign_in_mode.txt"company_path = "/company.txt"department_path = "/department.txt"class_id_path = "/class_id.txt"global today_temp_pathnow_today = time.time()today_temp_path = "/today_"+str(time.localtime(now_today).tm_year)+"_"+str(time.localtime(now_today).tm_mon)+"_"+str(time.localtime(now_today).tm_mday)+".txt"cascadePath = "./cascade/haarcascade_frontalface_alt2.xml"faceCascade = cv2.CascadeClassifier(cascadePath)font = cv2.FONT_HERSHEY_SIMPLEXrecognizer = cv2.face.LBPHFaceRecognizer_create() try:recognizer.read(train_path+yml_path)except:print("缺失训练数据文件,请先训练数据")cam_flag = 0global img2img2 = Noneglobal img_flagimg_flag = 0global login_flaglogin_flag = 0global doing_change_record_date_flagdoing_change_record_date_flag = 0global auto_send_flagauto_send_flag = 0

# -*- coding: utf-8 -*-"""Created on Mon Apr 25 23:25:45 @author: 16016"""import xlsxwriterimport timedef txt_excel(filename):fp = open(filename,encoding="utf-8")x = 0y = 0lines = fp.readlines()today_list = (lines[0].split("\n")[0]).split("-")xls = xlsxwriter.Workbook('record_' + today_list[0]+"_"+today_list[1]+"_"+today_list[2] + '.xlsx')sheet = xls.add_worksheet('record_' + today_list[0]+"_"+today_list[1]+"_"+today_list[2]) sheet.write(0,0,"姓名")for j in lines:for i in range(1,len(j.split('|'))):item = j.split('|')[i].strip(' ')sheet.write(x,y,item)y += 1 # 另起一列x += 1 # 另起一行y = 0 # 初始成第一列 fp.close()xls.close()filename = './temp/today__4_25.txt'xlsname = './save/学生签到表'txt_excel(filename)

<html><meta http-equiv="refresh" content="60"> <head><title>人脸识别签到管理系统</title></head> <body><h1>人脸识别签到管理系统</h1><form action="/" method="post"><p><input type="submit" style="font-size:50px" name="send" value="发送数据"> <input type="submit" style="font-size:50px" name="maul" value="刷新网页"></p><p><table>{% for k,v in data_dict.items() %}<tr><td>{{k}}</td><td>{{v[0]}}</td><td>{{v[1]}}</td><td>{{v[2]}}</td><td>{{v[3]}}</td><td>{{v[4]}}</td></tr>{% endfor %}</table></p><p><input type="submit" style="font-size:50px" name="update" value="更新记录日期"> <input type="submit" style="font-size:50px" name="back" value="回退记录日期"></p> </form> <img src="{{ url_for('video_feed') }}" height="520" style="float:left"></body></html>

# -*- coding: utf-8 -*-"""Created on Tue Apr 26 15:16:42 @author: 16016"""#!/usr/bin/python# -*- coding: UTF-8 -*-import smtplibimport email.mime.multipartimport email.mime.textfrom email.mime.application import MIMEApplicationdef send_email(file_path,smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject='', content=''):''':param smtp_host: 域名:param smtp_port: 端口:param sendAddr: 发送邮箱:param password: 邮箱密码:param recipientAddrs: 发送地址:param subject: 标题:param content: 内容:return: 无'''msg = email.mime.multipart.MIMEMultipart()msg['from'] = sendAddrmsg['to'] = recipientAddrsmsg['subject'] = subjectcontent = contenttxt = email.mime.text.MIMEText(content, 'plain', 'utf-8')msg.attach(txt)if file_path != '':# 添加附件地址part = MIMEApplication(open(file_path, 'rb').read())part.add_header('Content-Disposition', 'attachment', filename="name_id.xlsx") # 发送文件名称msg.attach(part)try:smtpSSLClient = smtplib.SMTP_SSL(smtp_host, smtp_port) # 实例化一个SMTP_SSL对象loginRes = smtpSSLClient.login(sendAddr, password) # 登录smtp服务器print(f"登录结果:loginRes = {loginRes}") # loginRes = (235, b'Authentication successful')if loginRes and loginRes[0] == 235:print(f"登录成功,code = {loginRes[0]}")smtpSSLClient.sendmail(sendAddr, recipientAddrs, str(msg))print(f"mail has been send successfully. message:{str(msg)}")smtpSSLClient.quit()else:print(f"登陆失败,code = {loginRes[0]}")except Exception as e:print(f"发送失败,Exception: e={e}")try:subject = 'Python 测试邮件'content = '这是一封来自 Python 编写的测试邮件。'send_email('','', 465, '', '', '', subject, content)except Exception as err:print(err)

主页面

验证码:

识别效果

管理页面:

数据保存除了用户信息和签到信息外 还可以判断是否迟到、早退并计算工作时长

人脸信息采集

管理:

实时数据更新:

签到结果:

邮件发送:

网络前端效果:

实时图像推流:

py打包

Pyinstaller打包exe(包括打包资源文件 绝不出错版)

依赖包及其对应的版本号

PyQt5 5.10.1

PyQt5-Qt5 5.15.2

PyQt5-sip 12.9.0

pyinstaller 4.5.1

pyinstaller-hooks-contrib .3

Pyinstaller -F setup.py 打包exe

Pyinstaller -F -w setup.py 不带控制台的打包

Pyinstaller -F -i xx.ico setup.py 打包指定exe图标打包

打包exe参数说明:

-F:打包后只生成单个exe格式文件;

-D:默认选项,创建一个目录,包含exe文件以及大量依赖文件;

-c:默认选项,使用控制台(就是类似cmd的黑框);

-w:不使用控制台;

-p:添加搜索路径,让其找到对应的库;

-i:改变生成程序的icon图标。

如果要打包资源文件

则需要对代码中的路径进行转换处理

另外要注意的是 如果要打包资源文件 则py程序里面的路径要从./xxx/yy换成xxx/yy 并且进行路径转换

但如果不打包资源文件的话 最好路径还是用作./xxx/yy 并且不进行路径转换

def get_resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)

而后再spec文件中的datas部分加入目录

如:

a = Analysis(['cxk.py'],pathex=['D:\\Python Test\\cxk'],binaries=[],datas=[('root','root')],hiddenimports=[],hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)

而后直接Pyinstaller -F setup.spec即可

如果打包的文件过大则更改spec文件中的excludes 把不需要的库写进去(但是已经在环境中安装了的)就行

这些不要了的库在上一次编译时的shell里面输出

比如:

然后用pyinstaller --clean -F 某某.spec

【优秀毕设】基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发 可基于树莓派)

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