毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏)
毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、项目介绍
技术栈:
Python语言、dlib人脸识别模块、OpenCV图像处理库、Pyqt5框架界面设计、sqlite3数据库
Pycharm + Python3 + PyQt5 + OpenCV + 人脸特征模型
方法实现、实现步骤
1、实例化人脸检测模型、人脸关键点检测模型、人脸识别模型
2、电脑摄像头设备加载一对图片
3、分别获取图片中的人脸图片所映射的空间向量,即人脸特征值
4、计算特征向量欧氏距离,根据阈值判断是否为同一个人
2、项目界面
(1)人脸录入
(2)人脸识别
(3)数据库管理
(4)识别记录
(5)识别记录管理
3、项目说明
Python语言、dlib人脸识别模块、OpenCV图像处理库、Pyqt5框架界面设计、sqlite3数据库
本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如果两张图片来源于同一个人,那么两个图片所映射的空间向量距离就很近,否则就会很远。因此,可以通过提取图片并映射到128维空间向量再度量它们的欧氏距离是否足够小来判定是否为同一个人。
方法实现、实现步骤
1、实例化人脸检测模型、人脸关键点检测模型、人脸识别模型
2、电脑摄像头设备加载一对图片
3、分别获取图片中的人脸图片所映射的空间向量,即人脸特征值
4、计算特征向量欧氏距离,根据阈值判断是否为同一个人
开发技术环境: Pycharm + Python3 + 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]
5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻