当前位置:   article > 正文

毕业设计:python人脸识别系统 深度学习 数据库 OpenCV✅_人脸识别 python

人脸识别 python

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌感兴趣的可以先收藏起来,点赞、关注不迷路✌

毕业设计:2023-2024年计算机毕业设计1000套(建议收藏)

毕业设计:2023-2024年最新最全计算机专业毕业设计选题汇总

1、项目介绍

技术栈:
Python语言、dlib、OpenCV、Pyqt5界面设计、sqlite3数据库
LBPH人脸识别算法
Pycharm + Python3.6 + PyQt5 + OpenCV + 人脸特征模型

本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如果两张图片来源于同一个人,那么两个图片所映射的空间向量距离就很近,否则就会很远。因此,可以通过提取图片并映射到128维空间向量再度量它们的欧氏距离是否足够小来判定是否为同一个人。

方法实现、实现步骤
1、实例化人脸检测模型、人脸关键点检测模型、人脸识别模型
2、电脑摄像头设备加载一对图片
3、分别获取图片中的人脸图片所映射的空间向量,即人脸特征值
4、计算特征向量欧氏距离,根据阈值判断是否为同一个人

2、项目界面

(1)数据库人脸数据管理

在这里插入图片描述

(2)人脸录入
在这里插入图片描述

(3)人摄像头脸识别
在这里插入图片描述

(4)数据库数据管理
在这里插入图片描述

(6)识别记录管理
在这里插入图片描述

(7)人脸数据管理在这里插入图片描述

3、项目说明

Python语言、dlib、OpenCV、Pyqt5界面设计、sqlite3数据库
LBPH人脸识别算法

本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如果两张图片来源于同一个人,那么两个图片所映射的空间向量距离就很近,否则就会很远。因此,可以通过提取图片并映射到128维空间向量再度量它们的欧氏距离是否足够小来判定是否为同一个人。

方法实现、实现步骤
1、实例化人脸检测模型、人脸关键点检测模型、人脸识别模型
2、电脑摄像头设备加载一对图片
3、分别获取图片中的人脸图片所映射的空间向量,即人脸特征值
4、计算特征向量欧氏距离,根据阈值判断是否为同一个人

开发技术环境: Pycharm + Python3.6 + PyQt5 + OpenCV + 人脸特征模型

本系统先调取opencv摄像头进行人脸信息拍照然后识别人脸特征数据,并且录入自己的学号姓名,将识别的人脸特征向量信息保存到人脸数据库当中产生数据记录,并且可以按照学号搜索人脸数据库当中的学生信息,可以修改学生的姓名以及学号等,学生录入进自己的人脸信息后可以进行人脸识别,人脸识别主要是调用opencv打开摄像头拍摄自己的人脸然后调取人脸模型进行识别,将识别到的人脸特征向量和人脸库中的特征向量匹配并计算出相似度,如果匹配相似度太低则提示不存在请您先录入人脸信息,匹配度达到百分七十以及八十以上则匹配出数据库里面对应的学生识别记录,并且形成识别记录,这个识别记录也是可以搜索修改和删除的。

4、核心代码



from view.checkinrecord  import*
from view.checkinmodify import *
from PyQt5.QtWidgets import QWidget,QMessageBox,QAbstractItemView,QTableWidgetItem,QLabel,QDialog
from model.connectsqlite import ConnectSqlite
import model.configuration
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class CheckInRecord(QWidget, Ui_CheckInRecordForm):

    def __init__(self, parent=None):
        super(CheckInRecord, self).__init__(parent)
        self.setupUi(self)
        # sqlite3 connect
        self.dbcon = ConnectSqlite(model.configuration.DATABASE_PATH)
        self.checkin_data = []
        self.pushButton_search.clicked.connect(self.search)
        self.pushButton_modify.clicked.connect(self.modify)
        self.pushButton_delete.clicked.connect(self.delete)
        self.make_table()

    #search
    def search(self):
        print("search")
        search_str = self.lineEdit_search.text()
        # 如果搜索框有数据
        row = 0
        search_result = None
        if search_str != '':
            # 遍历列表并查找
            for i in self.checkin_data:
                if search_str.lower() in str(i[1]).lower():
                    search_result = str(i[1])
                    # 设置目标行
                    self.tableWidget.setCurrentIndex(self.tableWidget.model().index(row,1))
                if search_str.lower() in str(i[0]).lower():
                    search_result = str(i[0])
                    # 设置目标行
                    self.tableWidget.setCurrentIndex(self.tableWidget.model().index(row, 0))
                if search_str.lower() in str(i[2]).lower():
                    search_result = str(i[2])
                    # 设置目标行
                    self.tableWidget.setCurrentIndex(self.tableWidget.model().index(row, 2))
                row += 1
            if search_result == 0:
                reply = QMessageBox.warning(self, 'Error', 'No relevant information was found!',
                                            QMessageBox.Yes, QMessageBox.Yes)
        # 若搜索框没有数据,对话框提示
        else:
            reply = QMessageBox.warning(self, 'Error', 'Please input the search keywords',
                                        QMessageBox.Yes, QMessageBox.Yes)
    # modify
    def modify(self):
        select = self.tableWidget.selectedItems()
        if len(select) != 0:
            row = self.tableWidget.selectedItems()[0].row()  # 获取选中文本所在的行
            column = self.tableWidget.selectedItems()[0].column()
            print(row,column)
            name = str(self.checkin_data[row][1])
            sid = str(self.checkin_data[row][0])

            checkin_time = str(self.checkin_data[row][2])
            id = self.checkin_data[row][-1]
            insert_list = [name,sid,checkin_time]
            dialog = CheckInModify(insert_list)
            dialog.exec_()
            modify_list = dialog.getInputs()
            modify_flag = modify_list[1]
            print("iddddd{}".format(id))
            result = self.dbcon.update_checkin_table(modify_list[0],id)
            if modify_flag:
                if result == 0:
                    self.make_table()
                    reply = QMessageBox.information(self, 'Success', 'Modify succeed!',
                                                QMessageBox.Yes, QMessageBox.Yes)
                else:
                    reply = QMessageBox.warning(self, 'Error', result,
                                                QMessageBox.Yes, QMessageBox.Yes)

        else:
            reply = QMessageBox.warning(self, 'Error', 'Please select the Record need to modify!',
                                        QMessageBox.Yes, QMessageBox.Yes)
    #delete
    def delete(self):
        select = self.tableWidget.selectedItems()
        if len(select) != 0:
            row = self.tableWidget.selectedItems()[0].row()  # 获取选中文本所在的行
            column = self.tableWidget.selectedItems()[0].column()
            id = self.checkin_data[row][-1]
            result = self.dbcon.delete_checkin_table(id)
            if result == 0:
                self.make_table()
                reply = QMessageBox.information(self, 'Success', 'Delete succeed!',
                                                QMessageBox.Yes, QMessageBox.Yes)
            else:
                reply = QMessageBox.warning(self, 'Error', result,
                                            QMessageBox.Yes, QMessageBox.Yes)

        else:
            reply = QMessageBox.warning(self, 'Error', 'Please select the data need to delete!',
                                        QMessageBox.Yes, QMessageBox.Yes)
    # show  database the table
    def make_table(self):
        #clear the table
        self.tableWidget.clear()

        self.checkin_data = self.dbcon.return_all_checkin_record()
        data_show = []
        for row in self.checkin_data:
            name = row[1]
            student_id = str(row[0])
            checkin_time = row[2].split(".")[0]
            data_show.append([name,student_id,checkin_time])


        self.RowLength = 0
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setColumnWidth(0, 220)  # 设置1列的宽度
        self.tableWidget.setColumnWidth(1, 220)  # 设置2列的宽度
        self.tableWidget.setColumnWidth(2, 300)  # 设置3列的宽度


        self.tableWidget.setHorizontalHeaderLabels(["姓名", "学号","进入时间"])
        self.tableWidget.setRowCount(self.RowLength)
        self.tableWidget.verticalHeader().setVisible(False)  # 隐藏垂直表头)
        self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.tableWidget.raise_()

        for row_data in data_show:
            # 显示表格
            self.RowLength = self.RowLength + 1
            label = QLabel()
            self.tableWidget.verticalHeader().setDefaultSectionSize(40)
            self.tableWidget.setRowCount(self.RowLength)
            self.tableWidget.setItem(self.RowLength - 1, 0, QTableWidgetItem(row_data[0]))
            self.tableWidget.setItem(self.RowLength - 1, 1, QTableWidgetItem(row_data[1]))
            self.tableWidget.setItem(self.RowLength - 1, 2, QTableWidgetItem(row_data[2]))  # str(result['Loc'])

            #self.tableWidget.setItem(self.RowLength - 1, 6, QTableWidgetItem(row_data[6]))

            self.tableWidget.item(self.RowLength - 1, 0).setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.item(self.RowLength - 1, 1).setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.item(self.RowLength - 1, 2).setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            #self.tableWidget.item(self.RowLength - 1, 6).setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
    #close
    def close_all(self):
        self.close()
## Check-in Record Modify Dialog
class CheckInModify(QDialog, Ui_Dialog):

    def __init__(self,current_list,parent=None):
        super(CheckInModify, self).__init__(parent)
        self.setupUi(self)
        self.name = current_list[0]
        self.sid = current_list[1]
        self.checkin_time = current_list[2]
        self.lineEdit_sno.setText(self.sid)
        self.lineEdit_name.setText(self.name)
        print(self.checkin_time)
        self.modify_flag = False
        time1 = int(self.checkin_time.split(' ')[1].split(':')[0])
        time2 = int(self.checkin_time.split(' ')[1].split(':')[1])
        time1_format = str('{:0>2d}'.format(time1))
        time2_format = str('{:0>2d}'.format(time2))
        self.timeEdit_checkin.setTime(QTime.fromString(time1_format + ':' + time2_format))
        self.pushButton_add.clicked.connect(self.modify_return)


    def modify_return(self):

            self.modify_flag = True
            self.close()
    def getInputs(self):
        name = self.lineEdit_name.text()
        sid = self.lineEdit_sno.text()

        checkin_time = self.checkin_time.split(' ')[0] + " " + self.timeEdit_checkin.text()
        return [[name,sid,checkin_time],self.modify_flag]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】

推荐阅读
相关标签