树莓派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
- 安装显示图像所需的库:
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
- 安装优化函数和依赖项:
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
- 更新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的控制和生物识别门禁系统的搭建。希望这个项目能为你带来更多的启发和应用思路。
超级会员免费看
2311

被折叠的 条评论
为什么被折叠?



