如需完整源码,可以联系博主获取
本系统基于OpenCV使用Haar级联与dlib库进行人脸检测及实时跟踪,应用LBPH算法开发了一个功能相对完整的人脸识别系统。数据存储和GUI设计等几个模块。
sqlite3序列化数据存储
sqlite3是一个轻量级的关系型数据库,支持数据的序列化存储和高效检索。系统部署与演示
需求库:
numpy1.14.2
PyQt55.9.2
PySocks1.6.8
python-telegram-bot10.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库进行人脸检测,确保在各种场景下都能准确、同时,通过序列化存储,我们可以方便地实现数据的备份、身份验证等领域的重要工具。核心源码
importtelegramimportcv2importdlibfromPyQt5.QtCore importQTimer,QThread,pyqtSignal,QRegExp,QtfromPyQt5.QtGui importQImage,QPixmap,QIcon,QTextCursor,QRegExpValidatorfromPyQt5.QtWidgets importQDialog,QApplication,QMainWindow,QMessageBoxfromPyQt5.uic importloadUiimportosimportwebbrowserimportloggingimportlogging.configimportsqlite3importsysimportthreadingimportqueueimportmultiprocessingimportwinsoundfromconfigparser importConfigParserfromdatetime importdatetimeclassTrainingDataNotFoundError(FileNotFoundError):passclassDatabaseNotFoundError(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)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 =FalsedefstartWebcam(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()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)@staticmethoddeftelegramBotPushProcess(queue,img=None):logQueue =queue cfg =ConfigParser()try:cfg.read('./config/telegramBot.cfg',encoding='utf-8-sig')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)ifimg: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 =[]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)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:continuedefreceiveLog(self):whileTrue:data =self.logQueue.get()ifdata:self.receiveLogSignal.emit(data)else:continuedeflogOutput(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()defcloseEvent(self,event):ifself.faceProcessingThread.isRunning:self.faceProcessingThread.stop()ifself.timer.isActive():self.timer.stop()ifself.cap.isOpened():self.cap.release()event.accept()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配置')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:returnTrueclassFaceProcessingThread(QThread):def__init__(self):super(FaceProcessingThread,self).__init__()self.isRunning =Trueself.isFaceTrackerEnabled =Trueself.isFaceRecognizerEnabled =Falseself.isPanalarmEnabled =Trueself.isDebugMode =Falseself.confidenceThreshold =50self.autoAlarmThreshold =65self.isEqualizeHistEnabled =FalsedefenableFaceTracker(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')