程序示例精选
Python+Qt人脸识别门禁管理系统
如需安装运行环境或远程调试,可点击右边博主头像或昵称进入个人主页查看博主联系方式,由专业技术人员远程协助!
前言
这篇博客针对<<Python+Qt人脸识别门禁管理系统>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
文章目录
一、所需工具软件
二、使用步骤
1. 引入库
2. 代码实现
3. 运行结果
三、在线协助
一、所需工具软件
1. Python
2. Qt, OpenCV
二、使用步骤
1.引入库
## coding:utf-8 import sys import os import csv import cv2 from untitled import Ui_mainWindow import record import name from dbase import Record2 from PyQt5 import QtWidgets from PyQt5 import QtWidgets, QtCore, QtGui from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import QPixmap,QPainter
2. 代码实现
代码如下:
class myWin(QtWidgets.QMainWindow, Ui_mainWindow): def __init__(self): super(myWin, self).__init__() self.setupUi(self) self.pushButton_4.clicked.connect(self.onVideo) # self.open_flag = False # self.painter = QPainter(self) # self.pushButton.clicked.connect(self.openFileButton) self.pushButton_2.clicked.connect(self.open_name_ui) self.pushButton_7.clicked.connect(self.train) #self.pushButton_6.clicked.connect(self.faceRecog) self.pushButton_3.clicked.connect(self.open_second_ui) self.pushButton_5.clicked.connect(self.threadRun) self.pushButton_6.clicked.connect(self.switch_video) self.timer2 = VideoTimer() self.timer2.timeSignal.signal[str].connect(self.videoRecog2) self.pushButton_8.clicked.connect(self.recogConform) self.pushButton.hide() self.pushButton_4.hide() def threadRun(self): # thread1.start() if self.pushButton_5.text() == "模型初始化thread": threadSetup() # thread1.start() self.pushButton_5.setText("停止模型thread") elif self.pushButton_5.text() == "停止模型thread": # stop_thread(thread1) # stop_thread(threadT) threadStop() print("tttt6") self.pushButton_5.setText("模型初始化thread") # # 退出系统窗口 X 绑定函数事件 def closeEvent(self, event): # print("test") self.box = QMessageBox(QMessageBox.Warning, "系统提示信息", "是否退出系统?") qyes = self.box.addButton(self.tr("是"), QMessageBox.YesRole) qno = self.box.addButton(self.tr("否"), QMessageBox.NoRole) self.box.exec_() if self.box.clickedButton() == qyes: try: threadStop() except: print("abnormal") event.accept() QtWidgets.QWidget.closeEvent(self, event) sys.exit().accept() else: event.ignore() def switch_video(self): # self.timer2.start() if self.pushButton_6.text() == "开始检测": self.timer2.start() print("tttt6") self.pushButton_6.setText("暂停检测") elif self.pushButton_6.text() == "暂停检测": self.timer2.stop() print("tttt6") self.pushButton_6.setText("开始检测") def videoRecog2(self): # print("im02: ",im02) import cv2 import numpy as np count = 0 recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('face_trainer/trainer.yml') cascadePath = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeClassifier(cascadePath) font = cv2.FONT_HERSHEY_SIMPLEX print("11") gray = cv2.cvtColor(im02, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=5, ) if len(faces) == 0: print("len(faces)", len(faces)) frame = cv2.cvtColor(im02, cv2.COLOR_BGR2RGB) height, width, bytesPerComponent = frame.shape bytesPerLine = bytesPerComponent * width self.q_image = QtGui.QImage(frame.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888).scaled(self.label.height() * 1.5, self.label.height()) self.label.setPixmap(QPixmap.fromImage(self.q_image)) self.update() # if len(faces) == 1: for (x, y, w, h) in faces: idnum, confidence = recognizer.predict(gray[y:y + h, x:x + w]) print("confidence", confidence) print("idnum", idnum) # cv2.putText(img, str(username), (x + 5, y - 5), font, 1, (0, 0, 255), 1) confidence2 = round(160 - confidence) if confidence2 > 80: cv2.rectangle(im02, (x, y), (x + w, y + h), (0, 255, 0), 3) cv2.putText(im02, str(confidence2) + "%", (x + 5, y + h - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (37, 46, 6), 1) if confidence2 <= 80: cv2.rectangle(im02, (x, y), (x + w, y + h), (255, 0, 0), 3) cv2.putText(im02, "unknow", (x + 5, y + h - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (37, 46, 6), 1) frame = cv2.cvtColor(im02, cv2.COLOR_BGR2RGB) height, width, bytesPerComponent = frame.shape bytesPerLine = bytesPerComponent * width self.q_image = QtGui.QImage(frame.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888) \ .scaled(self.label.height() * 1.5, self.label.height()) self.label.setPixmap(QPixmap.fromImage(self.q_image)) self.update() # if confidence2 > 80: print("confidence2", confidence2) global usernamedb global chinese_name global idnumberNum import dbase import sqlite3 import datetime from datetime import datetime conn = sqlite3.connect("recordinfo.db", check_same_thread=False) curr = conn.cursor() curr.execute("select idnumber from name_table") # curr.execute('insert into name_table values (null, ?)', [name]) results = curr.fetchall() name_list = [] for i in results: i = list(i) name_list += i print("name_list", name_list) print("idnum", idnum) usernamedb = name_list[idnum] print("usernamedb", usernamedb) curr.execute("select chinese_name from name_table") results2 = curr.fetchall() name_list2 = [] for i in results2: i = list(i) name_list2 += i print(name_list2) CHusernamedb = name_list2[idnum] print("CHusernamedb", CHusernamedb) chinese_name = CHusernamedb result = 'Ok' curr.execute("select idnumber from name_table") results3 = curr.fetchall() name_list3 = [] for i in results3: i = list(i) name_list3 += i print(name_list3) idnumber = name_list3[idnum] print("idnumber", idnumber) idnumberNum = idnumber # curr.execute('insert into record_table values (null, ?, ?, ?,?,?)', # (usernamedb, datetime.now(), chinese_name, 'Ok', idnumberNum)) conn.commit() conn.rollback() curr.close() conn.close() self.textEdit.setPlainText("姓名" + ' ' + chinese_name + ' ' + "识别成功,门已打开") #self.recogConform() #模拟开门暂时不保存识别数据到数据库,以免人没离开摄像头重复保存多的数据到数据库,暂时用界面上识别手动确认保存识别信息到数据库 # msg_box = QMessageBox(QMessageBox.Warning, '信息', '人脸识别成功') # msg_box.exec_() # frame = cv2.cvtColor(im02, cv2.COLOR_BGR2RGB) # height, width, bytesPerComponent = frame.shape # bytesPerLine = bytesPerComponent * width # # self.q_image = QtGui.QImage(frame.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888) \ # .scaled(self.label.height() * 0.8, self.label.height() * 0.6) # self.label.setPixmap(QPixmap.fromImage(self.q_image)) # self.update() def recogConform(self): global usernamedb global chinese_name global idnumberNum import dbase import sqlite3 import datetime from datetime import datetime conn = sqlite3.connect("recordinfo.db", check_same_thread=False) curr = conn.cursor() curr.execute('insert into record_table values (null, ?, ?, ?,?,?)', (usernamedb, datetime.now(), chinese_name, 'Ok', idnumberNum)) conn.commit() conn.rollback() curr.close() conn.close() self.textEdit.append("识别保存成功") # msg_box = QMessageBox(QMessageBox.Warning, '信息', '识别保存成功') # msg_box.exec_() def openFileButton(self): #imgName, imgType = QFileDialog.getOpenFileName(self,"打开文件","./","files(*.*)") self.cap = cv2.VideoCapture(0) self.pushButton_4.clicked.connect(self.onVideo) # self.open_flag = True # self.painter = QPainter(self) # def onVideo(self): print("self.open_flag: ", self.open_flag) if self.open_flag: self.pushButton_4.setText('Open') print("change1") else: self.pushButton_4.setText('Close') print("change2") self.open_flag = bool(1-self.open_flag) print("change3")
3. 运行结果
三、在线协助:
如需安装运行环境或远程调试, 可点击右边 博主头像 或 昵称 , 进入个人主页查看博主联系方式 ,由专业技术人员远程协助!
1)远程安装运行环境,代码调试
2)Qt, C++, Python入门指导
3)界面美化
4)软件制作
博主推荐文章:python人脸识别统计人数qt窗体-CSDN博客
博主推荐文章:Python Yolov5火焰烟雾识别源码分享-CSDN博客
Python OpenCV识别行人入口进出人数统计_python识别人数-CSDN博客
个人博客主页:alicema1111的博客_CSDN博客-Python,C++,网页领域博主
博主所有文章点这里:alicema1111的博客_CSDN博客-Python,C++,网页领域博主