在某些应用场合我们可能需要通过一个设备通过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

Raspberry Zero 上实现平滑视频图传的更多相关文章

  1. 《在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波》 --Gabor增强的具体实践

    <在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波>                                          --Gabor增强的具体实践     一.问 ...

  2. ueditor上传大容量视频报http请求错误的解决方法

    故障现象: 当使用百度编辑器ueditor上传大容量视频或大容量图片的时候,编辑器报"http请求错误"的解决方法详解: 原因分析: 目前很多CMS整合了百度的ueditor编辑器 ...

  3. live555在Raspberry Pi上的点播/直播

    1.live555在Raspberry Pi上的点播 live555MediaServer这个实例是个简单的服务器,支持多媒体点播,直接在Raspberry Pi上编译运行,或者通过交叉编译出ARM核 ...

  4. iOS - 选取相册中iCloud云上图片和视频的处理

    关于iOS选取相册中iCloud云上图片和视频  推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...

  5. 「小程序JAVA实战」小程序上传短视频(46)

    转自:https://idig8.com/2018/09/14/xiaochengxujavashizhanxiaochengxushangchuanduanshipin45/ 个人信息:用户上传短视 ...

  6. 百度编辑器上传大视频报http请求错误怎么办

    百度编辑器UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码,所以受到很多开放人员的青睐.但是有时 ...

  7. indows下PHP通过ffmpeg给上传的视频截图详解

    windows下PHP通过ffmpeg给上传的视频截图详解,php_ffmpeg.dll安装下载,找了很久php_ffmpeg.dll的下载地址和应用,发现有用的资源很少,现在问题解决了,贴出来跟大家 ...

  8. asp.net下ueditor上传大容量视频报http请求错误的解决方法

    故障现象: 当使用百度编辑器ueditor上传大容量视频或大容量图片的时候,编辑器报“http请求错误”的解决方法详解: 原因分析: 目前很多CMS整合了百度的ueditor编辑器,但是上传稍微大一点 ...

  9. php使用ffmpeg获取上传的视频的时长,码率等信息

    视频上传是程序员在很多时候需要用到的操作,然而上传完视频肯定要获得一些视频的详细信息,php本身是不支持信息获取的 ,所以采用ffmpeg第三方插件 首先你需要下载ffmpeg文件:官网地址:http ...

随机推荐

  1. Markdown:常用语法

    1.标题 说明:一共可以6级标题,几级几个# 一级标题 #一级标题 2.代码 用前后扩上 Hello World! 3.代码块 用前后扩上 Hello World! 4.加粗 加粗了 **加粗了** ...

  2. Scrapy实现腾讯招聘网信息爬取【Python】

    一.腾讯招聘网 二.代码实现 1.spider爬虫 # -*- coding: utf-8 -*- import scrapy from Tencent.items import TencentIte ...

  3. mssql sqlserver 使用sql脚本输出交替不同的背景色的html信息的方法分享

    转自:http://www.maomao365.com/?p=6679 摘要: 下文将分享使用sql脚本输出交替变换的不同背景颜色的sql脚本的方法分享,如下所示: 实验环境:sqlserver 20 ...

  4. CentOS 7更改yum源与更新系统

    在CentOS 7下更改yum源与更新系统. [1] 首先备份/etc/yum.repos.d/CentOS-Base.repo cp /etc/yum.repos.d/CentOS-Base.rep ...

  5. Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)

    1. CFS如何选择最合适的进程 每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个 ...

  6. win10系统中如何解决cmd中的路径和现在电脑的用户名不一致

    假设原用户名老王,已删除,但是cmd后路径还是C:\Users\老王>,这与现在用户laowng不一致了需改为C:\Users\laowang>. .先新建一个管理员账户laowang,然 ...

  7. 深入学习SpringMVC以及学习总结

    一.优点: 1.SpringMVC简化web程序开发; 2.SpringMVC效率很好(单例模式): 3.SpringMVC提供了大量扩展点,方便程序员自定义功能: ①.DispatcherServl ...

  8. [Hive_8] Hive 设计优化

    0. 说明 在 Hive 中,数据库是一个文件夹,表也是文件夹 partition,是一个字段,是文件 前提:在 Hive 进行 where 子句查询的时候,会将条件语句和全表进行比对,搜索出所需的数 ...

  9. linux c 语言之--fseek(),fseeko(),fseeko64()讲解 (转载)

    转载:http://blog.csdn.net/lemoncyb/article/details/16841317 fseek() 函数讲解: 函数定义: int fseek(FILE *stream ...

  10. chrome postman插件手动安装

    注:转自 http://blog.csdn.net/u010246789/article/details/51481134 1.下载postman插件,可以自己到网上下载,也可以点击http://do ...