草庐IT

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

不断学习的小猿 2023-05-22 原文

目录

一、项目简介

二、功能展示

1.人脸识别功能测试

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

3.数据库保存信息

 4.考勤打卡

三、环境安装实例

1.下载python对应版本的dlib

2.安装opencv-python

3.安装face_recognition

 4.安装pyqt5

5.安装mysqlclient

四、需要源码私信并call邮箱lij867967@gmail.com


一、项目简介

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

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

功能介绍:

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

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


二、功能展示

1.人脸识别功能测试

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

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

上述功能代码如下:

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文件中,点击确定即可填写个人信息。

填写好信息,点击保存,信息即保存到数据库。

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

(挡住了一点,但是能看到)

功能代码如下:

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也可)

 4.考勤打卡

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

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

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

 功能代码如下:

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邮箱lij867967@gmail.com

至此,结束!

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

有关Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  3. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  4. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  5. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

随机推荐