Raspberry Zero 上实现平滑视频图传
在某些应用场合我们可能需要通过一个设备通过WIFI将图像传到其它的机器进行显示或者图形分析,那怎么可以低成本地实现呢?其实很简单,我们只需要一块 Raspberry Zero W 和一个RPI 摄像头就行了,两个加起来成本也只不过150左右。
这个组合不单单只是实现一个图传,最重要的是Raspberry Zero上运行的是Linux,它几乎可以运行我们各种各样的代码。将它作为一个小型的编程平台也未尝不可。
由于硬件部分太简单了没有必要浪费篇幅过多地讲述,那就直接进入软件部分。实现图传必然有两端:发送端与接收端。
发送端 - 运行于Raspberry Zero通过OpenCV直接读取视频流,然后将数据写入到Socket中发送出去。如果实时传递的话可能会由于网络通信等的各种原因导致丢包,或者说由于失去有效的网络连接而引发程序的异常,为了防止这种情况出现我使用了pyzmq这个包,发送端也是消息的发布方,将Socket的处理放到消息队列中,当订阅方从消息队列中读取信息时就从Socket中拿出排队的数据,这样处理起来就平滑多了。
接收端 - 可运行于所有能运行python环境的平台,它只负责从Socket中读取流数据然后通过OpenCV显示到窗口中,也是消息的订阅方。
Python 中的Socket使用可以说是在众多语言中最简单的,关于Socket的知识在此不多讲,不懂的朋友可以先去找些资料先学习一下。
发布方与订阅方都需要安装pyzmq:
安装 pyzmq
$ pip install pyzmq
如果在树莓上安装pyzmq会非常慢可能要等个10来20分钟的,不要以为你的树莓挂了只是Raspberry Zero性能实在太低要进行本机编译实在是一件非常痛苦之事。
发布方 - Streamer
Raspberry Zero 端的发布方的代码如下:
import base64
import cv2
import zmq
context = zmq.Context()
footage_socket = context.socket(zmq.PUB)
footage_socket.connect('tcp://*:5555')
camera = cv2.VideoCapture(0)
while True:
try:
success, frame = camera.read()
if not success:
break;
frame = cv2.resize(frame, (640, 480)) # 将每一帧的画面大小设置为640x480
encoded, buffer = cv2.imencode('.jpg', frame)
jpg_as_text = base64.b64encode(buffer)
footage_socket.send(jpg_as_text)
except KeyboardInterrupt:
camera.release()
cv2.destroyAllWindows()
break
原理非常简单就是将每一帧的画面先转成base64的编码格式以字符流的方式写入到socket中传出去。
运行代码:
pi $ python streamer.py
订阅方 Viewer
import cv2
import zmq
import base64
import numpy as np
context = zmq.Context()
footage_socket = context.socket(zmq.SUB)
footage_socket.bind('tcp://10.0.0.25:5555') # 这里需要指定Steamer的发地址
footage_socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode(''))
while True:
try:
source = footage_socket.recv_string()
img = base64.b64decode(source)
npimg = np.fromstring(img, dtype=np.uint8)
frame = cv2.imdecode(npimg, 1)
frame = cv2.flip(frame, flipCode=-1)
cv2.imshow("Stream", frame)
cv2.waitKey(1)
except KeyboardInterrupt:
cv2.destroyAllWindows()
break
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?