基于python环境的人脸签到系统[带数据库存储]
简易版人脸签到/签退系统
管理员可进行录入人脸操作,以及导出各类签到情况表;
普通学生只可人脸识别进行签到签退操作。
face_Recognizer.py
import cv2
import os
import numpy as np
from PIL import Image #pillow
import pyttsx3
import sys
import test.student_sql as connect #导入py
import test.recognizer_sql as baseConnect #导入py
import time
import jsondef makeDir(engine):flag= 0if not os.path.exists("face_trainer"):print("创建预训练环境")engine.say('检测到第一次启动,未检测到环境,正在创建环境')engine.say('正在创建预训练环境')os.mkdir("face_trainer")engine.say('创建成功')engine.runAndWait()flag=1if not os.path.exists("Facedata"):print("创建训练环境")engine.say('正在创建训练环境')os.mkdir("Facedata")engine.say('创建成功')engine.runAndWait()flag=1return flagdef getFace(cap,path_id):# 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2#cap = cv2.VideoCapture(0)#xml文件为自己的文件路径face_detector = cv2.CascadeClassifier(r'F:\npyWorkspace\venv\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')#face_id = input('\n enter user id:')print('\n Initializing face capture. Look at the camera and wait ...')count = 0while True:# 从摄像头读取图片sucess, img = cap.read()# 转为灰度图片gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测人脸faces = face_detector.detectMultiScale(gray, 1.3, 5)for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0))count += 1# 保存图像cv2.imwrite("Facedata/User." + str(path_id) + '.' + str(count) + '.jpg', gray[y: y + h, x: x + w])cv2.imshow('image', img)# 保持画面的持续。k = cv2.waitKey(1)if k == 27: # 通过esc键退出摄像breakelif count >= 100: # 得到1000个样本后退出摄像breakcv2.destroyAllWindows()def getImagesAndLabels(path, detector):imagePaths = [os.path.join(path, f) for f in os.listdir(path)] # join函数的作用faceSamples = []ids = []for imagePath in imagePaths:PIL_img = Image.open(imagePath).convert('L') # convert it to grayscaleimg_numpy = np.array(PIL_img, 'uint8')id = int(os.path.split(imagePath)[-1].split(".")[1])faces = detector.detectMultiScale(img_numpy)for (x, y, w, h) in faces:faceSamples.append(img_numpy[y:y + h, x: x + w])ids.append(id)return faceSamples, idsdef trainFace():# 人脸数据路径path = 'Facedata'recognizer = cv2.face.LBPHFaceRecognizer_create()detector = cv2.CascadeClassifier(r'F:\npyWorkspace\venv\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')print('Training faces. It will take a few seconds. Wait ...')faces, ids = getImagesAndLabels(path, detector)recognizer.train(faces, np.array(ids))recognizer.write(r'face_trainer\trainer.yml')print("{0} faces trained. Exiting Program".format(len(np.unique(ids))))def checkFace(cam,names,engine,sign_flag):sex = {"female":"女士","male":"先生"}recognizer = cv2.face.LBPHFaceRecognizer_create()recognizer.read('face_trainer/trainer.yml')cascadePath = r"F:\npyWorkspace\venv\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml"faceCascade = cv2.CascadeClassifier(cascadePath)font = cv2.FONT_HERSHEY_SIMPLEXidnum = 0names = ['yumengzhen', 'dujuanjuan','litingting','kangming','wangyizhe']#cam = cv2.VideoCapture(0)minW = 0.1 * cam.get(3)minH = 0.1 * cam.get(4)while True:ret, img = cam.read()gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = faceCascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5,minSize=(int(minW), int(minH)))for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)idnum, confidence = recognizer.predict(gray[y:y + h, x:x + w])if confidence < 100:Name =connect.readName(idnum) #connect 传入ID 学生信息表找到 返回 nameSex =connect.readSex(idnum) #connect ID 学生信息表找到 返回 SexStudentID =connect.readStudentID(idnum) #connect ID 学生信息表找到 返回 studentID#idnum = names[idnum] #利用数据库 读取学生信息表 该id 对应的nameconfidence = "{0}%".format(round(100 - confidence))if sign_flag=='0': #签到say(engine, "欢迎 "+Name+ sex[Sex]+" 签到成功 ")baseConnect.insertd(idnum,Name,StudentID,Sex) #签到表中 插入签到信息print("欢迎 "+Name+ sex[Sex] + "签到成功 ")else :say(engine, "欢迎 "+Name+ sex[Sex]+" 签退成功 ")baseConnect.insertt(idnum,Name,StudentID,Sex) #签到表中 插入签退信息print("欢迎 "+Name+ sex[Sex] + "签退成功 ")cv2.imshow("img",img)os.system("pause")returnelse:idnum = "unknown"confidence = "{0}%".format(round(100 - confidence))cv2.putText(img, str(idnum), (x + 5, y - 5), font, 1, (0, 0, 255), 1)cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (0, 0, 0), 1)cv2.imshow('camera', img)k = cv2.waitKey(10)if k == 27:breakcam.release()cv2.destroyAllWindows()def say(engine,str):engine.say(str)engine.runAndWait()def admission(): #录入信息模块#names = {"yumengzhen":0,"dujuanjuan":1,"litingting":2}say(engine, "请输入您的学号 ")StudentID = input("请输入学号:")# 读取数据库信息表 取出Name 对应IDID=connect.readIDbaseStudentID(StudentID) #connect 传入name 学生信息表找到 返回 IDif ID==-1:#没有找到该学生插入学生信息while True:say(engine,"没有找到该学生信息 输人 0 注册 1重新输入")op=input("\n 没有找到该学生信息 输人数字 0 注册学生信息 1重新输入")if op=='0':Name,studentID,Sex=input("输入学生信息: Name studentID Sex").split()connect.insert(Name,studentID,Sex) #插入学生信息信息else:StudentID = input("请输入学号:")ID=connect.readIDbaseStudentID(StudentID) #connect 传入name 学生信息表找到 返回 IDif ID!=-1 :breaksay(engine, "正在打开摄像头")cam = cv2.VideoCapture(0)say(engine, "注视摄像头,开始采集人脸数据")getFace(cam, ID) # 实际传入的是idcam.release()if __name__ == '__main__':names = {"yumengzhen":0,"dujuanjuan":1,"litingting": 2}password="123456" #密码engine = pyttsx3.init()rate = engine.getProperty('rate')engine.setProperty('rate', rate - 20)flag=makeDir(engine)#trainFace()while True:if flag==1 :flag = 0say(engine, "首次使用 没有人脸信息 ")say(engine, "是否要录入新的人脸信息 ")say(engine, "输入0 代表是 输入其他表示退出")value = input("0:是 or other:否")if value=='0':while True:admission()say(engine, "是否要继续录入新的人脸信息 ")say(engine, "输入0 代表是 输入其他表示退出")firstflag = input("0:是 其他:退出")if firstflag != '0':breaksay(engine, "采集完毕,开始训练")trainFace()say(engine, "训练完毕 ")#say(engine, "请选择登录方式 ")say(engine, "输入 0管理人员模式 1 进入签到/签退模式 2 退出学生签到系统 ")user=input("\n0:管理人员模式 1:进入签到/签退模式 2:退出学生签到系统\n")if user=='0':say(engine, "输入管理员密码 ")pd=input("\n输入管理员密码 :\n")count=1while True:if count==3:say(engine," 输入密码错误超过3次 强制退出输入 ")breakif password == pd:say(engine, "管理员模式 ")#say(engine, "输入数字 0 导出签到表 1 导出个人签到表 2 导出时长表 3 导出信息表 4 录入人脸信息 5 退出")op = input("\n0:导出所有同学签到表 1:导出个人签到表 2:导出所有人员时长表 3:导出学生信息表 4 录入人脸信息 5 退出\n")if op == '0':baseConnect.sign()#导出签到表say(engine, "导出签到表成功 ")passelif op == '1':say(engine,"输入导出学生的学号")StudentID=input("输入导出学生的学号")ID=connect.readIDbaseStudentID(StudentID)if ID==-1:say(engine, "没有该学生信息 ")else:baseConnect.peoson_sign(StudentID)#导出个人签到表Name =connect.readName(ID) #connect 传入ID 学生信息表找到 返回 namesay(engine, "导出 "+Name+" 信息成功")elif op == '2':baseConnect.total_time()#导出时长表say(engine,"导出时长表成功 ")elif op == '3':#导出学生信息表connect.find_student_all()say(engine, "导出学生信息成功 ")elif op == '4':while True:admission()say(engine, "是否要继续录入新的人脸信息 ")say(engine, "输入0 代表是 输入其他表示退出")secondflag = input("0:是 其他:退出")if secondflag != '0':breaksay(engine, "采集完毕,开始训练")trainFace()say(engine, "训练完毕 ")elif op == '5':say(engine, "已退出 管理员模式 ")breakelse:say(engine, "输入形式错误 请重新输入 ")else:say(engine, "输入密码错误 请重新输入 ")pd = input("\n输入管理员密码 :\n")count += 1;elif user=='1':say(engine, "欢迎进入学生系统签到/签退模式 ")sign_flag=0;while True:say(engine, "输入数字 0 签到 1 签退")sign_flag = input("\n0: 签到 1 签退\n")if sign_flag=='1' or sign_flag=='0' :breakelse :say(engine," 请输入正确的输入形式")say(engine, "开始人脸识别")say(engine, "正在打开摄像头")cam = cv2.VideoCapture(0)checkFace(cam, names, engine,sign_flag)elif user=='2':say(engine, "信息已保存")say(engine, "再见")sys.exit(0)else:say(engine, "输入错误请重新输入 ")
student_sql.py
学生
import pymssql as py
import pandas as pd
# 连接数据库,创建学生表,进行表查询,表录入
server = "DESKTOP-XXX"# 连接自己数据库的服务器地址
user = "sa"# 连接帐号
password = "123"# 连接密码
conn = py.connect(server, user, password, "student_message") #获取连接
cursor = conn.cursor() # 获取光标# 创建表
cursor.execute("""
IF OBJECT_ID('students', 'U') IS NOT NULLDROP TABLE students
CREATE TABLE students (ID INT NOT NULL,name VARCHAR(100),StudentID INT,Sex VARCHAR(100))
""")
conn.commit()
#第一次运行时建立表,之后再运行无需再建def insert(Name, studentID, Sex):count_students = 0try:conn = py.connect(server, user, password, "student_message") # 获取连接cursor =conn.cursor()cursor.execute(' select count(ID) from students')for row in cursor:count_students = row[0]print(row[0])cursor.executemany("INSERT INTO students VALUES (%d, %s, %d,%s)",[(count_students+1, Name, studentID, Sex)])# 你必须调用 commit() 来保持你数据的提交如果你没有将自动提交设置为trueconn.commit()conn.close()except py.InterfaceError:print("数据库连接出错")except py.ProgrammingError:print("数据错误,请检查输入的数据")except py.OperationalError:print("数据错误,请检查输入的数据")# 导出学生信息表
def find_student_all():try:conn = py.connect(server, user, password, "student_message") # 获取连接cursor =conn.cursor()sql = "select * from students"df = pd.read_sql(sql, conn)df.to_excel('all.xlsx',index=False)print('ok')conn.commit()conn.close()except py.InterfaceError:print("数据库连接出错")except py.ProgrammingError:print("数据错误,请检查输入的数据")#find_student_all()def readName(idnum):Name = -1try:conn = py.connect(server, user, password, "student_message") # 获取连接cursor =conn.cursor()cursor.execute(' select Name from students where ID='+str(idnum))for row in cursor:if row[0]!=[]:Name = row[0]conn.commit()conn.close()except py.InterfaceError:print("数据库连接出错")except py.ProgrammingError:print("数据错误,请检查输入的数据")return Namedef readIDbaseStudentID(StudentID):ID = -1try:conn = py.connect(server, user, password, "student_message") # 获取连接cursor =conn.cursor()cursor.execute(' select ID from students where StudentID='+str(StudentID))for row in cursor:if row[0]!=[]:ID = row[0]conn.commit()conn.close()except py.InterfaceError:print("数据库连接出错")except py.ProgrammingError:print("数据错误,请检查输入的数据")return IDdef readSex(idnum):Sex = -1try:conn = py.connect(server, user, password, "student_message") # 获取连接cursor =conn.cursor()cursor.execute(' select Sex from students where ID='+str(idnum))for row in cursor:if row[0]!=[]:Sex = row[0]conn.commit()conn.close()except py.InterfaceError:print("数据库连接出错")except py.ProgrammingError:print("数据错误,请检查输入的数据")return Sexdef readID(name):# 多个idID = -1try:conn = py.connect(server, user, password, "student_message") # 获取连接cursor =conn.cursor()cursor.execute(' select ID from students where name='+'\''+str(name)+'\'')for row in cursor:if row[0]!=[]:ID = row[0]conn.commit()conn.close()except py.InterfaceError:print("数据库连接出错")except py.ProgrammingError:print("数据错误,请检查输入的数据")return IDdef readStudentID(idnum):StudentID = -1try:conn = py.connect(server, user, password, "student_message") # 获取连接cursor =conn.cursor()cursor.execute(' select StudentID from students where ID='+str(idnum))for row in cursor:if row[0]!=[]:StudentID = row[0]conn.commit()conn.close()except py.InterfaceError:print("数据库连接出错")except py.ProgrammingError:print("数据错误,请检查输入的数据")return StudentID# 关闭连接
# conn.close()
#
# # 注:在任何时候,在一个连接下,一次正在执行的数据库操作只会出现一个cursor对象
recognizer_sql.py
import pymssql as py
import time
import pandas as pdserver = "DESKTOP-XXXX"# 连接服务器地址
user = "sa" # 连接帐号
password = "123" # 连接密码
conn = py.connect(server, user, password, "student_message") #获取连接
cursor = conn.cursor() # 获取光标def insertd(idnum,Name,StudentID,Sex): # 签到conn = py.connect(server, user, password, "student_message") # 获取连接timenow = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())cursor = conn.cursor()cursor.execute("INSERT INTO qiandao VALUES (%d, %s,%d,%s, %s, %s, %s,%d )", (idnum,Name,StudentID,Sex,timenow, '0', '0', 0))conn.commit()# 必须调用 commit() 来保持数据的提交
def insertt(idnum,Name,StudentID,Sex): # 签退conn = py.connect(server, user, password, "student_message") # 获取连接cursor = conn.cursor()cursor.execute("SELECT starttime FROM qiandao WHERE ID=%s and flag=%d",(idnum,0))starttimeget = cursor.fetchone()sat = str(tuple(starttimeget))timenow = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())timeArray = time.strptime(sat, "('%Y-%m-%d %H:%M:%S',)")timeStamp = int(time.mktime(timeArray))timecout = time.time() - timeStampm, s = divmod(timecout, 60)h, m = divmod(m, 60)timepass = str(h) + '小时 ' + str(m) + '分钟 ' + str(s) + '秒'print(timepass)cursor.executemany("INSERT INTO qiandao VALUES (%d, %s,%d,%s, %s, %s, %s,%d )",[(idnum,Name,StudentID,Sex,'0', timenow, timepass, 1)])conn.commit()def peoson_sign(StudentID):# 导出学生信息表_按照学号conn = py.connect(server, user, password, "student_message") # 获取连接cursor = conn.cursor()sql = "select * from qiandao where StudentID=" + str(StudentID)df = pd.read_sql(sql, conn)df.to_excel(r'E:\01STUDY\20190701\work\openVersion\excel\studentID_sign.xlsx',index=False)print('ok')conn.commit()#peoson_sign(2016002105)def sign():# 导出签到表conn = py.connect(server, user, password, "student_message") # 获取连接cursor = conn.cursor()sql = "select * from qiandao"df = pd.read_sql(sql, conn)df.to_excel(r'E:\01STUDY\20190701\work\openVersion\excel\sign_all.xlsx', index=False)print('ok')conn.commit()
#sign()def total_time():# 导出时长表#sign()conn = py.connect(server, user, password, "student_message") # 获取连接cursor = conn.cursor()sql = "select * from qiandao where convert(nvarchar(max),count) != convert(nvarchar(max),0)"df = pd.read_sql(sql, conn)df.to_excel(r'E:\01STUDY\20190701\work\openVersion\excel\total_time.xlsx', index=False)print('ok')conn.commit()#
# if __name__=='__main':
# sign()
# #peoson_sign(2016002105)conn.close()
基于python环境的人脸签到系统[带数据库存储]相关推荐
- Python毕设-【人脸签到系统】附源码/Python练手项目/Python毕业设计
本人承诺只做技术分享,永不收费. V----------------->:专栏详情 文章目录 本人承诺只做技术分享,永不收费. V----------------->:专栏详情 一.背景 ...
- 计算机毕业设计django基于python商品比价平台(源码+系统+mysql数据库+Lw文档)
项目介绍 随着计算机技术的发展和网络的普及.采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的商品比价系统的平台,这样可以有效地解决数据商品比 ...
- 基于Python+OpenCV的人脸识别实现带墨镜效果
环境以及执行步骤 相关介绍 环境配置 相关库安装介绍 上代码 github地址 动图介绍 改进 相关介绍 你好! 项目起初来源于一本科生的毕业设计,由于我给了一版更加优秀,所以初始版本的例子给予分享. ...
- Python毕设-【课堂人脸签到系统】附源码课件/Python练手项目/Python毕业设计
Python毕设-[课堂人脸签到系统]附源码课件/允许白嫖 文章目录 Python毕设-[课堂人脸签到系统]附源码课件/允许白嫖 系统简介 一.本课题拟解决的问题 二.系统技术栈 三.开发工具 四.数 ...
- 基于Flask/Opencv/Dlib课堂人脸签到系统
简介 本项目主要采用了Python语言基于Flask框架开发,利用Dlib库中68特征点检测器和深度残差网络模型,欧氏距离,目标跟踪方法实现了人脸识别,采用MySQL数据库记录系统相关数据,并用Boo ...
- python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表...
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- python人脸识别系统界面设计_基于卷积神经网络的人脸识别系统的设计(Python)
基于卷积神经网络的人脸识别系统的设计(Python)(论文10000字,外文翻译,参考代码,流程图,人脸图像库) 摘要:随着社会的进步与发展,个人信息的保护变得十分重要.传统的密码保护方式已经不再满足 ...
- Python基于百度AI的人脸识别系统--颜值检测
基于百度AI的人脸识别系统–颜值检测 刚开始学,觉得好玩就写了这个 主要是分为人脸识别系统的对接,UI的设计 人脸识别系统: 用的百度的AI,其中的AK,SK可以换成自己的,在百度开放平台上注册就能获 ...
- python 文件格式转换_数据分析:基于Python的自定义文件格式转换系统
( 白宁超 2018年7月16日14:47:41 ) 导读:随着大数据的快速发展,自然语言处理.数据挖掘.机器学习技术应用愈加广泛.针对大数据的预处理工作是一项庞杂.棘手的工作.首先数据采集和存储,尤 ...
最新文章
- Ubuntu 彻底卸载 OpenCV
- 一直被喷不实用的超算 在深度学习时代会改变吗?
- python lambda函数_python入门基础之lambda匿名函数
- 因为应用程序的并行配置不正确 sxstrace
- MySQ软件的卸载-通过控制面板方式
- WPF in Visual Studio 2010
- Constructor sap.ui.core.ComponentContainer has been called without new operator
- 排查访问Linux Server速度较慢的问题
- 认识探头(一) (转)
- leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)
- node.js(四)Mongoose使用进阶
- 安装realmedia多路分配器
- MAC编译OpenJDK8:iostream file not found(独家解决办法)
- sata接口 图解 定义_SATA定义及接口
- 最强的优化器:把RAdam和LookAhead协同组合
- 物联网+安防在智慧社区建设中的发展与深度应用
- linux 桌面美化指南,Linux_9方面立体式地美化Ubuntu桌面,总结了一下桌面美化的设置。 - phpStudy...
- php 自适应 博客,三种方法让网站背景自动适应各浏览器大小
- Python中的 len() 是什么?如何使用 len() 函数查找字符串的长度
- 高手速成android开源项目【View篇】