Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试) 您所在的位置:网站首页 pycharm运行快捷键全灰 Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

2022-11-24 19:20| 来源: 网络整理| 查看: 265

目录

一、项目简介

二、功能展示

1.人脸识别功能测试

2.识别并录入人脸及个人信息

3.数据库保存信息

4.考勤打卡

三、环境安装实例

1.下载python对应版本的dlib

2.安装opencv-python

3.安装face_recognition

4.安装pyqt5

5.安装mysqlclient

四、需要源码私信并call邮箱[email protected]

一、项目简介

本项目使用编程语言Python3.8,anaconda,开发工具pycharm,数据库MySQL5.7。

技术应用:开源计算机视觉库opencv-python,开源人脸识别库face_recognition,使用PyQt5制作人脸识别以及考勤界面,dlib人脸检测技术,以及MySQLdb连接数据库。

功能介绍:

第一步:录入,进入录入界面。调用摄像头检测识别人脸、输入姓名学号,人脸照片保存在faces文件夹中,姓名学号保存在数据库中。

第二步:考勤,进入考勤界面。调用摄像头进行人脸识别,摄像头识别出人脸和人脸对应的名字。

二、功能展示 1.人脸识别功能测试

这是从网上随便找了一张图片识别静态人脸,成功。

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

调用摄像头识别动态人脸,成功

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

上述功能代码如下:

def a1(): #加载图片 img=face_recognition.load_image_file("1.jpeg") #检测脸部位置 pos=face_recognition.face_locations(img) print("位置top,right,bottom,left",pos) for i in range(len(pos)): rect=pos[i] #绘制矩形 cv2.rectangle(img,(rect[3],rect[0]),(rect[1],rect[2]),(0,0,220),2) #显示窗口 cv2.imshow("",img) cv2.waitKey(0) def a2(): vd=cv2.VideoCapture(0) while True: #读取摄像头数据流 ok,frame=vd.read() #矩阵子集 facearea=frame[:,:,::-1] pos=face_recognition.face_locations(facearea) for(top,right,bottom,left) in pos: cv2.rectangle(frame,(left,top),(right,bottom),(0,200,0),2) cv2.imshow("",frame) cv2.waitKey(1) vd.release() cv2.destroyAllWindows() 2.识别并录入人脸及个人信息

此时人脸已经录入faces文件中,点击确定即可填写个人信息。

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)填写好信息,点击保存,信息即保存到数据库。

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

此时刚刚输入的账号和姓名已经保存到faces文件中,如下

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)(挡住了一点,但是能看到)

功能代码如下:

class LuruApp(UI_FaceRec): def __init__(self): super().__init__() self.running = True self.btn.setEnabled(False) self.face_encode = None self.open() self.face_img = None self.face_img_encode = "" def open(self): frame = np.zeros((500, 600, 3), np.uint8) img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img) font = ImageFont.truetype("simkai.ttf", 40, encoding="utf-8") draw.text((200, 200), "请正视摄像头", (200, 30, 40), font=font) frame = cv2.cvtColor(np.asarray(img), cv2.COLOR_BGR2RGB) frame = cv2.resize(frame, (self.img.width() - 10, self.img.height() - 10)) h, w1, d = frame.shape # 从内存创建图像 frame = QImage(frame.data, w1, h, w1 * d, QImage.Format_RGB888) self.img.setPixmap(QPixmap.fromImage(frame)) # 开启子线程 self.thread = Thread(target=self.doLuru) self.thread.start() def doLuru(self): fbl = FaceBoxesLocation() msg = "" self.cap = cv2.VideoCapture(0) # if self.cap.isOpened(): # ok, frame = self.cap.read() while self.running: ok, frame = self.cap.read() frame = cv2.flip(frame, 1) rawFrame = frame.copy() # 脸部区域 face_pos = fbl.face_location(frame).astype(int) if len(face_pos) == 0: msg = "没有人脸" elif len(face_pos) > 1: msg = "请一个一个来!" else: msg = "" face_mark = face_recog.face_landmarks(frame, face_pos) # 脸部特征 new_face_encode = face_recog.face_encodings(frame, face_pos)[0] if self.face_encode is None: self.face_encode = new_face_encode x1, y1, x2, y2 = face_pos[0] self.face_img = frame[y1:y2, x1:x2] print(self.face_img) self.face_img_encode = self.face_encode.tolist() # else: # face_distance = face_recog.face_distance(self.face_encode[np.newaxis], new_face_encode)[0] # if face_distance < 0.5: # x1, y1, x2, y2 = face_pos[0] # self.face_img = frame[y1:y2, x1:x2] # print(self.face_img) # self.face_img_encode = self.face_encode.tolist() img = Image.fromarray(cv2.cvtColor(rawFrame, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img) for x1, y1, x2, y2 in face_pos: draw.rectangle([(x1, y1), (x2, y2)], outline=(200, 30, 40), width=2) # 绘制五官 if face_mark is not None: for x, y in face_mark[0]: draw.point((x, y), (20, 250, 25)) font = ImageFont.truetype("simkai.ttf", 40, encoding="utf-8") draw.text((200, 200), msg, (200, 30, 40), font=font) frame = cv2.cvtColor(np.asarray(img), cv2.COLOR_BGR2RGB) frame = cv2.resize(frame, (self.img.width() - 10, self.img.height() - 10)) h, w1, d = frame.shape # 从内存创建图像 frame = QImage(frame.data, w1, h, w1 * d, QImage.Format_RGB888) self.img.setPixmap(QPixmap.fromImage(frame)) self.running = False root = tkinter.Tk() root.withdraw() tkinter.messagebox.showinfo('系统提示', '人脸已经录入,请填写个人信息') self.btn.setEnabled(True) self.cap.release() 3.数据库保存信息

我使用的数据库可视化工具是Navicat12 for MySQL(也可以不用,mysql基本命令知道的话直接管理员cmd也可)

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试) 4.考勤打卡

运行如下,此时摄像头一直在运行,绿色框框始终识别你的人脸(跟随你移动)

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

点击”请开始考勤”,开始考勤时间会直接显示在界面上

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

点击”请结束考勤”,结束考勤时间会存入数据库

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

功能代码如下:

class AttendanceApp(UI_FaceAttend): def __init__(self): super().__init__() # 摄像头开启开关 self.running = True self.startattend = False # 摄像头看到的人的名字 self.vnames = [] # 存储学号+姓名+打卡时间 self.ats = [] self.open() # 打开摄像头 def open(self): frame = np.zeros((500, 600, 3), np.uint8) # 灰化 img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img) font = ImageFont.truetype("simkai.ttf", 40, encoding="utf-8") draw.text((200, 200), "准备考勤...", (200, 30, 40), font=font) frame = cv2.cvtColor(np.asarray(img), cv2.COLOR_BGR2RGB) # 调整图像大小 frame = cv2.resize(frame, (self.video.width(), self.video.height())) h, w, d = frame.shape # 从内存创建图像 frame = QImage(frame.data, w, h, w * d, QImage.Format_RGB888) self.video.setPixmap(QPixmap.fromImage(frame)) # # 开启子线程 self.thread = Thread(target=self.doAttend) self.thread.start() def doAttend(self): # 已录入的头像 luruimgs = [] # 头像对应人员 lurunames = [] path = "..\\faces" # 遍历目录下的所有文件,得到所有文件名字 for root, dirs, files in os.walk(path): for file in files: filename = os.path.join(root, file) if file.endswith("jpg"): kimg = face_recognition.load_image_file(filename) # 把图像转为矩阵 kimg_encoding = face_recognition.face_encodings(kimg) if len(kimg_encoding) > 0: firstencoder = kimg_encoding[0] luruimgs.append(firstencoder) name = file.split(".")[0] xuehao = filename.split("\\")[-2] # 格式:学号,姓名 lurunames.append(xuehao + "," + name) # print("--",lurunames) self.vcap = cv2.VideoCapture(0) while self.running: ok, frame = self.vcap.read() rgbimg = frame[:, :, ::-1] # 检测人脸 v_face_pos = face_recognition.face_locations(rgbimg) # 人脸编码生成矩阵 v_face_encoding = face_recognition.face_encodings(rgbimg, v_face_pos) for face in v_face_encoding: # 比较摄像头人脸和已录入的人脸 matcher = face_recognition.compare_faces(luruimgs, face, 0.6) # 距离 face_dist = face_recognition.face_distance(luruimgs, face) # 取出最短距离 small = np.argmin(face_dist) if matcher[small]: facename = lurunames[small] # 避免重复添加 if facename not in self.vnames: self.vnames.append(facename) self.ats.append(facename + "," + str(datetime.now())) # print(facename) # 合并数组 templist = zip(v_face_pos, self.vnames) # 把摄像头看到的所有人的名字显示在图像区 for (top, right, bottom, left), name in templist: cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 30), 2) cv2.rectangle(frame, (left, bottom - 30), (right, bottom), (20, 20, 255), 2) img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(img) font = ImageFont.truetype("simkai.ttf", 30, encoding="utf-8") # 显示人名 draw.text((left + 20, bottom - 30), name.split(",")[1], (20, 20, 255), font=font) frame = cv2.cvtColor(np.asarray(img), cv2.COLOR_BGR2RGB) self.showHead(frame) # 点击开始打卡按钮 if self.startattend: self.fillData() self.vcap.release() 三、环境安装实例

Anaconda!真的好用!

1.下载python对应版本的dlib

你想要的dlib版本这里都有

然后pip install dlib -……..whl(install后面为你下载的dlib的文件名)pip install Cmake

2.安装opencv-python

pip install opencv-python

3.安装face_recognition

pip install face_recognition

4.安装pyqt5

pip install pyqt5

5.安装mysqlclient

pip install mysqlclient

四、需要源码私信并call邮箱[email protected]

至此,结束!

小猿写的第一篇博客,写的不好还请担待

Original: https://blog.csdn.net/qq_45995059/article/details/125527000Author: 不断学习的小猿Title: Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

相关阅读 Title: opencv图像仿射变换,cv2.warpAffine

目录

仿射变换原理介绍

cv2.warpAffine函数介绍

代码实例

仿射变换原理介绍

仿射变换,又称 仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。

在有限维的情况,每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写作A和一个附加的列b。一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1。

在opencv中就相当于是对图像的坐标进行操作(x,y),对坐标进行矩阵运算。运算过后会生成新的矩阵,仿射变换就相当于是原始图像和新生成图像之间的映射,下面给出运算矩阵。

下面的M相当于就是一个运算矩阵。2行3列

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

根据定义,我们的坐标就可以根据A,B来进行运算

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

可以很轻易的得出以下方程

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

通过方程我们就可以很轻易的看出,c1和c2就相当于是让图像平移,而a和b这2个参数就是对图像进行旋转,缩放等操作。

由于图像是3维的,所以这里还需要增加下维度,构建齐次方程进行运算

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

上面仅仅是个人理解,如果有误还请指出

cv2.warpAffine函数介绍

cv2.warpAffine函数用于仿射变换

def warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) src:输入图像 M: 运算矩阵,2行3列的,数据类型要求是float32位及以上 dsize:运算后矩阵的大小,也就是输出图片的尺寸 dst:输出图像 flags:插值方法的组合,与resize函数中的插值一样,可以查看cv2.resize borderMode:像素外推方法,详情参考官网 borderValue:在恒定边框的情况下使用的borderValue值;默认情况下,它是 0 代码实例

下面代码对M矩阵给出不同的值,查看图像变换情况,首先改变c1和c2

M = np.float32([[1, 0, 50], [0, 1, 50]])

上面的代码就相当于是对图像进行平移,向左平移50,向上平移50

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

改变下其他值,改变b1和a2

M = np.float32([[1, 0.2, 0], [0.2, 1, 0]])

这个就好像是对图片进行了3维的旋转

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

改变b2和a1

M = np.float32([[1.3, 0, 0], [0, 1.3, 0]])

这个就相当于是对图片进行了放大

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

完整代码

import cv2 import numpy as np lp = cv2.resize(cv2.imread('../images/lp.jpg'), None, fx=0.7, fy=0.7) h, w, channel = lp.shape M = np.float32([[1, 0, 50], [0, 1, 50]]) new_lp1 = cv2.warpAffine(lp, M, (w, h)) M = np.float32([[1, 0.2, 0], [0.2, 1, 0]]) new_lp2 = cv2.warpAffine(lp, M, (w, h)) M = np.float32([[1.3, 0, 0], [0, 1.3, 0]]) new_lp3 = cv2.warpAffine(lp, M, (w, h)) cv2.imshow('lp', np.hstack((lp, new_lp1, new_lp2, new_lp3))) cv2.waitKey(0) cv2.destroyAllWindows()

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

Original: https://blog.csdn.net/m0_51545690/article/details/123959995Author: 秃头披风侠.Title: opencv图像仿射变换,cv2.warpAffine

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/200945/

转载文章受原作者版权保护。转载请注明原作者出处!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有