人脸识别签到系统一站式开发【基于Pyqt5的CS架构软件】

人脸识别签到系统

1、运用场景

课堂签到,上班打卡,进出门身份验证。

2、功能架构

人脸录入,打卡签到,声音提醒,打卡信息导出:

3、技术栈

python3.8,sqlite3,opencv,face_recognition,PyQt5,csv

第三方库:

asgiref==3.8.1
click==8.1.7
colorama==0.4.6
comtypes==1.4.4
dlib @ file:////dlib-19.19.0-cp38-cp38-win_amd64.whl.whl#sha256=89a19fe0003e2fa2ff33264b5abba82443056f915b2339feb167569b4446a460
et-xmlfile==1.1.0
face-recognition==1.3.0
face_recognition_models==0.3.0
numpy==1.24.4
opencv-python==4.10.0.84
openpyxl==3.1.5
pillow==10.3.0
pypiwin32==223
PyQt5==5.15.10
PyQt5-Qt5==5.15.2
PyQt5-sip==12.13.0
pyttsx3==2.90
pytz==2024.1
pywin32==306
sqlparse==0.5.0
typing_extensions==4.12.2

4、人脸识别流程图

1、导入库
2、编写UI界面
3、打开摄像头录入人脸信息
4、比对人脸信息并发出声音提醒
5、导出打卡信息
6、打包成exe可执行文件

5、数据库

5.1、用户表

字段 描述 类型 大小
id 主键 integer
name 姓名 text 256
account 账号 text 256
password 密码 text 256
is_admin 是否为管理员 integer
icon_feature 人脸特征 blob 1024
addtime 添加时间 text 256

sql语句:

PRAGMA foreign_keys = false;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS "user";
CREATE TABLE "user" (
  "id" INTEGER NOT NULL,
  "name" TEXT(256),
  "account" TEXT(256),
  "password" TEXT(256),
  "is_admin" integer,
  "icon_feature" blob(1024),
  "addtime" TEXT(256),
  PRIMARY KEY ("id")
);

PRAGMA foreign_keys = true;

5.2、记录表

字段 描述 类型 大小
id 主键 integer
userid 用户id integer
name 用户姓名 text 256
is_login 是否登录:0 :登录,1:上班打卡,2:下班打卡 integer
content 打卡日志 text 256
addtime 添加时间 text 256

sql语句:

PRAGMA foreign_keys = false;

-- ----------------------------
-- Table structure for logs
-- ----------------------------
DROP TABLE IF EXISTS "logs";
CREATE TABLE "logs" (
  "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  "userid" INTEGER,
  "name" TEXT(256),
  "is_login" integer,
  "content" TEXT(256),
  "addtime" TEXT
);

-- ----------------------------
-- Auto increment value for logs
-- ----------------------------
UPDATE "sqlite_sequence" SET seq = 12 WHERE name = 'logs';

PRAGMA foreign_keys = true;

6、UI界面

6.1、主界面

主要功能:
1、摄像头实时采集人脸数据
2、账号密码打卡
3、输出打卡结果
4、语音播放

6.2、人脸录入功能

功能:
1、管理员登录
2、账号密码修改
3、人脸信息更改
4、用户信息更改
5、用户信息录入
6、摄像头采集人脸数据

6.3、打卡记录

功能:
1、打卡记录查询
2、打卡记录输出
3、打卡记录导出excel文件,并使用橙色标记异常情况,可在输出框直接打开文件

6.4、代码

# -*- coding: utf-8 -*-

"""
@contact: 微信 1257309054
@file: main.py
@time: 2024/6/30 11:09
@author: LDC
"""
class OpenLoginCameraThread(QThread):
    # 摄像头打开多线程
    _signal_thread = pyqtSignal(str)

    def __init__(self, parent=None):
        super(OpenLoginCameraThread, self).__init__(parent)
        self.window = parent
        self.qmut = QMutex()  # 互斥量
        self.is_exit_run = False  # 默认人脸识别里面的摄像头是循环打开的
        self.cap = None

    def get_capture(self):
        '''
        打开摄像头
        :return:
        '''
        try:
            self.cap = cv2.VideoCapture(0)
            w, h = 640, 360

            self.cap.set(3, w)
            self.cap.set(4, h)
            return True
        except Exception as e:
            self.cap = None
            self.window.sign_in_info.setText('打开摄像头失败,{}'.format(e))
            return False

    def open_login_camera(self):
        '''
        打开摄像头
        :return:
        '''

        self.is_close_camera = False  # 设备摄像头打开
        while 1:
            if self.is_exit_run:
                break
            if not self.cap:
                if not self.get_capture():
                    time.sleep(3)
                    continue
            try:
                success, img = self.cap.read()  # 读取图片
                mirrow = cv2.flip(img, 1)
                width, height = mirrow.shape[:2]  # 行:宽,列:高

                # 显示图片
                image_show = cv2.cvtColor(mirrow, cv2.COLOR_BGR2RGB)  # opencv读的通道是BGR,要转成RGB
                camera_img = QtGui.QImage(image_show.data, height, width, QImage.Format_RGB888)

                self.window.label_video.setPixmap(QPixmap.fromImage(camera_img))  # 往显示视频的Label里显示QImage

                is_face, icon_feature = self.window.get_face_feature(camera_img)
                if is_face:
                    user = self.window.compare_feature(icon_feature)
                    if user:
                        self._signal_thread.emit(json.dumps({'user': user}))  # 把人脸信息传回主进程
                        time.sleep(1)
                    else:
                        self._signal_thread.emit(json.dumps({'info': '人脸未录入!'}))
                else:
                    self._signal_thread.emit(json.dumps({'info': '获取人脸失败,请打开摄像头,对准人脸!'}))
            except:
                pass

        # 释放摄像头 release camera
        self.cap.release()
        self.cap = None

    def run(self):
        self.is_exit_run = False
        print('人脸识别进入循环,打开摄像头')
        self.open_login_camera()
        print('人脸识别已退出循环,关闭摄像头')

    def stop(self):
        # 改变线程状态与终止
        self.is_exit_run = True
        self.wait()

6.5、效果

posted @ 2024-07-07 14:01  轻松学编程  阅读(45)  评论(0编辑  收藏  举报