数据存储和GUI设计等几个模块

发布时间:2025-06-24 20:17:53  作者:北方职教升学中心  阅读量:489


在本系统中,OpenCV主要用于视频流的读取、当系统检测到陌生人脸时,将触发报警功能,提醒用户进行进一步处理。人脸ID初始化frameCounter =0currentFaceID =0# 人脸跟踪器字典初始化faceTrackers ={}isTrainingDataLoaded =FalseisDbConnected =Falsewhileself.isRunning:ifCoreUI.cap.isOpened():ret,frame =CoreUI.cap.read()gray =cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)# 是否执行直方图均衡化ifself.isEqualizeHistEnabled:gray =cv2.equalizeHist(gray)faces =faceCascade.detectMultiScale(gray,1.3,5,minSize=(90,90))# 预加载数据文件ifnotisTrainingDataLoaded andos.path.isfile(CoreUI.trainingData):recognizer =cv2.face.LBPHFaceRecognizer_create()recognizer.read(CoreUI.trainingData)isTrainingDataLoaded =TrueifnotisDbConnected andos.path.isfile(CoreUI.database):conn =sqlite3.connect(CoreUI.database)cursor =conn.cursor()isDbConnected =TruecaptureData ={}realTimeFrame =frame.copy()alarmSignal ={}# 人脸跟踪# Reference:https://github.com/gdiepen/face-recognitionifself.isFaceTrackerEnabled:# 要删除的人脸跟踪器列表初始化fidsToDelete =[]forfid infaceTrackers.keys():# 实时跟踪trackingQuality =faceTrackers[fid].update(realTimeFrame)# 如果跟踪质量过低,删除该人脸跟踪器iftrackingQuality <7:fidsToDelete.append(fid)# 删除跟踪质量过低的人脸跟踪器forfid infidsToDelete:faceTrackers.pop(fid,None)for(_x,_y,_w,_h)infaces:isKnown =Falseifself.isFaceRecognizerEnabled:cv2.rectangle(realTimeFrame,(_x,_y),(_x +_w,_y +_h),(232,138,30),2)face_id,confidence =recognizer.predict(gray[_y:_y +_h,_x:_x +_w])logging.debug('face_id:{},confidence:{}'.format(face_id,confidence))ifself.isDebugMode:CoreUI.logQueue.put('Debug -> face_id:{},confidence:{}'.format(face_id,confidence))# 从数据库中获取识别人脸的身份信息try:cursor.execute("SELECT * FROM users WHERE face_id=?",(face_id,))result =cursor.fetchall()ifresult:en_name =result[0][3]else:raiseException exceptException ase:logging.error('读取数据库异常,系统无法获取Face ID为{}的身份信息'.format(face_id))CoreUI.logQueue.put('Error:读取数据库异常,系统无法获取Face ID为{}的身份信息'.format(face_id))en_name =''# 若置信度评分小于置信度阈值,认为是可靠识别ifconfidence <self.confidenceThreshold:isKnown =Truecv2.putText(realTimeFrame,en_name,(_x -5,_y -10),cv2.FONT_HERSHEY_SIMPLEX,1,(0,97,255),2)else:# 若置信度评分大于置信度阈值,该人脸可能是陌生人cv2.putText(realTimeFrame,'unknown',(_x -5,_y -10),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)# 若置信度评分超出自动报警阈值,触发报警信号ifconfidence >self.autoAlarmThreshold:# 检测报警系统是否开启ifself.isPanalarmEnabled:alarmSignal['timestamp']=datetime.now().strftime('%Y%m%d%H%M%S')alarmSignal['img']=realTimeFrame CoreUI.alarmQueue.put(alarmSignal)logging.info('系统发出了报警信号')# 帧数自增frameCounter +=1# 每读取10帧,检测跟踪器的人脸是否还在当前画面内ifframeCounter %10==0:# 这里必须转换成int类型,因为OpenCV人脸检测返回的是numpy.int32类型,# 而dlib人脸跟踪器要求的是int类型x =int(_x)y =int(_y)w =int(_w)h =int(_h)# 计算中心点x_bar =x +0.5*w y_bar =y +0.5*h # matchedFid表征当前检测到的人脸是否已被跟踪matchedFid =Noneforfid infaceTrackers.keys():# 获取人脸跟踪器的位置# tracked_position 是 dlib.drectangle 类型,用来表征图像的矩形区域,坐标是浮点数tracked_position =faceTrackers[fid].get_position()# 浮点数取整t_x =int(tracked_position.left())t_y =int(tracked_position.top())t_w =int(tracked_position.width())t_h =int(tracked_position.height())# 计算人脸跟踪器的中心点t_x_bar =t_x +0.5*t_w t_y_bar =t_y +0.5*t_h # 如果当前检测到的人脸中心点落在人脸跟踪器内,且人脸跟踪器的中心点也落在当前检测到的人脸内# 说明当前人脸已被跟踪if((t_x <=x_bar <=(t_x +t_w))and(t_y <=y_bar <=(t_y +t_h))and(x <=t_x_bar <=(x +w))and(y <=t_y_bar <=(y +h))):matchedFid =fid # 如果当前检测到的人脸是陌生人脸且未被跟踪ifnotisKnown andmatchedFid isNone:# 创建一个人脸跟踪器tracker =dlib.correlation_tracker()# 锁定跟踪范围tracker.start_track(realTimeFrame,dlib.rectangle(x -5,y -10,x +w +5,y +h +10))# 将该人脸跟踪器分配给当前检测到的人脸faceTrackers[currentFaceID]=tracker # 人脸ID自增currentFaceID +=1# 使用当前的人脸跟踪器,更新画面,输出跟踪结果forfid infaceTrackers.keys():tracked_position =faceTrackers[fid].get_position()t_x =int(tracked_position.left())t_y =int(tracked_position.top())t_w =int(tracked_position.width())t_h =int(tracked_position.height())# 在跟踪帧中圈出人脸cv2.rectangle(realTimeFrame,(t_x,t_y),(t_x +t_w,t_y +t_h),(0,0,255),2)cv2.putText(realTimeFrame,'tracking...',(15,30),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),2)captureData['originFrame']=frame captureData['realTimeFrame']=realTimeFrame CoreUI.captureQueue.put(captureData)else:continue# 停止OpenCV线程defstop(self):self.isRunning =Falseself.quit()self.wait()if__name__ =='__main__':logging.config.fileConfig('./config/logging.cfg')app =QApplication(sys.argv)window =CoreUI()window.show()sys.exit(app.exec())

四、OpenCV作为开源的计算机视觉库,为开发高效、相关技术介绍

OpenCV

OpenCV是一个开源的计算机视觉库,包含了大量的图像和视频处理函数,适用于实时计算机视觉。'informativeText ='<b>是否继续?</b>'ret =CoreUI.callDialog(QMessageBox.Warning,text,informativeText,QMessageBox.Yes |QMessageBox.No,QMessageBox.No)ifret ==QMessageBox.Yes:self.faceProcessingThread.stop()ifself.cap.isOpened():ifself.timer.isActive():self.timer.stop()self.cap.release()self.realTimeCaptureLabel.clear()self.realTimeCaptureLabel.setText('<font color=red>摄像头未开启</font>')self.startWebcamButton.setText('摄像头已关闭')self.startWebcamButton.setEnabled(False)self.startWebcamButton.setIcon(QIcon())# 定时器,实时更新画面defupdateFrame(self):ifself.cap.isOpened():# ret, frame = self.cap.read()# if ret:# self.showImg(frame, self.realTimeCaptureLabel)ifnotself.captureQueue.empty():captureData =self.captureQueue.get()realTimeFrame =captureData.get('realTimeFrame')self.displayImage(realTimeFrame,self.realTimeCaptureLabel)# 显示图片defdisplayImage(self,img,qlabel):# BGR -> RGBimg =cv2.cvtColor(img,cv2.COLOR_BGR2RGB)# default:The image is stored using 8-bit indexes into a colormap, for example:a gray imageqformat =QImage.Format_Indexed8 iflen(img.shape)==3:# rows[0], cols[1], channels[2]ifimg.shape[2]==4:# The image is stored using a 32-bit byte-ordered RGBA format (8-8-8-8)# A: alpha channel,不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的qformat =QImage.Format_RGBA8888 else:qformat =QImage.Format_RGB888 # img.shape[1]:图像宽度width,img.shape[0]:图像高度height,img.shape[2]:图像通道数# QImage.__init__ (self, bytes data, int width, int height, int bytesPerLine, Format format)# 从内存缓冲流获取img数据构造QImage类# img.strides[0]:每行的字节数(width*3),rgb为3,rgba为4# strides[0]为最外层(即一个二维数组所占的字节长度),strides[1]为次外层(即一维数组所占字节长度),strides[2]为最内层(即一个元素所占字节长度)# 从里往外看,strides[2]为1个字节长度(uint8),strides[1]为3*1个字节长度(3即rgb 3个通道)# strides[0]为width*3个字节长度,width代表一行有几个像素outImage =QImage(img,img.shape[1],img.shape[0],img.strides[0],qformat)qlabel.setPixmap(QPixmap.fromImage(outImage))qlabel.setScaledContents(True)# 图片自适应大小# 报警系统:是否允许设备响铃defenableBell(self,bellCheckBox):ifbellCheckBox.isChecked():self.isBellEnabled =Trueself.statusBar().showMessage('设备发声:开启')else:ifself.isTelegramBotPushEnabled:self.isBellEnabled =Falseself.statusBar().showMessage('设备发声:关闭')else:self.logQueue.put('Error:操作失败,至少选择一种报警方式')self.bellCheckBox.setCheckState(Qt.Unchecked)self.bellCheckBox.setChecked(True)# print('isBellEnabled:', self.isBellEnabled)# 报警系统:是否允许TelegramBot推送defenableTelegramBotPush(self,telegramBotPushCheckBox):iftelegramBotPushCheckBox.isChecked():self.isTelegramBotPushEnabled =Trueself.statusBar().showMessage('TelegramBot推送:开启')else:ifself.isBellEnabled:self.isTelegramBotPushEnabled =Falseself.statusBar().showMessage('TelegramBot推送:关闭')else:self.logQueue.put('Error:操作失败,至少选择一种报警方式')self.telegramBotPushCheckBox.setCheckState(Qt.Unchecked)self.telegramBotPushCheckBox.setChecked(True)# print('isTelegramBotPushEnabled:', self.isTelegramBotPushEnabled)# TelegramBot设置deftelegramBotSettings(self):cfg =ConfigParser()cfg.read('./config/telegramBot.cfg',encoding='utf-8-sig')read_only =cfg.getboolean('telegramBot','read_only')# read_only = Falseifread_only:text ='基于安全考虑,系统拒绝了本次请求。结论与展望

本论文基于OpenCV设计并实现了一个功能相对完整的视频人脸识别检测系统。图像预处理、'informativeText ='<b>请联系设备管理员。

如需完整源码,可以联系博主获取

本系统基于OpenCV使用Haar级联与dlib库进行人脸检测及实时跟踪,应用LBPH算法开发了一个功能相对完整的人脸识别系统。数据存储和GUI设计等几个模块。

sqlite3序列化数据存储

sqlite3是一个轻量级的关系型数据库,支持数据的序列化存储和高效检索。系统部署与演示
需求库:
numpy1.14.2
PyQt5
5.9.2
PySocks1.6.8
python-telegram-bot
10.0.1

创建Python虚拟环境

$ conda create -n opencv python=3.6$ activate opencv

安装OpenCV

$ cd modules$ pip install opencv_python-3.4.1+contrib-cp36-cp36m-win_amd64.whl

安装dlib

$ pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl

安装其它依赖包

$ cd ..$ pip install -r requirements.txt

运行核心框架

$ python core.py

运行人脸采集系统

$ python dataRecord.py

运行数据管理系统

$ python dataManage.py

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

六、接着,提取人脸特征并使用LBPH算法进行识别。首先,通过OpenCV读取视频流并进行预处理。识别结果将存储在sqlite3数据库中,并通过PyQt5设计的GUI展示给用户。

LBPH算法

LBPH(Local Binary Patterns Histograms)是一种基于局部二值模式直方图的人脸识别算法。

三、dlib库则提供了人脸检测与关键点定位的算法实现。然后,利用Haar级联与dlib库进行人脸检测,并通过实时跟踪算法确保人脸位置的准确性。本论文旨在基于OpenCV设计并实现一个功能相对完整的视频人脸识别检测系统,该系统采用Haar级联与dlib库进行人脸检测及实时跟踪,应用LBPH算法进行人脸识别,并使用sqlite3进行序列化数据存储。稳定的人脸识别检测系统提供了强大的支持。人脸识别、人脸检测与跟踪、在本系统中,我们结合使用Haar级联与dlib库进行人脸检测,确保在各种场景下都能准确、同时,通过序列化存储,我们可以方便地实现数据的备份、身份验证等领域的重要工具。核心源码

#!/usr/bin/env python3importtelegramimportcv2importdlibfromPyQt5.QtCore importQTimer,QThread,pyqtSignal,QRegExp,QtfromPyQt5.QtGui importQImage,QPixmap,QIcon,QTextCursor,QRegExpValidatorfromPyQt5.QtWidgets importQDialog,QApplication,QMainWindow,QMessageBoxfromPyQt5.uic importloadUiimportosimportwebbrowserimportloggingimportlogging.configimportsqlite3importsysimportthreadingimportqueueimportmultiprocessingimportwinsoundfromconfigparser importConfigParserfromdatetime importdatetime# 找不到已训练的人脸数据文件classTrainingDataNotFoundError(FileNotFoundError):pass# 找不到数据库文件classDatabaseNotFoundError(FileNotFoundError):passclassCoreUI(QMainWindow):database ='./FaceBase.db'trainingData ='./recognizer/trainingData.yml'cap =cv2.VideoCapture()captureQueue =queue.Queue()# 图像队列alarmQueue =queue.LifoQueue()# 报警队列,后进先出logQueue =multiprocessing.Queue()# 日志队列receiveLogSignal =pyqtSignal(str)# LOG信号def__init__(self):super(CoreUI,self).__init__()loadUi('./ui/Core.ui',self)self.setWindowIcon(QIcon('./icons/icon.png'))self.setFixedSize(1161,623)# 图像捕获self.isExternalCameraUsed =Falseself.useExternalCameraCheckBox.stateChanged.connect(lambda:self.useExternalCamera(self.useExternalCameraCheckBox))self.faceProcessingThread =FaceProcessingThread()self.startWebcamButton.clicked.connect(self.startWebcam)# 数据库self.initDbButton.setIcon(QIcon('./icons/warning.png'))self.initDbButton.clicked.connect(self.initDb)self.timer =QTimer(self)# 初始化一个定时器self.timer.timeout.connect(self.updateFrame)# 功能开关self.faceTrackerCheckBox.stateChanged.connect(lambda:self.faceProcessingThread.enableFaceTracker(self))self.faceRecognizerCheckBox.stateChanged.connect(lambda:self.faceProcessingThread.enableFaceRecognizer(self))self.panalarmCheckBox.stateChanged.connect(lambda:self.faceProcessingThread.enablePanalarm(self))# 直方图均衡化self.equalizeHistCheckBox.stateChanged.connect(lambda:self.faceProcessingThread.enableEqualizeHist(self))# 调试模式self.debugCheckBox.stateChanged.connect(lambda:self.faceProcessingThread.enableDebug(self))self.confidenceThresholdSlider.valueChanged.connect(lambda:self.faceProcessingThread.setConfidenceThreshold(self))self.autoAlarmThresholdSlider.valueChanged.connect(lambda:self.faceProcessingThread.setAutoAlarmThreshold(self))# 报警系统self.alarmSignalThreshold =10self.panalarmThread =threading.Thread(target=self.recieveAlarm,daemon=True)self.isBellEnabled =Trueself.bellCheckBox.stateChanged.connect(lambda:self.enableBell(self.bellCheckBox))self.isTelegramBotPushEnabled =Falseself.telegramBotPushCheckBox.stateChanged.connect(lambda:self.enableTelegramBotPush(self.telegramBotPushCheckBox))self.telegramBotSettingsButton.clicked.connect(self.telegramBotSettings)# 帮助与支持self.viewGithubRepoButton.clicked.connect(lambda:webbrowser.open('https://github.com/winterssy/face_recognition_py'))self.contactDeveloperButton.clicked.connect(lambda:webbrowser.open('https://t.me/winterssy'))# 日志系统self.receiveLogSignal.connect(lambdalog:self.logOutput(log))self.logOutputThread =threading.Thread(target=self.receiveLog,daemon=True)self.logOutputThread.start()# 检查数据库状态definitDb(self):try:ifnotos.path.isfile(self.database):raiseDatabaseNotFoundError            ifnotos.path.isfile(self.trainingData):raiseTrainingDataNotFoundError            conn =sqlite3.connect(self.database)cursor =conn.cursor()cursor.execute('SELECT Count(*) FROM users')result =cursor.fetchone()dbUserCount =result[0]exceptDatabaseNotFoundError:logging.error('系统找不到数据库文件{}'.format(self.database))self.initDbButton.setIcon(QIcon('./icons/error.png'))self.logQueue.put('Error:未发现数据库文件,你可能未进行人脸采集')exceptTrainingDataNotFoundError:logging.error('系统找不到已训练的人脸数据{}'.format(self.trainingData))self.initDbButton.setIcon(QIcon('./icons/error.png'))self.logQueue.put('Error:未发现已训练的人脸数据文件,请完成训练后继续')exceptException ase:logging.error('读取数据库异常,无法完成数据库初始化')self.initDbButton.setIcon(QIcon('./icons/error.png'))self.logQueue.put('Error:读取数据库异常,初始化数据库失败')else:cursor.close()conn.close()ifnotdbUserCount >0:logging.warning('数据库为空')self.logQueue.put('warning:数据库为空,人脸识别功能不可用')self.initDbButton.setIcon(QIcon('./icons/warning.png'))else:self.logQueue.put('Success:数据库状态正常,发现用户数:{}'.format(dbUserCount))self.initDbButton.setIcon(QIcon('./icons/success.png'))self.initDbButton.setEnabled(False)self.faceRecognizerCheckBox.setToolTip('须先开启人脸跟踪')self.faceRecognizerCheckBox.setEnabled(True)# 是否使用外接摄像头defuseExternalCamera(self,useExternalCameraCheckBox):ifuseExternalCameraCheckBox.isChecked():self.isExternalCameraUsed =Trueelse:self.isExternalCameraUsed =False# 打开/关闭摄像头defstartWebcam(self):ifnotself.cap.isOpened():ifself.isExternalCameraUsed:camID =1else:camID =0self.cap.open(camID)self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)ret,frame =self.cap.read()ifnotret:logging.error('无法调用电脑摄像头{}'.format(camID))self.logQueue.put('Error:初始化摄像头失败')self.cap.release()self.startWebcamButton.setIcon(QIcon('./icons/error.png'))else:self.faceProcessingThread.start()# 启动OpenCV图像处理线程self.timer.start(5)# 启动定时器self.panalarmThread.start()# 启动报警系统线程self.startWebcamButton.setIcon(QIcon('./icons/success.png'))self.startWebcamButton.setText('关闭摄像头')else:text ='如果关闭摄像头,须重启程序才能再次打开。在本系统中,我们采用LBPH算法进行人脸识别,实现对已知人脸的准确识别。该系统采用先进的人脸检测与识别算法,结合sqlite3数据库和PyQt5 GUI设计,实现了高效、</b>'CoreUI.callDialog(QMessageBox.Critical,text,informativeText,QMessageBox.Ok)else:token =cfg.get('telegramBot','token')chat_id =cfg.get('telegramBot','chat_id')proxy_url =cfg.get('telegramBot','proxy_url')message =cfg.get('telegramBot','message')self.telegramBotDialog =TelegramBotDialog()self.telegramBotDialog.tokenLineEdit.setText(token)self.telegramBotDialog.telegramIDLineEdit.setText(chat_id)self.telegramBotDialog.socksLineEdit.setText(proxy_url)self.telegramBotDialog.messagePlainTextEdit.setPlainText(message)self.telegramBotDialog.exec()# 设备响铃进程@staticmethoddefbellProcess(queue):logQueue =queue        logQueue.put('Info:设备正在响铃...')winsound.PlaySound('./alarm.wav',winsound.SND_FILENAME)# TelegramBot推送进程@staticmethoddeftelegramBotPushProcess(queue,img=None):logQueue =queue        cfg =ConfigParser()try:cfg.read('./config/telegramBot.cfg',encoding='utf-8-sig')# 读取TelegramBot配置token =cfg.get('telegramBot','token')chat_id =cfg.getint('telegramBot','chat_id')proxy_url =cfg.get('telegramBot','proxy_url')message =cfg.get('telegramBot','message')# 是否使用代理ifproxy_url:proxy =telegram.utils.request.Request(proxy_url=proxy_url)bot =telegram.Bot(token=token,request=proxy)else:bot =telegram.Bot(token=token)bot.send_message(chat_id=chat_id,text=message)# 发送疑似陌生人脸截屏到Telegramifimg:bot.send_photo(chat_id=chat_id,photo=open(img,'rb'),timeout=10)exceptException ase:logQueue.put('Error:TelegramBot推送失败')else:logQueue.put('Success:TelegramBot推送成功')# 报警系统服务常驻,接收并处理报警信号defrecieveAlarm(self):whileTrue:jobs =[]# print(self.alarmQueue.qsize())ifself.alarmQueue.qsize()>self.alarmSignalThreshold:# 若报警信号触发超出既定计数,进行报警ifnotos.path.isdir('./unknown'):os.makedirs('./unknown')lastAlarmSignal =self.alarmQueue.get()timestamp =lastAlarmSignal.get('timestamp')img =lastAlarmSignal.get('img')# 疑似陌生人脸,截屏存档cv2.imwrite('./unknown/{}.jpg'.format(timestamp),img)logging.info('报警信号触发超出预设计数,自动报警系统已被激活')self.logQueue.put('Info:报警信号触发超出预设计数,自动报警系统已被激活')# 是否进行响铃ifself.isBellEnabled:p1 =multiprocessing.Process(target=CoreUI.bellProcess,args=(self.logQueue,))p1.start()jobs.append(p1)# 是否进行TelegramBot推送ifself.isTelegramBotPushEnabled:ifos.path.isfile('./unknown/{}.jpg'.format(timestamp)):img ='./unknown/{}.jpg'.format(timestamp)else:img =Nonep2 =multiprocessing.Process(target=CoreUI.telegramBotPushProcess,args=(self.logQueue,img))p2.start()jobs.append(p2)# 等待本轮报警结束forp injobs:p.join()# 重置报警信号withself.alarmQueue.mutex:self.alarmQueue.queue.clear()else:continue# 系统日志服务常驻,接收并处理系统日志defreceiveLog(self):whileTrue:data =self.logQueue.get()ifdata:self.receiveLogSignal.emit(data)else:continue# LOG输出deflogOutput(self,log):# 获取当前系统时间time =datetime.now().strftime('[%Y/%m/%d %H:%M:%S]')log =time +' '+log +'\n'self.logTextEdit.moveCursor(QTextCursor.End)self.logTextEdit.insertPlainText(log)self.logTextEdit.ensureCursorVisible()# 自动滚屏# 系统对话框@staticmethoddefcallDialog(icon,text,informativeText,standardButtons,defaultButton=None):msg =QMessageBox()msg.setWindowIcon(QIcon('./icons/icon.png'))msg.setWindowTitle('OpenCV Face Recognition System - Core')msg.setIcon(icon)msg.setText(text)msg.setInformativeText(informativeText)msg.setStandardButtons(standardButtons)ifdefaultButton:msg.setDefaultButton(defaultButton)returnmsg.exec()# 窗口关闭事件,关闭OpenCV线程、人脸识别参数的配置以及识别结果的查看等操作。此外,系统还集成了基于PyQt5设计的图形用户界面(GUI),能够实现对陌生人脸的识别与报警功能。在本系统中,我们使用PyQt5设计并实现了友好的用户界面,使得用户可以方便地进行视频流的选择、它通过计算图像局部区域的二值模式并统计直方图来提取特征,对于光照变化和表情变化具有一定的鲁棒性。在本系统中,我们使用sqlite3存储人脸特征数据,以便在识别过程中快速匹配。系统设计与实现

本系统主要分为视频流处理、摄像头defcloseEvent(self,event):ifself.faceProcessingThread.isRunning:self.faceProcessingThread.stop()ifself.timer.isActive():self.timer.stop()ifself.cap.isOpened():self.cap.release()event.accept()# TelegramBot设置对话框classTelegramBotDialog(QDialog):def__init__(self):super(TelegramBotDialog,self).__init__()loadUi('./ui/TelegramBotDialog.ui',self)self.setWindowIcon(QIcon('./icons/icon.png'))self.setFixedSize(550,358)chat_id_regx =QRegExp('^\d+$')chat_id_validator =QRegExpValidator(chat_id_regx,self.telegramIDLineEdit)self.telegramIDLineEdit.setValidator(chat_id_validator)self.okButton.clicked.connect(self.telegramBotSettings)deftelegramBotSettings(self):# 获取用户输入token =self.tokenLineEdit.text().strip()chat_id =self.telegramIDLineEdit.text().strip()proxy_url =self.socksLineEdit.text().strip()message =self.messagePlainTextEdit.toPlainText().strip()# 校验并处理用户输入ifnot(token andchat_id andmessage):self.okButton.setIcon(QIcon('./icons/error.png'))CoreUI.logQueue.put('Error:API Token、定时器、迁移和共享。系统采用sqlite3进行序列化数据存储,能够对陌生人脸闯入进行报警,并拥有基于PyQt5设计的GUI实现。准确的人脸识别与实时跟踪功能。

一、特征提取与匹配等关键环节。引言

随着计算机视觉和人工智能技术的快速发展,人脸识别技术已经成为现代社会安全监控、

二、未来,我们将进一步优化算法性能,提升系统的识别速度和准确率,并探索更多应用场景下的人脸识别技术。快速地定位人脸。

五、

Haar级联与dlib库

Haar级联是一种基于特征的检测器,通过训练大量的正负样本来学习目标的特征。Telegram ID和消息内容为必填项')else:ret =self.telegramBotTest(token,proxy_url)ifret:cfg_file ='./config/telegramBot.cfg'cfg =ConfigParser()cfg.read(cfg_file,encoding='utf-8-sig')cfg.set('telegramBot','token',token)cfg.set('telegramBot','chat_id',chat_id)cfg.set('telegramBot','proxy_url',proxy_url)cfg.set('telegramBot','message',message)try:withopen(cfg_file,'w',encoding='utf-8')asfile:cfg.write(file)except:logging.error('写入telegramBot配置文件发生异常')CoreUI.logQueue.put('Error:写入配置文件时发生异常,更新失败')else:CoreUI.logQueue.put('Success:测试通过,系统已更新TelegramBot配置')self.close()else:CoreUI.logQueue.put('Error:测试失败,无法更新TelegramBot配置')# TelegramBot 测试deftelegramBotTest(self,token,proxy_url):try:# 是否使用代理ifproxy_url:proxy =telegram.utils.request.Request(proxy_url=proxy_url)bot =telegram.Bot(token=token,request=proxy)else:bot =telegram.Bot(token=token)bot.get_me()exceptException ase:returnFalseelse:returnTrue# OpenCV线程classFaceProcessingThread(QThread):def__init__(self):super(FaceProcessingThread,self).__init__()self.isRunning =Trueself.isFaceTrackerEnabled =Trueself.isFaceRecognizerEnabled =Falseself.isPanalarmEnabled =Trueself.isDebugMode =Falseself.confidenceThreshold =50self.autoAlarmThreshold =65self.isEqualizeHistEnabled =False# 是否开启人脸跟踪defenableFaceTracker(self,coreUI):ifcoreUI.faceTrackerCheckBox.isChecked():self.isFaceTrackerEnabled =TruecoreUI.statusBar().showMessage('人脸跟踪:开启')else:self.isFaceTrackerEnabled =FalsecoreUI.statusBar().showMessage('人脸跟踪:关闭')# 是否开启人脸识别defenableFaceRecognizer(self,coreUI):ifcoreUI.faceRecognizerCheckBox.isChecked():ifself.isFaceTrackerEnabled:self.isFaceRecognizerEnabled =TruecoreUI.statusBar().showMessage('人脸识别:开启')else:CoreUI.logQueue.put('Error:操作失败,请先开启人脸跟踪')coreUI.faceRecognizerCheckBox.setCheckState(Qt.Unchecked)coreUI.faceRecognizerCheckBox.setChecked(False)else:self.isFaceRecognizerEnabled =FalsecoreUI.statusBar().showMessage('人脸识别:关闭')# 是否开启报警系统defenablePanalarm(self,coreUI):ifcoreUI.panalarmCheckBox.isChecked():self.isPanalarmEnabled =TruecoreUI.statusBar().showMessage('报警系统:开启')else:self.isPanalarmEnabled =FalsecoreUI.statusBar().showMessage('报警系统:关闭')# 是否开启调试模式defenableDebug(self,coreUI):ifcoreUI.debugCheckBox.isChecked():self.isDebugMode =TruecoreUI.statusBar().showMessage('调试模式:开启')else:self.isDebugMode =FalsecoreUI.statusBar().showMessage('调试模式:关闭')# 设置置信度阈值defsetConfidenceThreshold(self,coreUI):ifself.isDebugMode:self.confidenceThreshold =coreUI.confidenceThresholdSlider.value()coreUI.statusBar().showMessage('置信度阈值:{}'.format(self.confidenceThreshold))# 设置自动报警阈值defsetAutoAlarmThreshold(self,coreUI):ifself.isDebugMode:self.autoAlarmThreshold =coreUI.autoAlarmThresholdSlider.value()coreUI.statusBar().showMessage('自动报警阈值:{}'.format(self.autoAlarmThreshold))# 直方图均衡化defenableEqualizeHist(self,coreUI):ifcoreUI.equalizeHistCheckBox.isChecked():self.isEqualizeHistEnabled =TruecoreUI.statusBar().showMessage('直方图均衡化:开启')else:self.isEqualizeHistEnabled =FalsecoreUI.statusBar().showMessage('直方图均衡化:关闭')defrun(self):faceCascade =cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')# 帧数、

PyQt5 GUI设计

PyQt5是一个用于创建图形用户界面的Python库,基于Qt框架。

通过本系统的设计与实现,我们为相关领域的研究者和实践者提供了一个有效的技术解决方案,并为人脸识别技术的发展和应用推广做出了积极贡献。