一种基于树莓派的无线WiFi视频采集传输方法

2020-04-22 06:45董新华
科学技术与工程 2020年6期
关键词:视频流PC机服务器端

朱 磊,王 鑫,刘 屹,董新华

(1.西安工程大学电子信息学院,西安 710048;2.杭州感想科技有限公司,杭州 310052)

图像视频信息的采集传输是视频监控系统中的重要组成部分,随着经济的快速发展,城市规模的迅速扩大,视频监控系统也被广泛应用于企业、学校、银行、居民小区等场合[1-2]。随着无线网络技术的发展,图像视频信息的传输也从最初的有线传输变成为无线网络传输[3]。针对自研发的电能质量问题模拟电源系统的运行状态的实时监测,提出了一种基于树莓派的无线WiFi(wireless fidelity)视频采集传输方法。

目前,图像视频网络传输的方式主要分为两种:一是基于WiFi的无线网络传输,使用WiFi网络传输较为方便,许多嵌入式产品也可以使用无线网卡来连接WiFi网络,使用较为方便;二是基于4G的无线网络传输,虽然网速较快但由于是按流量计费,对于视频传输来说价格相对较贵[4]。图像视频网络传输常用的嵌入式操作系统中有Linux、Android、wince等,由于Linux是一款开放源代码的操作系统且有性能高、稳定、内核精简等优点[5]。而树莓派操作系统是Linux操作系统,所以选用树莓派[6-7]。基于树莓派的无线WiFi视频采集传输方法可以分为两种:第一种方法是基于SD卡(secure digital memory card)转存的视频采集传输方法(记作方法一),其特点是采用H.264视频编码技术,将采集到的视频先储存到树莓派的SD卡中,然后通过无线网络传输到PC(personal computer)机上[8-9];第二种方法是基于OpenCV(open source computer vision library)的视频采集传输方法(记作方法二),其特点是采用JPEG(joint photographic experts group)压缩算法,将采集到的视频进行压缩之后通过无线网络传输到PC机上[10]。

针对基于树莓派的无线WiFi视频采集传输方法存在的实时性差、传输速率慢的问题。现提出一种基于树莓派的无线WiFi视频采集传输方法,该方法使用Picamera采集视频流,并且使用并行线程来处理获取的视频流,压缩JPEG格式的网络视频流,最后向PC端发送JPEG格式的网络视频流。本文方法基本解决了实时性差、传输速率慢的问题。提出方法与基于SD卡转存的视频采集传输方法相比,具有更好的实时性,且解决了存储空间占据较大的问题;与基于OpenCV的视频采集传输方法(记作方法三)相比,画质更加的清晰;与基于Picamera的视频流采集传输方法相比,数据传输的速率更快,达到了较好的效果。

1 基于SD卡转存的视频采集传输方法

基于树莓派的无线WiFi图像采集传输模块如图1所示,可以分为三个部分:一是用树莓派及官方的摄像头,对目标的视频进行采集;二是将采集到的视频进行传输;三是在PC机上显示采集到的视频。该方法在硬件方面由树莓派、路由器及PC机组成,软件部分主要为Python编写的客户端和服务端以及Linux系统的环境配置等。

图1 树莓派视频采集模块示意图

Python编程中提供了强大的网络编程支持,网络编程中的一个基本组件是套接字(Socket)。套接字是进程间通信的一种方式,与其他进程间通信的主要区别在于,套接字能够实现不同主机间的进程间通信。套接字主要分为服务器套接字和客户端套接字。客户端与服务端各有一个Python程序,通过网络连接,这些程序可以在不同的计算机通过套接字进行通信。创建服务器套接字后,让其等待连接请求的到来,这样套接字将在某个网络地址处监听,网络地址就是由IP(internet protocol)地址和端口号组成的,直到客户端套接字建立连接后,服务器端和客户端才能进行通信。

基于SD卡转存的视频采集传输方法的主要特点是先将视频储存到SD卡中然后通过套接字传输到PC机端。方法具体是通过Python实现的,首先以PC机为服务端并实现其功能,创建套接字的时候可以指定三个参数:一是地址族,默认为Socket.AF_INET;二是流套接字或者数据报套接字,因为使用的是TCP(transmission control protocol)套接字,所以选取流套接字 Socket.SOCK_STREAM[10];三是协议,使用的时候默认值为0。然后用函数bind绑定本地信息,用listen来监听特定的地址,这里监听的地址为客户端地址即树莓派的IP地址。树莓派为客户端并实现其功能,使用摄像头采集目标的视频,并且先将视频储存到树莓派的SD卡中,然后创建套接字,连接到服务器端。服务器端套接字监听到后,就可以和树莓派客户端进行通信。之后再进行数据的传输,在传输之前对传输的视频进行打包处理,定义打包规则以及定义文件头信息(包含文件名和文件大小),首先发送头部信息,然后检查正常,开始处理文件并且读取文件数据,最后由Socket提供的send()函数发送数据。在服务器端由Socket套接字提供的recv()函数首先接收客户端发过来的头部信息,然后解包得到的文件名和文件大小,并且处理文件名,使用strip删除文件名中多余的空字符,最后接收文件。Python的套接字提供了两个函数:send()和recv(),通过这两个函数可以将在树莓派采集到的视频传输到PC机上。经过测试,这种方法将采集到的视频储存到SD卡,画质虽然清晰,但是实时性较差且需要的存储空间较多。

2 基于OpenCV的视频采集传输方法

基于OpenCV的视频采集传输方法,其特点就是采集到的图像不用储存到树莓派的SD卡中,在采集的同时可以直接把图像发送到PC端。首先实现PC机的客户端的功能,客户端连接端口后,发送需要协商的分辨率和帧数,使传输图像的属性一致,客户端使用线程,对图片进行收集,对收到的每一张图片进行解码,并利用OpenCV播放出来。然后实现树莓派的服务器端的功能,先通过在服务器端利用OpenCV捕获到视频中的每一帧图片,将这些图片进行压缩成JPEG格式,以便于传输,按照提前协商好的分辨率和帧数进行打包编码传输,利用服务器端打开端口,在连接客户端后,便可以在客户端中捕获到服务器端的每一帧图片,即可实现服务器端与客户端两端的实时视频传输。这种方法是以树莓派为服务器端、PC机端为客户端,由树莓派端采集视频后通过无线网络传输到PC机端。具体的操作方法是在PC端建立一个Python文件,同样的,在树莓派端建立一个Python的文件,并设置采集分辨率为640×480,帧数设置为30。然后分别运行两端的Python文件,在PC机端可以得到结果。客户端和服务端工作流程图如图2所示。

图2 客户端和服务端流程图

3 改进后的基于Picamera视频流采集传输方法

3.1 基于Picamera视频流传输方法

基于Picamera视频流传输方法的特点是不用储存到树莓派的SD卡中,在缓存中可以直接把图像视频信息实时的发送到PC端。由于视频的采集传输方法的本质是图片的传输,而不是处理图片,如果想处理每一帧图片,最好的方法是通过拍摄一段视频来解码,然后使用OpenCV模块从视频中获取每一帧的图片,或者可以将获取到的视频,通过OpenCV模块将其传输到其他的设备上去处理。虽然这种方法比较方便,但因为得到的视频图像不清晰,所以省去了OpenCV的采集传输视频的功能,用Picamera模块来代替OpenCV模块。通过用Picamera模块和IO模块的搭配使用,得到了较好的结果。由于树莓派的IO读写速度优先,其用法可以通过创建一个新的数据流,然后通过独立线程来处理获取的图像流,通过套接字传输,达到实时传输的目的,处理和解码的速度都较理想,并且得到的画质也比较清晰。

首先实现树莓派的客户端功能,创建和初始化套接字,然后设置摄像头的分辨率以及帧数并创建一个Socket的文件流,通过Picamera模块中的 capture_continuous()方法设置use_video_port捕获图片并且将捕获的一组图片转换为网络数据流,最后发送JPEG格式的视频流。在PC机服务端部分,首先创建和初始化套接字,接收客户端发过来的视频流,然后通过cv2实时显示得到的视频流。具体操作如下:在PC端建立一个Python文件,在树莓派端建立Python文件,并设置采集分辨率为640×480,帧数设置为30。之后运行PC机服务器端的Python文件以及树莓派端的Python文件。使用这个方法,PC机端将以10 frame/s左右的速度获取一组640×480的图片,服务端和客户端接收流程图如图3所示。

图3 服务端和客户端接收流程图

3.2 改进后的Picamera视频流采集传输方法

基于Picamera视频流传输方法虽然是实时的,但是在实时传输的速率方面比较慢,存在一定缺陷。因此,为了得到一个更加理想的效果,在客户端程序加入并行线程,通过使用线程将捕获到的视频流传输到服务器端,加入线程将更加高效的同时处理图像的捕捉和传输,这种方法能够达到 15 frame/s左右的速度来获取数据流。下面对部分程序进行说明:在树莓派端加入并行线程,net.write(struct.pack(′

def run(self):

# 这是个并行运行的线程

while not self.terminated:

# 等待图像被写入视频流

if self.event.wait(1):

try:with

net_lk:

net.write(struct.pack(’

net.flush()

self.stream.seek(0)

net.write(self.stream.read())

finally:

self.stream.seek(0)

self.stream.truncate()

self.event.clear()

# 将处理完的图片加载到序列中

with pool_lk:

pool.append(self)

图4 服务端和客户端接收流程图

4 测试平台搭建及测试结果

为了测试本设计的应用性,搭建了基于树莓派系统的视频采集和传输的测试平台,并且针对项目电能质量问题模拟电源及测试系统进行电路图像的采集和传输。硬件平台需要用到树莓派,CSI摄像头以及PC机。树莓派内的操作系统用的是raspbian官方系统及Python3、Python的编辑器,并且需要安装cv2模块、Picamera模块及IO模块,这些模块和软件共同构建了树莓派端的开发环境。摄像头选用的是树莓派官方提供的摄像头,该摄像头具有价格便宜、占用内存少及使用方便等优点。PC机使用的是Windows系统。在软件平台搭建方面,PC机上需要安装Python、OpenCV以及环境的配置等,在这里就不再赘述了。硬件平台如图5所示。

图5 测试平台

首先在测试前需要协定采集视频的分辨率及其帧数,采集的分辨率设置为640×480,帧数设置为每秒30帧。方法一是基于SD卡转存的视频采集传输方法,此方法是先储存到SD卡中,再用Socket套接字传输,在PC机端接收到视频文件,并且通过第三方软件打开视频文件。方法二是基于OpenCV的视频传输方法,此方法是把采集到的视频的每一帧用套接字传输到PC机端,在PC机上接收的。方法三是基于Picamera视频流传输方法,此方法是将采集到的视频流,转换成网络视频流传输到PC机端。提出的改进后的基于Picamera视频流传输方法,为了更加高效地同时处理图像的捕捉和传输,使用并增加了独立的并行线程,提高了捕获和传输的速度从而提高了效率。

在PC机端接收图像的画质方面:将上述3种方法分别提取如图6(a)上的红色区域块进行清晰度比较,比较后区域效果如图6(b)~图6(i)所示。由图6(b)~图6(i)可知,方法一虽然清晰但是由于其先储存再传输的特点,实时性不好,如图6(b)、图6(f)所示;方法二的画质与其他图的画质相比,清晰度较差,如图6(c)、图6(g)所示;方法三的画质比方法二好,且实时性比方法一好,如图6(d)、图6(h)所示;将本文方法与其余3种方法进行比较,结果显示本文方法比方法一的实时好,比方法二的画质好,且本文方法比其余3种方法的传输速率要高,如图 6(e)、图6(i)所示。

图6 各方法的效果

针对上述方法图像传输的速率方面如表1所示:方法一是基于SD卡转存的视频采集传输方法,其图像传输速率在10 frame/s左右,方法二是基于OpenCV的视频传输方法,其图像传输速率在 10 frame/s左右,方法三是基于Picamera视频流传输方法,其图像传输速率在10 frame/s左右,提出的改进后的基于Picamera视频流传输方法,对树莓派端的程序进行了改进,使用了独立的并行线程,从而提高了捕获和传输的效率。在树莓派端,可以检测出传输速度在15 frame/s左右。由表1可知,前几种方法改进之前的速率均是10 frame/s左右,但是本文方法速率可以达到15 frame/s左右甚至更高,方法的传输速率比较理想。

为了更加直观地比较几种方法的区别,做了批次的速率测量,并且计算出平均值,从表1中的各个方法的视频传输速率对比,可以直观的看出方法一的速率平均值为10.63 frame/s,方法二的速率平均值为10.88 frame/s,方法三的速率平均值 10.74 frame/s,改进后的方法的速率平均值为15.39 frame/s,由此可以得出结论,本文方法比改进之前的传输速率提高了接近1.5倍。

表1 各方法的视频传输速率对比

5 结论

提出一种基于树莓派的无线WiFi视频采集传输方法,硬件测试平台由树莓派、CSI摄像头、PC机及路由器组成的,软件方面使用了Python、OpenCV等软件,共同组建了视频采集和传输模块。采用三种方法与本文方法进行比较,本文方法与基于SD卡转存的视频采集传输方法比较,具备更好的实时性;与基于OpenCV的视频采集传输方法比较,画质更加清晰;与基于Picamera视频流采集传输方法相比,传输速率由原来的10 fps左右增加到了15 fps左右。通过使用基于树莓派的无线WiFi视频采集传输方法对视频进行采集和传输,实现了视频实时传输的功能。通过多次修改代码,得到了比较理想的实验效果。

猜你喜欢
视频流PC机服务器端
边缘实时视频流分析系统配置动态调整算法研究
基于视频流传输中的拥塞控制研究
Linux环境下基于Socket的数据传输软件设计
铁路货场智能大门集装箱全景图像采集方法研究
用VC++实现PC机与单片机的串行通信
基于Qt的安全即时通讯软件服务器端设计
VC.NET下实现dsPIC单片机与PC机的通信
基于Qt的网络聊天软件服务器端设计
单片机与PC机串行数据通信的工程实践
基于单片机与PC机的电气量采集系统设计