35、树莓派Python编程与生物识别门禁系统搭建

树莓派Python编程与生物识别门禁系统搭建

1. Python编程基础

在使用树莓派进行编程前,若未更新系统,可在终端使用 sudo apt-get update 命令更新。更新后,使用 sudo apt-get install python3 idle3 命令安装Python 3和IDLE(类似Arduino IDE,是Python的编辑器,可在终端使用 idle 命令打开)。Python库可通过 pip 在终端安装。

Python是一种易于编码的编程语言,语法简单,便于阅读、理解和记忆。以下是Python的一些基本语法:
- 注释 # 用于单行注释, """ 用于多行注释。

#This is a single line comment
""" This is the first line of a multi-line comment.
This is the second line of multi-line comment. """
  • 变量声明 :Python中声明变量无需指定数据类型。
# C语言示例
int varI = 3;
float varF = 5.0;
char varC = 'c';
# Python示例
varI = 3
varF = 5.0
varC = 'c'

部分允许的变量声明:

varAllowed = 3
var_Allowed = 5.0
varAllowed03 = 'c'

部分不允许的变量声明:

1varNotAllowed = 3
var-notAllowed = 5.0
var notAllowed = 'c'
  • 数据类型相关 :使用 type() 查看变量数据类型, int() float() str() 分别用于将变量转换为整数、浮点数和字符串类型。
  • 打印数据 :使用 print() 函数,默认会换行,若要在同一行打印,可使用 end=""
print("Data to be printed")
num = 2
print("This is " + str(num) + " print statement.")
print("Data will be printed ", end="")
print("on the same line")
  • 循环 :可使用 for while 循环。
for i in range(1,10):
    print("Iter value: " + str(i))
i = 1
while(i < 10):
    print("Iter value: " + str(i))
    i += 1

需注意,Python中缩进非常重要,它用于区分代码块,而C语言使用花括号 {}

2. Python控制LED闪烁代码

使用Arduino IDE控制Arduino Uno或NodeMCU的GPIO引脚时,无需显式导入额外库。但使用Python控制树莓派的GPIO引脚,需使用 RPi.GPIO 库,可在终端使用 pip install RPi.GPIO 命令安装。 time 库用于延迟操作,它是Python预安装库之一,无需单独安装。

树莓派Python代码中引用引脚有两种模式:
- GPIO.BCM :根据物理引脚编号引用。
- GPIO.BOARD :根据GPIO引脚编号引用。

若模式设置为 GPIO.BCM LEDPin 应定义为12(GPIO编号);若设置为 GPIO.BOARD LEDPin 应定义为32(物理引脚编号)。 GPIO.setup() 用于设置引脚操作方向,类似Arduino IDE中的 pinMode()

以下是LED闪烁代码:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
LEDPin = 12
GPIO.setup(LEDPin, GPIO.OUT)
try:
    while(1):
        GPIO.output(LEDPin, True)
        time.sleep(1)
        GPIO.output(LEDPin, False)
        time.sleep(1)
except KeyboardInterrupt:
    print("Blink code is stopped.")
finally:
    GPIO.cleanup()

try-except 块尝试执行 try 块中的代码,若因中断或错误执行失败,则执行 except 块中的代码。 finally 块中的代码在 try-except 块执行后执行。 while(1) 用于无限循环,类似Arduino IDE中的 void loop() GPIO.output() 用于在引脚写入数字电压,类似Arduino IDE中的 digitaWrite() time.sleep() 用于暂停程序,单位为秒。

3. Python控制LED亮度代码

导入所需库和声明引脚与LED闪烁代码相同。

树莓派有四个硬件PWM引脚或两个硬件PWM通道:
- PWM0通道:GPIO 12(引脚32)和GPIO 18(引脚12)。
- PWM1通道:GPIO 13(引脚33)和GPIO 19(引脚35)。

树莓派的硬件PWM引脚与音频子系统共享,可选择使用硬件PWM输出或音频输出。所有引脚都可通过软件配置为PWM引脚。

GPIO.PWM() 用于设置PWM引脚的频率,接受PWM引脚编号和频率两个参数。以下是控制LED亮度的代码:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
LEDPin = 12
GPIO.setup(LEDPin, GPIO.OUT)
LED = GPIO.PWM(LEDPin, 500)
dutyCycle = 0
fadeAmount = 5
LED.start(dutyCycle)
try:
    while(1):
        dutyCycle = dutyCycle + fadeAmount
        LED.ChangeDutyCycle(dutyCycle)
        if (dutyCycle <= 0 or dutyCycle >= 100):
            fadeAmount = -fadeAmount
        time.sleep(0.1)
except KeyboardInterrupt:
    print("Brightness Control code is stopped.")
finally:
    LED.stop()
    GPIO.cleanup()

ChangeDutyCycle() 用于改变PWM引脚的占空比,类似Arduino IDE中的 analogWrite()

4. 生物识别门禁系统项目

生物识别认证利用人类独特特征进行身份验证,基于指纹、面部图案或视网膜图案等物理特征进行验证,通常比传统多因素认证更安全。本项目将构建基于面部识别的自动门系统。

4.1 项目动机

构建基于面部识别的自动门系统,用伺服电机模拟门的开关。

4.2 Pi相机

Pi相机是树莓派的附加硬件,类似PC的网络摄像头,可用于拍照、视频流、图像处理等。有多种类型的Pi相机可供选择,本项目可使用5MP的Pi相机V1,也可根据需求使用更高分辨率的相机。Pi相机通过FFC电缆连接到树莓派,也可使用USB网络摄像头进行相关操作。

4.3 算法

面部识别项目需先检测人脸,再进行识别。
- 人脸检测 :使用正面人脸Haar级联分类器,它是基于机器学习的分类器,通过大量包含和不包含人脸的图像进行训练。虽不是最准确的算法,但速度快且易于使用。
- 人脸识别 :使用LBPH(局部二值模式直方图)算法,该算法使用四个参数:半径、邻居数、Grid X和Grid Y。通过滑动窗口遍历图像,将像素转换为二进制值,再转换为十进制值,生成LBP图像。将LBP图像按Grid X和Grid Y划分成多个单元格,提取每个单元格的直方图并拼接成大直方图。使用多个不同角度的同一人的图像进行训练,将最终直方图与人员ID一起存储在yml文件中。对于输入图像,执行相同步骤并转换为直方图,与每个人的直方图进行比较,返回最匹配直方图对应的ID和置信度分数。

4.4 OpenCV在树莓派上的安装

OpenCV是开源计算机视觉库,提供计算机视觉、图像处理和机器学习功能。安装OpenCV较为困难、耗时且占用空间大。若使用小于等于16GB的Micro SD卡,建议扩展文件系统以使用所有空间。安装步骤如下:
1. 扩展文件系统:在终端输入 sudo raspi-config ,进入高级选项,选择扩展文件系统,重启树莓派。
2. 更新树莓派:使用 sudo apt-get update && sudo apt-get upgrade 命令。
3. 安装CMake: sudo apt-get install build-essential cmake pkg-config
4. 安装图像和视频I/O包:

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
  1. 安装显示图像所需的库:
sudo apt-get install libfontconfig1-dev libcairo2-dev
sudo apt-get install libgdk-pixbuf2.0-dev libpango1.0-dev
sudo apt-get install libgtk2.0-dev libgtk-3-dev
  1. 安装优化函数和依赖项:
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103
sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
  1. 更新NumPy并安装OpenCV:
sudo pip install -U numpy
sudo pip install opencv-contrib-python
4.5 硬件要求和连接
硬件 数量
树莓派4B 1
刷入树莓派操作系统的Micro SD卡 1
Pi相机 1
FFC电缆 1
伺服电机 1
5V直流适配器 1
USB A转USB C电缆 1
跳线 按需

连接时,将Pi相机通过FFC电缆连接到树莓派的相机插槽,参考连接图和引脚连接细节进行其他硬件连接。

通过以上步骤,你可以完成树莓派的Python编程基础学习,实现LED的闪烁和亮度控制,并搭建基于面部识别的生物识别门禁系统。

树莓派Python编程与生物识别门禁系统搭建

5. 硬件连接详细说明

为了更清晰地展示各硬件之间的连接关系,我们来看一下具体的连接步骤和细节。以下是硬件连接的详细流程:
1. 树莓派与电源连接 :使用USB A转USB C电缆将5V直流适配器与树莓派4B连接,为树莓派提供稳定的电源。
2. Pi相机连接 :将Pi相机通过FFC电缆连接到树莓派的相机插槽。连接时要确保电缆插入牢固,避免松动导致相机无法正常工作。
3. 伺服电机连接 :使用跳线将伺服电机与树莓派的GPIO引脚连接。具体的引脚连接可以参考项目提供的连接图和引脚连接细节表格。在连接过程中,要注意引脚的对应关系,防止接错导致硬件损坏。

6. 项目实现流程

下面我们通过一个mermaid流程图来展示整个生物识别门禁系统项目的实现流程:

graph TD;
    A[初始化树莓派和硬件] --> B[安装OpenCV和相关库];
    B --> C[收集人脸图像];
    C --> D[使用LBPH算法训练模型];
    D --> E[启动相机进行人脸检测和识别];
    E --> F{是否识别成功};
    F -- 是 --> G[控制伺服电机开门];
    F -- 否 --> H[保持门关闭];
    G --> I[一段时间后控制伺服电机关门];
    I --> E;
    H --> E;

从流程图中可以看出,项目的实现主要包括以下几个关键步骤:
1. 初始化树莓派和硬件 :确保树莓派正常启动,各硬件设备连接正确。
2. 安装OpenCV和相关库 :按照前面介绍的OpenCV安装步骤,完成相关库的安装。
3. 收集人脸图像 :使用Pi相机或USB网络摄像头收集多个人不同角度的人脸图像,用于模型训练。
4. 使用LBPH算法训练模型 :将收集到的人脸图像转换为直方图,使用LBPH算法进行训练,并将训练好的模型保存到yml文件中。
5. 启动相机进行人脸检测和识别 :在运行程序时,启动相机实时检测和识别人脸。
6. 根据识别结果控制门的开关 :如果识别成功,控制伺服电机开门;如果识别失败,保持门关闭。

7. 代码实现示例

以下是一个简单的Python代码示例,用于实现生物识别门禁系统的基本功能:

import cv2
import RPi.GPIO as GPIO
import time

# 初始化GPIO引脚
GPIO.setmode(GPIO.BCM)
servo_pin = 18
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)
pwm.start(2.5)

# 加载人脸检测和识别模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer.yml')

# 打开相机
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    for (x, y, w, h) in faces:
        roi_gray = gray[y:y + h, x:x + w]
        id_, conf = recognizer.predict(roi_gray)

        if conf < 70:
            # 识别成功,控制伺服电机开门
            pwm.ChangeDutyCycle(7.5)
            time.sleep(2)
            pwm.ChangeDutyCycle(2.5)
        else:
            # 识别失败,保持门关闭
            pass

    cv2.imshow('Face Recognition', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()
pwm.stop()
GPIO.cleanup()

代码说明:
1. 初始化GPIO引脚 :设置伺服电机的控制引脚,并启动PWM信号。
2. 加载人脸检测和识别模型 :使用OpenCV的Haar级联分类器进行人脸检测,使用LBPH算法进行人脸识别。
3. 打开相机 :使用 cv2.VideoCapture(0) 打开相机,开始实时视频流。
4. 人脸检测和识别 :在每一帧图像中检测人脸,并使用训练好的模型进行识别。
5. 根据识别结果控制门的开关 :如果识别成功,控制伺服电机开门;如果识别失败,保持门关闭。
6. 释放资源 :程序结束时,释放相机资源,关闭所有窗口,停止PWM信号,并清理GPIO引脚。

8. 项目优化建议

为了提高生物识别门禁系统的性能和稳定性,我们可以考虑以下优化建议:
1. 增加训练数据 :收集更多不同角度、不同光照条件下的人脸图像,提高模型的泛化能力。
2. 优化算法参数 :调整LBPH算法的参数,如半径、邻居数等,以获得更好的识别效果。
3. 加入异常处理 :在代码中加入更多的异常处理机制,如相机连接失败、模型加载失败等,提高系统的健壮性。
4. 增加安全性措施 :可以考虑加入密码验证、短信验证码等额外的安全措施,提高门禁系统的安全性。

通过以上的学习和实践,你可以掌握树莓派的Python编程技巧,实现LED的控制和生物识别门禁系统的搭建。希望这个项目能为你带来更多的启发和应用思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值