• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python实现人脸签到系统

python 搞代码 4年前 (2022-01-07) 42次浏览 已收录 0个评论

这篇文章主要为大家详细介绍了python实现人脸签到系统,带数据库存储,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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 json def makeDir(engine): flag= 0 if not os.path.exists("face_trainer"): print("创建预训练环境") engine.say('检测到第一次启动,未检测到环境,正在创建环境') engine.say('正在创建预训练环境') os.mkdir("face_trainer") engine.say('创建成功') engine.runAndWait() flag=1 if not os.path.exists("Facedata"): print("创建训练环境") engine.say('正在创建训练环境') os.mkdir("Facedata") engine.say('创建成功') engine.runAndWait() flag=1 return flag def 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 = 0 while 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-600', gray[y: y + h, x: x + w]) cv2.imshow('image', img) # 保持画面的持续。 k = cv2.waitKey(1) if k == 27: # 通过esc键退出摄像 break elif count >= 100: # 得到1000个样本后退出摄像 break cv2.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 grayscale img_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, ids def 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_SIMPLEX idnum = 0 names = ['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 传入id 学生信息表找到 返回 sex id studentid #idnum=names[idnum] #利用数据库 读取学生信息表 该id 对应的name confidence="{0}%" .format(round(100 - confidence)) if sign_flag=='0': #签到 say(engine, "欢迎 "+name+ sex[sex]+" 签到成功 ") baseconnect.insertd(idnum,name,studentid,sex) #签到表中 插入签到信息 print("欢迎 sex[sex] + "签到成功 else : 签退成功 baseconnect.insertt(idnum,name,studentid,sex) 插入签退信息 "签退成功 cv2.imshow("img",img) os.system("pause") return else: idnum="unknown" "{0}%".format(round(100 cv2.puttext(img, str(idnum), (x 5, y 5), font, 1, (0, 0, 255), 1) str(confidence), h 0), cv2.imshow('camera', img) k=cv2.waitKey(10) 27: break cam.release() cv2.destroyallwindows() def say(engine,str): engine.say(str) engine.runandwait() admission(): #录入信息模块 #names={"yumengzhen":0,"dujuanjuan":1,"litingting":2} "请输入您的学号 input("请输入学号:") # 读取数据库信息表 取出name 对应id 传入name while true: say(engine,"没有找到该学生信息 输人 0 注册 1重新输入") op=input("\n 没有找到该学生信息 输人数字 注册学生信息 name,studentid,sex=input("输入学生信息: sex").split() connect.insert(name,studentid,sex) #插入学生信息信息 id!=-1 "正在打开摄像头") cam=cv2.VideoCapture(0) "注视摄像头,开始采集人脸数据") getface(cam, id) 实际传入的是id __name__== '__main__': names={"yumengzhen":0,"dujuanjuan":1,"litingting": 2} password="123456" #密码 engine=pyttsx3.init() rate engine.setproperty('rate', 20) flag=makeDir(engine) #trainface() "首次使用 没有人脸信息 "是否要录入新的人脸信息 "输入0 代表是 输入其他表示退出") value=input("0:是 or other:否") admission() "是否要继续录入新的人脸信息 firstflag 其他:退出") !='0' "采集完毕,开始训练") trainface() "训练完毕 #say(engine, "请选择登录方式 "输入 0管理人员模式 1 进入签到 签退模式 2 退出学生签到系统 user=input("\n0:管理人员模式 1:进入签到 2:退出学生签到系统\n") "输入管理员密码 pd=input("\n输入管理员密码 :\n") count say(engine," 输入密码错误超过3次 强制退出输入 pd: "管理员模式 "输入数字 导出签到表 导出个人签到表 导出时长表 3 导出信息表 4 录入人脸信息 5 退出") input("\n0:导出所有同学签到表 1:导出个人签到表 2:导出所有人员时长表 3:导出学生信息表 退出\n") '0': baseconnect.sign()#导出签到表 "导出签到表成功 pass elif '1': say(engine,"输入导出学生的学号") "没有该学生信息 baseconnect.peoson_sign(studentid)#导出个人签到表 "导出 "+name+" 信息成功") '2': baseconnect.total_time()#导出时长表 say(engine,"导出时长表成功 '3': #导出学生信息表 connect.find_student_all() "导出学生信息成功 '4': secondflag '5': "已退出 管理员模式 "输入形式错误 请重新输入 "输入密码错误 input("\n输入管理员密码 1; "欢迎进入学生系统签到 签到 签退") input("\n0: 签退\n") 请输入正确的输入形式") "开始人脸识别") cv2.videocapture(0) checkface(cam, names, engine,sign_flag) "信息已保存") "再见") sys.exit(0) "输入错误请重新输入 ")<pre></div><p>student_sql.py  </p><p>学生</p><div class="gaodaimacode"><pre class="prettyprint linenums"> 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 NULL DROP 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 = 0 try: 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() 来保持你数据的提交如果你没有将自动提交设置为true conn.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 = -1 try: 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 Name def readIDbaseStudentID(StudentID): ID = -1 try: 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 ID def readSex(idnum): Sex = -1 try: conn = py.connect(server, user, password, "student_message") # 获取连接 cursor =conn.cursor() cu<mark style="color:transparent">来源gaodaimacom搞#^代%!码&网</mark>rsor.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 Sex def readID(name): # 多个id ID = -1 try: 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 ID def readStudentID(idnum): StudentID = -1 try: 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 pd server = "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() - timeStamp m, 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()

更多学习资料请关注专题《管理系统开发》。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持gaodaima搞代码网

以上就是python实现人脸签到系统的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python实现人脸签到系统

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址