一、项目概述
1.1 项目简介
本项目是基于树莓派5的人脸识别智能门锁,通过摄像头实时捕捉人脸图像,使用face_recognition库进行人脸识别,识别成功后控制SG90舵机模拟门锁开关动作。
1.2 系统组成
硬件组件:
树莓派5:主控单元
CAMERA V2:用于人脸图像采集
SG90舵机:模拟门锁开关
软件栈:
Python 3.13:主要编程语言
face_recognition:人脸识别核心库
picamera2:摄像头控制库
gpiozero:GPIO控制库
OpenCV:图像处理库
NumPy:数值计算库
1.3 系统特点
智能人脸识别:使用HOG算法检测,128维特征向量匹配
双重环境管理:系统Python处理摄像头,虚拟环境处理人脸识别
方向问题解决:通过反向脉冲技术解决舵机方向问题
防误触发机制:开门期间暂停检测,10秒冷却时间
模块化设计:人脸采集和识别控制分离
详细日志输出:实时监控系统状态
二、项目结构
├── src/ │ ├── main_simple_solution.py # 系统入口(含反向脉冲解决方案) │ ├── add_face_final.py # 人脸录入程序 │ └── test_*.py # 测试程序 ├── data/ │ └── faces/ │ ├── encodings.pkl # 人脸特征编码数据库 │ └── user_sample_*.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20 # 用户人脸样本图片 ├── venv/ # Python虚拟环境(Python 3.13)
三、硬件连接
3.1 舵机连接(SG90)
SG90引脚说明: - 棕色线(GND) → 树莓派GND(引脚6) - 红色线(VCC) → 树莓派5V(引脚2) - 黄色线(信号)→ 树莓派GPIO 18(引脚12)
3.2 摄像头连接
使用树莓派官方摄像头模块CAMERA V2,通过CSI接口连接


四、软件安装与配置
本项目采用双重Python环境策略:
系统Python环境:
处理摄像头控制(picamera2)
处理GPIO控制(gpiozero)
虚拟Python环境:
处理人脸识别(face_recognition)
处理OpenCV图像处理
五、核心程序说明
5.1 使用add_face_final.py录入人脸
cd /home/lospring/face_lock_system
python add_face_final.py
录入流程:
摄像头检测:自动测试摄像头可用性
用户输入:输入用户名
样本采集:采集5张不同角度的人脸照片
质量检查:自动验证人脸检测结果
数据保存:保存到encodings.pkl和样本图片
# 支持多种摄像头命令
commands = [
['rpicam-jpeg', '-o', 'test.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20', '--nopreview'],
['libcamera-jpeg', '-o', 'test.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20'],
['raspistill', '-o', 'test.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20']
]
# 智能人脸检测
face_locations = face_recognition.face_locations(rgb_image, model="hog")
if len(face_locations) == 1: # 确保只检测到一个人脸
face_encoding = face_recognition.face_encodings(rgb_image, face_locations)[0]
5.2 使用add_face_final.py录入人脸
# 每60帧(约2秒)检测一次,降低CPU使用率
if not detection_paused and frame_count % 60 == 0:
# 1. 人脸检测(HOG算法)
face_locations = face_recognition.face_locations(rgb_small, model="hog")
if face_locations:
# 2. 特征提取
face_encodings = face_recognition.face_encodings(rgb_small, face_locations)
for face_encoding in face_encodings:
# 3. 数据库匹配
matches = face_recognition.compare_faces(
known_encodings,
face_encoding,
tolerance=0.65 # 匹配阈值
)
if True in matches:
# 4. 计算最小距离
face_distances = face_recognition.face_distance(known_encodings, face_encoding)
best_match_index = np.argmin(face_distances)
best_distance = face_distances[best_match_index]
# 5. 验证识别结果
if matches[best_match_index] and best_distance < 0.65:
name = known_names[best_match_index]
print(f"✅ 识别到: {name} (距离: {best_distance:.3f})")
5.3 门锁控制序列
def door_control_sequence():
"""完整的门锁控制流程"""
# 1. 暂停人脸检测
global detection_paused
detection_paused = True
# 2. 开门动作(0度 → 90度)
print("🔓 开门:顺时针转90度")
servo.angle = OPEN_ANGLE # 90度
time.sleep(0.5)
servo.angle = None # 停止PWM,避免舵机抖动
# 3. 保持开门状态10秒
door_status = "open"
print("🚪 门已打开,保持10秒")
for i in range(10, 0, -1):
print(f" 剩余 {i} 秒")
time.sleep(1)
# 4. 关门动作(90度 → 0度)
print("🔒 关门:逆时针转90度")
servo.angle = INITIAL_ANGLE # 0度
time.sleep(0.5)
servo.angle = None
# 5. 恢复人脸检测
door_status = "closed"
detection_paused = False
print("✅ 门已关闭,恢复人脸检测")
5.3 舵机初始化(反向脉冲技术)
# 传统配置(可能方向错误)
servo = AngularServo(
pin=18,
min_angle=0,
max_angle=180,
min_pulse_width=0.0005, # 0.5ms对应0度
max_pulse_width=0.0025 # 2.5ms对应180度
)
# 反向脉冲配置(解决方向问题)
servo = AngularServo(
pin=18,
min_angle=0,
max_angle=180,
min_pulse_width=0.0025, # 2.5ms对应0度(反向!)
max_pulse_width=0.0005, # 0.5ms对应180度(反向!)
frame_width=0.02
)
5.4 关键参数配置
# ===== 摄像头配置 =====
CAMERA_RESOLUTION = (640, 480) # 分辨率
FRAME_FORMAT = "RGB888" # 图像格式
# ===== 人脸识别配置 =====
DETECTION_INTERVAL = 60 # 每60帧检测一次(约2秒)
FACE_MATCH_TOLERANCE = 0.65 # 人脸匹配阈值
DETECTION_MODEL = "hog" # 使用HOG算法(CPU友好)
# ===== 舵机控制配置 =====
SERVO_PIN = 18 # GPIO引脚
INITIAL_ANGLE = 0 # 初始角度(关门)
OPEN_ANGLE = 90 # 开门角度
PULSE_REVERSE = True # 启用反向脉冲
# ===== 时间控制配置 =====
UNLOCK_COOLDOWN = 10 # 冷却时间(秒)
DOOR_OPEN_TIME = 10 # 开门保持时间(秒)
六、演示
6.1、人脸录入




6.2、人脸识别及门锁开关



七、核心代码
八、视频展示:

