基于树莓派的人脸识别门禁系统(代码片段)

Fle Fle     2022-11-30     508

关键词:

一、树莓派Opencv以及扩展模块的安装

1、概述:本次在树莓派上安装Opencv及其扩展模块,考虑到树莓派的SD卡容量和内存的限制,不采用直接pip安装方法,而采用编译Opencv源码的方式进行安装。
2、遇到的问题及解决方法

遇到的问题解决方法
缺少”cuda.hpp”将/home/pi/opencv_contrib3.4.1/modules/xfeatures2d/include/opencv2下的xfeatures2d文件夹复制到home/pi/opencv-3.4.1/modules/stitching/include/opencv2下
缺少”bosstdesc_bgm.i”下载对应的文件到opencv_contrib/modules/xfeatures2d/src下
运行至99%时树莓派卡死原本采用make -j4进行源码编译加速,但是多次尝试仍然卡死,之后采用make解决了问题,可能原因是make -j4所需的交换空间太大导致卡死。

3、运行结果

导入opencv库没有问题,说明安装成功。

二、树莓派人脸检测

1、概述:本次在树莓派上检测人脸用Opencv自带的Haar特征分类器。
2、代码编写:
将.xml文件拷贝到mu_code文件夹下,在mu_code下编写代码,则工程的根目录默认在mu_code。

import cv2
cap=cv2.VideoCapture(0)
cascadePath = "/home/pi/opencv-3.4.3/data/haarcascades/haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)
while (True):
    ret, img = cap.read()
    # 灰度化处理
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray, 1.3, 5)
    if len(faces)!=0:
        x = faces[0][0]
        y = faces[0][1]
        w = faces[0][2]
        h = faces[0][3]
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
    cv2.imshow("fle",img)
    cv2.waitKey(10)

3、运行结果:

由图中可以看出可以正确检测出人脸。

三、树莓派人脸识别

1、概述:
本次在树莓派上进行人脸识别采用OpenCV人脸识别类LBPHFaceRecognizer。
2、代码编写:

import cv2
from PIL import Image
import numpy as np
imagePath="face.png"
img_face=cv2.imread(imagePath,0)
cv2.imshow("fle",img_face)
cv2.waitKey(0)
recognizer = cv2.face.LBPHFaceRecognizer_create()
PIL_img = Image.open(imagePath).convert('L')
img_numpy = np.array(PIL_img, 'uint8')
faces=[]
ids=[]
faces.append(img_numpy)
ids.append(2)
recognizer.train(faces, np.array(ids))
id, confidence = recognizer.predict(img_face)
print("id=",id)
print("confidence=",confidence)

3、运行结果:


人脸图片用于训练,用于训练的id是2,这里只是为了检测代码的正确性,所以依然用这张图片是做识别,识别的结果是id=2,confidence≈9.8。Id号识别正确,confidence接近于0,说明识别率很高。

四、树莓派利用双色LED模拟开关门动作

1、概述:
设计一个双色LED类,该类应该能够向外提供两个方法,分别设置红灯和绿灯的PWM。
这里在主函数调用是都是设置为满PWM。
2、接线

树莓派3mm双色LED模块
GND负极(-)
P17红色灯正极(中间引脚)
P18绿色灯正极

3、代码编写

import RPi.GPIO as GPIO
import time
class Double_LED_Class:
    def __init__(self):  # double_led 初始化工作
        makerobo_pins = (11, 12)  # PIN管脚字典
        GPIO.setmode(GPIO.BOARD)  # 采用实际的物理管脚给GPIO口
        GPIO.setwarnings(False)  # 去除GPIO口警告
        GPIO.setup(makerobo_pins, GPIO.OUT)  # 设置Pin模式为输出模式
        GPIO.output(makerobo_pins, GPIO.LOW)  # 设置Pin管脚为低电平(0V)关闭LED
        self.p_R = GPIO.PWM(makerobo_pins[0], 2000)  # 设置频率为2KHz
        self.p_G = GPIO.PWM(makerobo_pins[1], 2000)  # 设置频率为2KHz
        # 初始化占空比为0(led关闭)
        self.p_R.start(0)
        self.p_G.start(0)
    def makerobo_pwm_map(self,x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
    def makerobo_set_red_Color(self,col):  # 例如:col = 0x1122
        # 把0-255的范围同比例缩小到0-100之间
        R_val = self.makerobo_pwm_map(col, 0, 255, 0, 100)
        self.p_R.ChangeDutyCycle(R_val)  # 改变占空比
    def makerobo_set_green_Color(self,col):  # 例如:col = 0x1122
        # 把0-255的范围同比例缩小到0-100之间
        G_val = self.makerobo_pwm_map(col, 0, 255, 0, 100)
        self.p_G.ChangeDutyCycle(G_val)  # 改变占空比
    # 释放资源
    def makerobo_destroy(self):
        self.p_G.stop()
        self.p_R.stop()
        GPIO.output(self.makerobo_pins, GPIO.LOW)  # 关闭所有LED
        GPIO.cleanup()  # 释放资源

# 测试用例
if __name__ == "__main__":
    Hardware_double_led=Double_LED_Class()
    Hardware_double_led.makerobo_set_red_Color(200)
    time.sleep(3)#显示红灯3s后显示绿灯
    Hardware_double_led.makerobo_set_red_Color(0)
    Hardware_double_led.makerobo_set_green_Color(200)

4、运行结果

五、树莓派门禁系统界面设计与整体逻辑代码整合

1、概述:
树莓派门禁系统总共包括4个界面设计,分别是人脸识别开门界面、管理员登录界面、人脸录入界面、人脸数据库展示界面。这四个界面都用PyQt5进行设计,先在Window上用Qt Designer搭建界面,用Python编写逻辑关系,最后移植到树莓派上,树莓派上只需要安装PyQt库即可运行程序。
下面为四个界面的展示图:




界面控件的逻辑关系如下图:

2、代码编写:
代码思路:

创建了四个界面类,分别继承于用Qt Designer创建 的四个界面类,这样做是为了能够在更改界面的时候不会改变逻辑部分代码。另外创建了一个数据库操作类,主要是为了能够查询,读写数据库,这里采用的是SQlite数据库。
Main文件:

#########################################
#Author:郭先达
#date:2021.12.22
#######################################33
import sys
import cv2
import threading
from PyQt5.QtCore import QBasicTimer
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit, QGridLayout, QMessageBox, QGroupBox
from PyQt5 import QtWidgets
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QLabel, QApplication
from PIL import Image
import numpy as np
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import QPalette, QBrush, QPixmap
from PyQt5.QtSql import *
import time
from double_led import Double_LED_Class
import os

from MainWindow import Ui_Dialog as Ui_Dialog_MainWindow
from Admin_enter import Ui_Dialog as Ui_Dialog_Admin_enter
from Face_rec import Ui_Dialog as Ui_Dialog_Face_rec
from SQliteWindow import Ui_Dialog as Ui_Dialog_SQliteWindow

# 导入OpenCV自带的数据集,定义多个是因为在后面有多次调用,用一个的话会报错
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade1 = cv2.CascadeClassifier(cascadePath)
faceCascade2= cv2.CascadeClassifier(cascadePath)
faceCascade3 = cv2.CascadeClassifier(cascadePath)
faceCascade4=cv2.CascadeClassifier(cascadePath)

#人脸识别开门界面
class Fle_MainWindow(QDialog,Ui_Dialog_MainWindow):
    def __init__(self):
        super(Fle_MainWindow,self).__init__()
        self.setupUi(self)
        # 创建定时器,定时器用来定时拍照
        self.timer_camera = QtCore.QTimer()
        self.user = []
        #进入人脸识别开门界面之前先把所有数据训练一遍,以满足新数据的录入
        self.recognizer = cv2.face.LBPHFaceRecognizer_create()
        faces, ids = self.getImagesAndLabels("./Face_data")#拍摄的照片放在这个文件夹下
        self.recognizer.train(faces, np.array(ids))#开始训练

        self.font = cv2.FONT_HERSHEY_SIMPLEX
        #摄像头初始化
        self.camera_init()
        #绑定函数show_camera
        self.timer_camera.timeout.connect(self.show_camera)
        #30ms拍一次照片
        self.timer_camera.start(30)

        # 点击管理员按钮事件
        self.pushButton_administrators.clicked.connect(self.slot_btn_admin)
        #新建一个双色LED类
        self.Hardware_double_led=Double_LED_Class()

    # 函数获取图像和标签数据
    def getImagesAndLabels(self,path):
        imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
        faceSamples = []#人脸数据
        ids = []#人脸对应的id标签
        for imagePath in imagePaths:
            # 转换为灰度
            PIL_img = Image.open(imagePath).convert('L')
            img_numpy = np.array(PIL_img, 'uint8')
            #print(imagePath),打印出具体信息,怎么分割就怎么设置序号
            id = int(imagePath.split("/")[2].split(".")[1])
            faces = faceCascade3.detectMultiScale(img_numpy)
            for (x, y, w, h) in faces:
                faceSamples.append(img_numpy[y:y + h, x:x + w])
                ids.append(id)
        print(ids)
        return faceSamples, ids

    def camera_init(self):
        # 打开设置摄像头对象
        self.cap = cv2.VideoCapture(0)
        self.__flag_work = 0
        self.x = 0
        self.count = 0
        #这里的minW和minH用于限制人脸的最小宽高,防止误测
        self.minW = 0.2 * self.cap.get(3)#视频流的帧宽度
        self.minH = 0.2 * self.cap.get(4)#视频流的帧高度

    def show_camera(self):
        flag, self.image = self.cap.read()
        # 将图片变化成灰度图
        gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
        # 探测图片中的人脸
        faces = faceCascade1.detectMultiScale(
            gray,
            scaleFactor=1.2,
            minNeighbors=5,
            minSize=(int(self.minW), int(self.minH)),
        )
        # 判断是否检测到人脸,检测到设置为绿灯,没检测到设置为红灯
        if len(faces)!=0:
            #下面这个操作是为了能够只检测到一张脸,检测面积最大的那个脸
            WxH_max=0 #人脸矩形的面积
            WxH_max_face=faces[0]
            for i in faces:
                if(i[2]*i[3]>WxH_max):
                    WxH_max=i[2]*i[3]
                    WxH_max_face=i
            # 围绕脸的框
            x=WxH_max_face[0]
            y = WxH_max_face[1]
            w = WxH_max_face[2]
            h = WxH_max_face[3]
            cv2.rectangle(self.image, (x, y), (x + w, y + h), (0, 255, 0), 2)
            #用recognizer进行识别判断
            id, confidence = self.recognizer.predict(gray[y:y + h, x:x + w])
            # 对置信度进行判断,这里设定为70
            if (confidence < 70):
                confidence = "  0%".format(round(100 - confidence))
                for i in range(0,mysqlite.get_rows()):
                    if mysqlite.find_data(i,0)==id:
                        self.label_ID.setText(str(mysqlite.find_data(i,1)))
                        self.label_name.setText(str(mysqlite.find_data(i,2)))
                self.Hardware_double_led.makerobo_set_red_Color(0)
                self.Hardware_double_led.makerobo_set_green_Color(100)
            else:
                confidence = "  0%".format(round(100 - confidence))
                self.label_ID.setText("不认识")
                self.label_name.setText("不认识")
                self.Hardware_double_led.makerobo_set_red_Color(100)
                self.Hardware_double_led.makerobo_set_green_Color(0)
            # 给图片添加文本 图片矩阵, 添加文本名称, 设置文本显示位置,
            # 字体样式, 字体大小, 字体颜色, 字体粗细
            cv2.putText(self.image, str(id), (x + 5, y - 5), self.font, 1, (255, 255, 255), 2)
            cv2.putText(self.image, str(confidence), (x + 5, y + h - 5), self.font, 1, (255, 255, 0), 1)
        else:
            self.Hardware_double_led.makerobo_set_red_Color(0)
            self.Hardware_double_led.makerobo_set_green_Color(0)
        # 将视频显示在了label上
        show = cv2.resize(self.image, (640, 480))
        show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
        showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
        self.lab_face.setPixmap(QtGui.QPixmap.fromImage(showImage))


    # 点点击管理员按钮事件
    def slot_btn_admin(self):
        #应该在释放摄像头之前先关闭定时器
        self.timer_camera.stop()
        self.cap.release()
        self.logon = Fle_Admin_enter()
        self.logon.show()
        self.hide()
        #其他界面不用双色LED模拟开关门,把灯灭掉
        self.Hardware_double_led.makerobo_set_red_Color(0)
        self.Hardware_double_led.makerobo_set_green_Color(0)

# 管理员登录界面
class Fle_Admin_enter(QDialog,Ui_Dialog_Admin_enter):
    def __init__(self):
        super(Fle_Admin_enter, self).__init__()
        self.setupUi(self)

        #将输入信息初始化为空
        self.lineEdit_admin_ID.setText("")
        self.lineEdit_admin_key.setText("")
        #设置密码为隐藏方式显示
        self.lineEdit_admin_key.setEchoMode(QLineEdit.Password)

        # lineEdit改变事件
        self.lineEdit_admin_ID.textEdited[str].connect(self.changeEdit_ID)
        self.lineEdit_admin_key.textEdited[str].connect(self.changeEdit_key)

        # 点击返回按钮事件
        self.pushButton_admin_back.clicked.connect(self.slot_btn_back)
        # 点击登录按钮事件
        self.pushButton_admin_enter.clicked.connect(self.slot_btn_logon)


    # 点击Edit_ID事件
    def changeEdit_ID(self):
        Edit_ID = self.lineEdit_admin_ID.text()
        print("Edit_ID=",Edit_ID)

    # 点击Edit_key事件
    def changeEdit_key(self):
        Edit_key = self.lineEdit_admin_key.text()
        print("Edit_ID=",Edit_key)

    # 点击返回按钮事件
    def slot_btn_back(self):
        self.menu = Fle_MainWindow()
        self.menu.show()
        self.hide()

    # 点击登录按钮事件
    def slot_btn_logon(self):
        # 判断账号和密码是否输入正确
        print(self.lineEdit_admin_ID.text)
        print(self.lineEdit_admin_key.text)
        #这里设置管理员的账号和密码,这里都设置为1
        if self.lineEdit_admin_ID.text() == "1" and self.lineEdit_admin_key.text() == "1":
            self.manager_face = Fle_Face_rec()
            self.manager_face.show()
            self.hide()
            #print("enter Ui_manager_face")
        else:
            QMessageBox.warning(self, "提示"查看详情  

基于树莓派的智能魔镜,支持人脸识别情感监测热词唤醒语音交互,以及与手机app交互的实现(代码片段)

目录效果演示第三方库的安装 换源魔镜界面绘制服务器部署人脸识别流程图 源码地址效果演示天气新闻日期热点等更新【录屏】 第三方库的安装importpaho.mqtt.clientaspahomqttfromPyQt5importQtCore,QtGui,QtWidgetsfromPyQt5.QtWidgetsimportQApplicatio... 查看详情

v1.1基于树莓派的opencv-python摄像头人脸追踪系统(更新系统含演示视频)(代码片段)

【V1.1】基于树莓派的OpenCV-Python摄像头人脸追踪系统(更新系统、含演示视频)该系统目前结合了树莓派+51单片机树莓派主要用于运行Python程序追踪人脸同时用GPIO口给出信号单片机用于控制42步进电机导轨左右移动资... 查看详情

基于树莓派的智能魔镜,支持人脸识别情感监测热词唤醒语音交互,以及与手机app交互温湿度/新闻热点/日期显示等

目录​​功能清单​​​​界面演示​​​​系统框图​​​​设计方案​​​​整体结构​​​​网站设计​​​​ app设计​​​​ 魔镜界面设计​​​​ 温湿度传感器​​​​ 光电传感器​​​​相关教程... 查看详情

图像处理——基于机器视觉技术的人脸在线识别系统设计(代码片段)

  基于机器视觉技术的人脸在线识别系统设计  本设计研究人脸检测与识别技术,在基于机器视觉技术上,构建了一套人脸在线检测识别系统,系统将由以下几个部分构成:计算机图像预处理、数据收集和预处理、人脸... 查看详情

基于javaweb人脸识别注册登录系统(代码片段)

---恢复内容开始---现在是2019年,人脸识别技术已经相当成熟了,百度自2017年发布人脸识别技术,已经被广泛应用,不管从现在的iphoneX掀起的面部解锁到手机应用端的各种人脸认证,这一技术已经悄然升息的方便了我们的生活,... 查看详情

树莓派视觉小车--人脸追踪(人脸识别pid控制舵机运动)(代码片段)

目录效果展示基础理论(人脸识别)1、基于特征的算法 2、基于图像的算法 3、Haar特征4、Adaboost级联决策器API基础理论(PID算法)1、作用 应用场景2、PID原理1、P(比例)2、D(微分) 3、I(... 查看详情

基于qt设计的人脸识别门禁系统(录入识别对比删除)(代码片段)

...人脸识别技术,已在各大行业中广泛使用。人脸识别门禁系统,可以防止陌生人尾随进入园区,大大降低了该风险。通过前端设备的识别,进行人脸与后台系统1对1的比对,比对成功方可进入。目前一些 查看详情

基于python的百度ai人脸识别api接口(可用于opencv-python人脸识别)(代码片段)

基于Python的百度AI人脸识别API接口(可用于OpenCV-Python人脸识别)资源:https://download.csdn.net/download/weixin_53403301/43644312之前的项目:【最新】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别... 查看详情

人脸识别基于mctnn人脸检测(pytorch)(代码片段)

参考:FaceDetector/detect_step_by_step.ipynbatmaster·faciallab/FaceDetector·GitHub中文翻译:从零开始搭建人脸识别系统(一)MTCNN-知乎1、网络结构mtcnn算法人脸检测过程分为三个独立的stage,每一个stage对应一个卷积网络... 查看详情

基于python_opencv人脸录入识别系统(应用dlib机器学习库)(代码片段)

基于python_opencv人脸录入、识别系统(应用dlib机器学习库)近几年应用opencv机器学习方法识别人脸的技术成为了热潮,本人根据当今的识别技术与方法,历时四个多月开发出一套基于dlib机器学习库的识别项目。希... 查看详情

基于百度飞浆平台(easydl)设计的人脸识别考勤系统(代码片段)

1.1前言随着社会经济和科学技术的飞速发展,人们的生活变得更加智能化、科学化。信息安全逐渐引起人们的关注,信息的应用不断进入人们的视野。普通的身份识别方式并不能有效保证信息安全。生物识别技术以其稳... 查看详情

树莓派点灯笔记(论如何学好控制io输出)(人脸识别io控制)

...习,现在我来回顾我想要做的,嗯..我想要做一个基于opencv和树莓派的一个人脸识别的门禁,现在人脸识别有了,io控制大概清楚了..现在问题就是,如何通过人脸识别成功来控制io口输出电频?..其实逻辑就是&#x... 查看详情

树莓派点灯笔记(论如何学好控制io输出)(人脸识别io控制)

...习,现在我来回顾我想要做的,嗯..我想要做一个基于opencv和树莓派的一个人脸识别的门禁,现在人脸识别有了,io控制大概清楚了..现在问题就是,如何通过人脸识别成功来控制io口输出电频?..其实逻辑就是&#x... 查看详情

树莓派人脸识别------opencv-python环境搭建最全教程(从零开始)(代码片段)

文章目录需要用到的工具系统烧录系统无线联网以及基础连接配置SSH连接系统配置更新软件源需要用到的工具Rufusnotepad++vncviewerMobaXterm系统烧录首先需要烧录系统打开工具rufus-3.9p.exe然后选择烧录的系统进行烧录系统无线联... 查看详情

基于opencv的人脸识别,翻车了居然识别错误。(代码片段)

前言我们身边的人脸识别有车站检票,监控人脸,无人超市,支付宝人脸支付,上班打卡,人脸解锁手机。人脸检测是人脸识别系统组成的关键部分之一,其目的是检测出任意给定图片中的包含的一个或多... 查看详情

python基于opencv的人脸表情识别系统[源码&部署教程](代码片段)

...别技术的发展方向。2.识别效果展示3.识别视频演示Python基于OpenCV的人脸表情识别系统[源码&部署教程]_哔哩哔哩_bilibili4.实现方法分析人脸表情识别中需要运用人脸检测技术,识别人脸之后,再对表情图像做预处理&#x... 查看详情

树莓派人脸识别------实验步骤(代码片段)

...首先我们需要把开发文档的代码复制过来通过mobaxterm登录树莓派,然后将FacialRecognitionProject复制到家目录,直接拖动文件夹到目录侧即可直接拖动到如下图因为我们后续需要用到摄像头模块,因此后续的我们不能在mobaxterm... 查看详情