使用Flask和OpenCV 实现树莓派与客户端的视频流传输与显示

使用 Python 和 OpenCV 实现树莓派与客户端的视频流传输与显示

在计算机视觉和物联网领域,经常需要将树莓派作为视频流服务器,通过网络将摄像头画面传输到客户端进行处理和显示。本文将详细介绍如何利用picamera2库、Flask 框架以及 OpenCV 库,实现树莓派端的视频流推送和客户端的视频流接收与显示。

一、前期准备

硬件准备

树莓派(建议树莓派 3 及以上版本),确保已安装操作系统(如 Raspbian)。

树莓派摄像头模块,正确连接到树莓派的 CSI 接口。我这里使用的是Zero 2W和Camera Module 3
在这里插入图片描述

客户端电脑,操作系统可以是 Windows、MacOS 或 Linux。

软件准备

在树莓派上:

确保系统已更新到最新版本,在终端执行sudo apt updatesudo apt upgrade -y

安装picamera2库,执行pip install picamera2

安装 Flask 框架,执行pip install flask

安装Pillow库(用于图像格式转换),执行pip install pillow

在客户端电脑上:

安装 Python 环境,建议使用 Python 3.x 版本。

安装OpenCV库,对于不同操作系统安装方式略有不同:

在 Windows 上,打开命令提示符,执行pip install opencv - python

在 MacOS 上,打开终端,执行pip install opencv - python

在 Linux 上,根据不同发行版,可能需要使用sudo apt - get install python3 - opencv等命令安装。

二、树莓派端操作

树莓派服务器端代码(使用 picamera2 库和 Flask 框架)

树莓派作为视频流服务器,利用picamera2库获取摄像头画面,并通过 Flask 框架将视频流以 HTTP 的形式提供给客户端。

import io
from flask import Flask, Response
from picamera2 import Picamera2app = Flask(__name__)def generate_frames():picam2 = Picamera2()# 将格式改为RGB888,后续再转换为JPEGpicam2.configure(picam2.create_preview_configuration(main={"format": "RGB888", "size": (640, 480)}))picam2.start()while True:stream = io.BytesIO()buffer = picam2.capture_array()from PIL import Imageimg = Image.fromarray(buffer)img.save(stream, format='JPEG')stream.seek(0)yield b'--frame\r\nContent-Type: image/jpeg\r\n\r\n' + stream.read() + b'\r\n'stream.close()@app.route('/video_feed')
def video_feed():return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')if __name__ == '__main__':app.run(host='0.0.0.0', port=5000, threaded=True)

代码说明:

导入库:导入ioFlaskResponsePicamera2等必要的库。io用于处理字节流,FlaskResponse用于构建 Web 服务器,Picamera2用于控制树莓派摄像头。

摄像头配置与初始化:使用Picamera2创建摄像头对象picam2,配置其输出格式为RGB888,分辨率为(640, 480),并启动摄像头。

生成视频帧:在generate_frames函数中,通过picam2.capture_array获取摄像头的图像数组,使用PIL库将数组转换为图像对象并保存为 JPEG 格式到字节流stream中,然后将字节流数据以特定格式作为视频帧输出。

定义路由:使用@app.route装饰器定义/video_feed路由,返回由generate_frames函数生成的视频流响应。

启动 Flask 应用:在if __name__ == '__main__':条件下,启动 Flask 应用,监听所有 IP 地址(host='0.0.0.0),端口为5000

操作步骤

打开树莓派的终端。

使用文本编辑器(如nano)创建一个新的 Python 文件,例如video_server.py,命令为nano ``video_server.py

将上述代码逐行复制粘贴到video_server.py文件中。

按下Ctrl + X,然后按Y,再按Enter保存并退出文件。

在终端中执行python3 ``video_server.py运行该程序。此时树莓派开始通过摄像头采集视频流,并通过 Flask 应用将其提供在http://0.0.0.0:5000/video_feed地址上。注意记录树莓派的 IP 地址,可在终端执行hostname -I查看。

三、电脑端操作

客户端代码(使用 OpenCV 和 urllib 库)

客户端电脑通过 Python 的cv2(OpenCV)库和urllib.request库从树莓派服务器获取视频流并进行显示。

import cv2
import urllib.request
import numpy as np# 视频流的URL,即树莓派的IP地址
url = 'http://192.168.3.90:5000/video_feed'# 打开URL
stream = urllib.request.urlopen(url)# 用于存储视频流数据的字节数组
bytes_data = bytearray()while True:# 读取视频流数据bytes_data += stream.read(1024)# 查找帧的起始位置a = bytes_data.find(b'\xff\xd8')b = bytes_data.find(b'\xff\xd9')if a != -1 and b != -1:# 提取一帧图像数据frame_data = bytes_data[a:b+2]# 从字节数据中删除已处理的部分bytes_data = bytes_data[b+2:]# 将字节数据转换为numpy数组frame = np.asarray(bytearray(frame_data), dtype=np.uint8)# 解码图像帧frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)# 显示图像帧cv2.imshow('Video Stream', frame)# 等待按键事件,25毫秒if cv2.waitKey(25) & 0xFF == ord('q'):break# 关闭窗口
cv2.destroyAllWindows()

代码说明:

导入库:导入cv2urllib.requestnumpy库。cv2用于图像和视频处理,urllib.request用于网络请求,numpy用于处理数组数据。

设置视频流 URL:将url变量设置为树莓派服务器提供的视频流 URL。需将http://192.168.3.90:5000/video_feed中的 IP 地址替换为树莓派实际的 IP 地址。

打开 URL:使用urllib.request.urlopen打开 URL,获取视频流数据的流对象stream

读取和处理视频流数据:循环读取stream中的数据并添加到bytes_data中,查找 JPEG 图像帧的起始和结束标记(\xff\xd8\xff\xd9),提取一帧图像数据,转换为numpy数组并使用cv2.imdecode解码为 OpenCV 可处理的格式。

显示视频帧:使用cv2.imshow显示解码后的图像帧,并通过cv2.waitKey等待按键事件,按下q键时退出循环。

关闭窗口:循环结束后,使用cv2.destroyAllWindows关闭所有 OpenCV 窗口。

操作步骤

  1. 通过 Python 代码接收视频流

打开客户端电脑的命令行终端(Windows 下为命令提示符或 PowerShell,MacOS 和 Linux 下为终端)。

使用文本编辑器(如 Windows 的 Notepad++、MacOS 的 TextEdit 需设置为纯文本模式、Linux 的gedit等)创建一个新的 Python 文件,例如video_client.py

将上述代码逐行复制粘贴到video_client.py文件中,特别注意将url变量中的 IP 地址替换为树莓派的实际 IP 地址。

保存video_client.py文件。

在终端中切换到保存video_client.py文件的目录,执行python ``video_client.py(如果使用的是 Python 3,可能需要执行python3 ``video_client.py)。此时客户端电脑将从树莓派服务器获取视频流,并在 OpenCV 窗口中显示树莓派摄像头捕捉到的画面。按q键可关闭视频显示窗口。

  1. 通过浏览器查看视频流

打开客户端电脑上的任意浏览器,如 Chrome、Firefox 等。

在浏览器地址栏中输入树莓派的视频流地址,格式为http://树莓派IP地址:5000/video_feed。例如,如果树莓派的 IP 地址是192.168.1.100,则输入http://192.168.1.100:5000/video_feed

按下回车键,浏览器将尝试加载树莓派摄像头的视频流画面。如果网络连接正常且树莓派服务器运行正常,应该能看到实时的视频画面。

部分浏览器可能会对视频流显示有兼容性问题。如果遇到无法正常显示的情况,可以尝试更换浏览器,或者检查浏览器是否阻止了某些内容加载。另外,确保树莓派服务器的防火墙设置允许外部访问端口5000。如果树莓派开启了防火墙,可能需要执行sudo ufw allow 5000命令(适用于使用ufw防火墙的情况)来允许外部访问该端口。

在实际应用中,确保树莓派和客户端电脑处于同一网络环境,并且客户端电脑能够访问树莓派的 IP 地址。通过上述代码及操作步骤,即可实现树莓派到客户端的视频流传输与显示功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35769.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka跨集群数据备份与同步:MirrorMaker运用

#作者:张桐瑞 文章目录 前言MirrorMaker是什么运行MirrorMaker各个参数的含义 前言 在大多数情况下,我们会部署一套Kafka集群来支撑业务需求。但在某些特定场景下,可能需要同时运行多个Kafka集群。比如,为了实现灾难恢复&#x…

ECharts仪表盘-仪表盘12,附视频讲解与代码下载

引言: ECharts仪表盘(Gauge Chart)是一种类似于速度表的数据可视化图表类型,用于展示单个或多个变量的指标和状态,特别适用于展示指标的实时变化和状态。本文将详细介绍如何使用ECharts库实现一个仪表盘,…

Harmony OS【 Tabs 导航篇】

设计图: 代码层: Entry Component struct Index {build() {Tabs({ barPosition: BarPosition.End }) {}.scrollable(false).vertical(false).divider({strokeWidth: 0.5,color: #0d182431}).backgroundColor(#F1f3f5).padding({ top: 36, bottom: 28 }…

兆芯大道云行 | 破解高性能云计算数据存储瓶颈

随着数字化转型的加速和数据安全战略的提升,以及国家政策的驱动,政府、金融、能源等关键领域对数据存储的自主可控要求不断提高,传统依赖国外芯片和技术的集中式存储架构面临安全与扩展性瓶颈。例如,政务云场景中原有的非信创服务…

RSI 量化策略实战指南:基于 iTick 报价源的 Python 实现

一、策略原理 相对强弱指标(Relative Strength Index, RSI)是由 Welles Wilder 提出的经典技术指标,通过计算价格波动的幅度衡量市场超买 / 超卖状态。RSI 取值范围 0-100,常用判断标准: RSI > 70:超买…

12 File文件对象:创建、获取基本信息、遍历文件夹、查找文件;字符集的编解码 (黑马Java视频笔记)

文章目录 File >> 存储数据的方案1. 认识File2. File操作2.1 创建File对象2.2 File操作1)对文件对象的信息的操作2)文件/文件夹的创建/删除3)⭐⭐对文件夹的遍历 3. 方法递归3.1 认识递归3.2 递归算法及其执行流程1) 案例:2…

逻辑派G1 6层高速板学习

逻辑派G1 6层高速板学习 一、原理图分析二、电源分析三、网表导入四、板框导入五、PCB快捷键导入与设置六、模块抓取以及接口器件布局七、模块化布局--预布局(先放各模块中的大器件)1 HDMI模块布局2 MCU模块布局3 FPGA模块布局4 DDR3模块布局5 DCDC电源模…

图论——广度优先搜索实现

99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述 第一行包含两个整数 N, M,表示矩阵的行数和列数。 后续 N 行,每行…

PTS-G1K13M RF Generator 1kW / 13MHz User’s Manual 手侧

PTS-G1K13M RF Generator 1kW / 13MHz User’s Manual 手侧

应用分层简介

一、什么是应用分层 应用分层是一种软件开发设计思想,它将应用程序分为多个层次,每个层次各司其职,多个层次之间协同提供完整的功能,根据项目的复杂程度,将项目分为三层或者更多层。 常见的MCV设计模式,就…

conda的基本使用及pycharm里设置conda环境

创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称,python后边的根据自己的需要,选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …

E902基于bash与VCS的仿真环境建立

网上看见很多E902仿真的文章,但用到的编译器是类似于这种Xuantie-900-gcc-elf-newlib-x86_64-V3.0.1-20241120,而我按照相应的步骤与对应的编译器,仿真总会报错。后面将编译器换成riscv64-elf-x86_64-20210512,反而成功了。现在开…

PostgreSQL:简介与安装部署

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

Git使用和原理(3)

1.远程操作 1.1分布式版本控制系统 我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者 计算机上。⽽我们的 Git 其实是分布式版本控制系统!什么意思呢&a…

ssm框架之mybatis框架讲解

1,Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2…

方法之笔,驭繁于简.绘场景之魂——方法论引领支撑透明化项目之航

关注作者 项目建设中痛难点剖析: 01 项目策划有缺失,目标风险难管控 ①目标设定不合理,由于项目移交交底不充分,造成项目建设目标与前期立项论证偏差过大,达不到建设预期; ②风险评估不足,未…

【Apache Storm】

一、Storm简介 1、概述 官网地址:https://storm.apache.org/index.html Apache Storm 是一个开源的、分布式的实时计算系统,专为处理流式数据而设计。它能够处理大量数据流并在极低的延迟下提供实时的结果。相比于传统的批处理系统,Storm 具…

【力扣刷题实战】无重复的最长字串

大家好,我是小卡皮巴拉 文章目录 目录 力扣题目: 无重复的最长字串 题目描述 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码(C) 兄弟们共勉 !!! 每篇前言 博客主页&#x…

联想扬天M590台式机开机卡LOGO不引导故障维修案例分享

故障描述: 用户送修联想扬天M590台式机到站端维修,说是开机不能正常进系统;站端检测开机后卡LOGO、无法加载引导系统; 故障检修: 插拔内存、插拔硬盘,更换内存、更换硬盘均不能解决此故障;调试…

C++刷题(三):string

📝前言说明: 本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C。 每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…