当前位置: 首页 > news >正文

用Python+Flask给树莓派监控加人脸识别:Picamera2实战教程

用Python+Flask给树莓派监控加人脸识别:Picamera2实战教程

树莓派作为一款高性价比的单板计算机,在智能监控领域有着广泛的应用场景。传统的监控方案往往只提供简单的视频流功能,而结合现代计算机视觉技术,我们可以实现更智能化的监控系统。本文将详细介绍如何利用Python生态中的Flask框架和最新的Picamera2库,构建一个支持人脸识别和移动侦测的智能监控系统。

1. 环境准备与硬件配置

在开始编码之前,我们需要确保硬件和软件环境都已正确配置。树莓派官方摄像头模块或兼容的USB摄像头均可用于本项目,但官方摄像头模块通常能提供更好的性能和更低的CPU占用率。

1.1 硬件连接与设置

对于树莓派官方摄像头模块:

  1. 确保树莓派已关机,轻轻抬起CSI接口的卡槽
  2. 将摄像头排线插入CSI接口,金属触点朝向远离HDMI接口的一侧
  3. 按下卡槽锁定排线

启用摄像头接口:

sudo raspi-config

在菜单中选择Interface Options>Camera,选择启用后重启树莓派。

验证摄像头是否工作:

libcamera-hello -t 0

如果能看到摄像头实时画面,说明硬件配置正确。

1.2 软件依赖安装

我们需要安装以下Python包:

pip install picamera2 flask opencv-python numpy python-telegram-bot

对于人脸识别功能,还需要安装dlib库:

sudo apt-get install cmake python3-dev pip install dlib

2. 构建基础视频流服务

Flask是一个轻量级的Python Web框架,非常适合构建这样的监控系统。我们将首先创建一个基础的视频流服务。

2.1 初始化Flask应用

创建一个名为app.py的文件,添加以下代码:

from flask import Flask, Response from picamera2 import Picamera2 import cv2 import numpy as np app = Flask(__name__) picam2 = Picamera2() config = picam2.create_video_configuration(main={"size": (640, 480)}) picam2.configure(config) picam2.start()

2.2 实现视频流生成器

添加生成视频帧的函数:

def generate_frames(): while True: frame = picam2.capture_array() ret, buffer = cv2.imencode('.jpg', frame) frame = buffer.tobytes() yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

2.3 创建视频流路由

添加Flask路由以提供视频流:

@app.route('/video_feed') def video_feed(): return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame') @app.route('/') def index(): return """ <html> <head> <title>树莓派智能监控</title> </head> <body> <h1>实时监控</h1> <img src="/video_feed" width="640" height="480"> </body> </html> """ if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, threaded=True)

运行应用后,访问树莓派IP地址的5000端口即可看到实时视频流。

3. 实现移动侦测功能

移动侦测是监控系统的重要功能,可以在检测到画面变化时触发警报或录像。

3.1 背景减除算法

OpenCV提供了几种背景减除算法,这里使用MOG2:

fgbg = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True) def detect_motion(frame): gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) fgmask = fgbg.apply(gray) _, thresh = cv2.threshold(fgmask, 244, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) motion_detected = False for contour in contours: if cv2.contourArea(contour) > 500: # 忽略小面积变化 motion_detected = True break return motion_detected, frame

3.2 集成移动侦测到视频流

修改generate_frames函数以包含移动侦测:

def generate_frames(): while True: frame = picam2.capture_array() motion_detected, processed_frame = detect_motion(frame) if motion_detected: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") cv2.imwrite(f"motion_{timestamp}.jpg", frame) # 这里可以添加通知逻辑 ret, buffer = cv2.imencode('.jpg', processed_frame) frame = buffer.tobytes() yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

4. 添加人脸识别功能

人脸识别可以为监控系统增加更多智能功能,如识别已知人员或标记陌生人。

4.1 加载人脸检测模型

使用OpenCV的DNN模块加载Caffe模型:

prototxt = "deploy.prototxt" model = "res10_300x300_ssd_iter_140000.caffemodel" net = cv2.dnn.readNetFromCaffe(prototxt, model)

4.2 实现人脸检测函数

def detect_faces(frame): (h, w) = frame.shape[:2] blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0)) net.setInput(blob) detections = net.forward() faces = [] for i in range(0, detections.shape[2]): confidence = detections[0, 0, i, 2] if confidence > 0.5: # 置信度阈值 box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]) (startX, startY, endX, endY) = box.astype("int") faces.append((startX, startY, endX-startX, endY-startY)) return faces

4.3 在视频流中标记人脸

修改generate_frames函数以标记检测到的人脸:

def generate_frames(): while True: frame = picam2.capture_array() faces = detect_faces(frame) for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) ret, buffer = cv2.imencode('.jpg', frame) frame = buffer.tobytes() yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

5. 实现报警通知功能

当检测到移动或陌生人脸时,系统可以通过Telegram发送通知。

5.1 配置Telegram机器人

  1. 在Telegram中与@BotFather对话创建新机器人
  2. 获取API token和chat ID

5.2 实现通知发送功能

from telegram import Bot import asyncio TELEGRAM_TOKEN = "your_bot_token" CHAT_ID = "your_chat_id" async def send_telegram_alert(image_path, message): bot = Bot(token=TELEGRAM_TOKEN) with open(image_path, 'rb') as photo: await bot.send_photo(chat_id=CHAT_ID, photo=photo, caption=message) def send_alert(image, message): timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") image_path = f"alert_{timestamp}.jpg" cv2.imwrite(image_path, image) asyncio.run(send_telegram_alert(image_path, message))

5.3 集成报警到主逻辑

在检测到重要事件时调用报警功能:

def generate_frames(): known_faces = load_known_faces() # 需要事先实现加载已知人脸的功能 while True: frame = picam2.capture_array() motion_detected, _ = detect_motion(frame) faces = detect_faces(frame) if motion_detected and faces: unknown_faces = [] for face in faces: if not recognize_face(frame, face, known_faces): # 需要实现人脸识别函数 unknown_faces.append(face) if unknown_faces: send_alert(frame, "检测到未知人员!") ret, buffer = cv2.imencode('.jpg', frame) frame = buffer.tobytes() yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

6. 性能优化与部署建议

在实际部署时,需要考虑系统性能和稳定性。

6.1 性能优化技巧

  1. 分辨率调整:根据实际需要选择合适的分辨率

    config = picam2.create_video_configuration(main={"size": (640, 480)})
  2. 帧率控制:降低帧率可以减少CPU使用

    config = picam2.create_video_configuration(main={"size": (640, 480)}, controls={"FrameRate": 15})
  3. 硬件加速:启用树莓派的硬件编码

    config = picam2.create_video_configuration(main={"size": (640, 480)}, encode="hw")

6.2 部署建议

  • 使用systemd管理服务,确保意外退出后自动重启
  • 考虑使用nginx作为反向代理,提高并发性能
  • 定期清理旧的截图和录像文件
  • 在高温环境下为树莓派添加散热措施
# 示例systemd服务文件 [Unit] Description=Raspberry Pi Surveillance Service After=network.target [Service] ExecStart=/usr/bin/python3 /home/pi/app.py WorkingDirectory=/home/pi StandardOutput=inherit StandardError=inherit Restart=always User=pi [Install] WantedBy=multi-user.target

7. 扩展功能思路

基础功能实现后,可以考虑以下扩展:

  1. 多摄像头支持:使用多个树莓派构建分布式监控系统
  2. 云端存储:将重要事件视频上传到云存储
  3. 深度学习模型:替换为更精准的YOLO等目标检测模型
  4. 门禁集成:与电子门锁联动实现智能门禁
  5. 行为分析:检测异常行为如跌倒、徘徊等

实现这些扩展需要根据具体需求调整架构,可能需要引入消息队列、数据库等组件。

http://www.jsqmd.com/news/502883/

相关文章:

  • 管理者必读的三本创新书籍推荐
  • 实战复盘:我是如何用GraphSAGE+Neo4j在信也杯金融反欺诈比赛中拿到成绩的
  • 导数与三角函数相结合题型
  • 深信服零信任实战:从“永不信任”到“持续验证”的架构演进
  • Ubuntu 20.04.2.0 离线环境下的科学计算栈:从GCC到MKL的完整部署指南
  • 40:要素2完美化:消除滑坡的硬编码判断标准与权重矩阵
  • Leather Dress Collection 在边缘计算场景的轻量化部署探索
  • 美通卡回收速看这份宝藏攻略 - 京顺回收
  • 直播数据抓取功能修复全记录:从故障排查到技术重构
  • SiameseUIE实战教程:基于SiameseUIE构建微信公众号文章标签生成系统
  • pybind11进阶技巧:如何高效处理C++与Python间的数据转换(2024最新版)
  • yysScript:阴阳师自动挂机脚本的技术实现与应用指南
  • DeerFlow效果展示:AI自动生成的比特币分析报告,效果惊艳
  • 效率翻倍,快马AI助你快速生成智能jxx域名检测与自动跳转工具
  • MCP 2026漏洞修复实战沙箱环境(限首批200名CTF认证工程师领取):含3个未公开CVE利用链与Bypass绕过样本
  • 从裸机到AUTOSAR:C内存池动态扩容的4级可靠性演进——第4级支持在线热补丁与双冗余元数据校验
  • Linux 系统崩溃自动恢复实战:SysRq与Watchdog深度配置
  • 如何攻克实时通信测试难关?Playwright Python带来的自动化验证新方案
  • PyTorch 2.8实战:利用GPU加速快速训练你的第一个神经网络
  • EagleEye DAMO-YOLO TinyNAS在智慧交通中的应用:车辆行人实时检测
  • ai赋能开发:借助快马平台智能生成与调试openclaw本地部署方案
  • Python3 极简核心教程
  • Windows系统下Apache Superset一站式部署与避坑指南
  • STM32定时器PWM模式实战:用TIM1和TIM2实现呼吸灯效果(附完整代码)
  • PHP工作流优化秘籍,效率提升不再难
  • 从MP模型到现代神经网络:一个数学公式如何改变AI发展轨迹
  • 新手友好:在快马平台上用oneclaw完成你的第一个数据提取项目
  • GitHub中文界面终极指南:快速实现GitHub全面汉化的完整方案
  • 为什么涨薪后,就回不去原来的低工资了?——浅析薪酬预期与心理适应
  • UniApp登录注册页面实战:从零搭建到接口联调(附完整代码)