基于Mjpg-streamer的轻量级无线图传系统设计

2017-02-09 03:12唐文莹张海峰
单片机与嵌入式系统应用 2017年1期
关键词:图传线程摄像头

唐文莹,张海峰

(杭州电子科技大学 电子信息学院,杭州310018)



基于Mjpg-streamer的轻量级无线图传系统设计

唐文莹,张海峰

(杭州电子科技大学 电子信息学院,杭州310018)

提出了基于开源视频处理软件Mjpg-streamerh和嵌入式处理器S3C6410的无线图传系统,并设计了一种快速YUV2RGB转换算法;通过修改Mjpg-streamer源码并交叉编译后移植到嵌入式设备中,实现了视频图像采集和传输的功能,并设计了用于显示图传画面的安卓客户端。实验结果表明,该系统可以很方便地用于无人机图传或无线视频监控方案,并可以在安卓手机端流畅地播放视频画面。

Mjpg-streamer;S3C6410; YUV2RGB;无线传输;移动终端

引 言

无线图传系统在安防监控、机器人技术以及机器视觉等领域均有广泛的用途,应用于嵌入式设备的无线图传系统需要满足硬件资源消耗少、便携、图像清晰、带宽占用率低等条件。Mjpg-streamer是轻型的视频处理软件,可应用在基于IP协议的网络中,从图像采集设备中获得格式为JPEG的视频数据,并以流的形式传送到接收端,使用者通过输入视频服务器地址和端口号,就能方便地获得图像。图传系统资源消耗的主要部分是色彩空间转换和图像压缩,在对比了三种常用的YUV2RGB算法后,设计了一种适用于嵌入式设备的快速算法。针对Mjpg-streamer数据传输方式设计的客户端MjpgClient,可以运行于任意Android 4.0以上设备,具有界面友好、操作简便、图像清晰、画面流畅等特点。

1 系统设计与组成

本设计采用了将嵌入式视频处理软件Mjpg-streamer和安卓客户端相结合的方法,提出了一种基于C/S(客户端/服务器)架构的无线图传系统。系统主要由4个模块组成:

① 视频采集模块,由UVC摄像头和USB接口组成。摄像头选用HP 720P高清网络摄像头,分辨率为1280×720P,100万像素,输出视频格式为MJPG或YUY2,具有体积小、免驱动、即插即用、价格低廉的优点。该模块完成了将摄像头采集到的图像数据以JPEG格式通过USB接口传输给ARM开发板的功能。

② 视频图像处理模块,对图像数据的处理主要由S3C6410开发板和视频流服务器软件Mjpg-streamer来完成。该模块主要完成了图像的编码、打包及发送功能。

③ 视频图像传输模块,主要功能是在无线局域网中将经过处理器处理的数据利用无线网卡传送给客户端。

④ 安卓客户端,用于连接到服务器以及浏览视频图像。系统设计如图1所示。

图1 无线图传系统结构

2 Mjpg-streamer源码分析

2.1 V4L2视频采集流程

图2 V4L2视频采集操作流程

视频采集应用程序编程接口V4L(Video for Linux)是Linux内核里支持影像设备的一组API函数,V4L2是V4L的第2个版本,与V4L相比,它在扩展性和灵活性方面得到了很大的提高,并且可以支持更多的硬件设备,已成为Linux2.6下的标准接口。但由于它在V4L的基础上改动很大,所以与V4L并不兼容,V4L2的操作更加简单直观。V4L2的驱动结构分为两层:上层为videodev模块,下层为V4L2驱动程序。V4L2视频采集操作流程如图2所示[1]。Mjpg-streamer的视频采集和参数设置程序遵循了V4L2打开视频设备、设置图像格式、数据处理、关闭设备的基本操作流程。

2.2 Mjpg-streamer软件架构

Mjpg-streamer采用模块化设计,以模块为单位进行功能设计和行为描述,这些功能模块被称作组件(plugins),其架构主要分为三部分:主线程mjpg_streamer.c、输入组件input和输出组件output。其中主线程主要实现了对命令行参数的解析以及调用子线程运行各组件的功能函数。在mjpg-streamer.h头文件中定义了_globals结构体,该结构体声明了存放一帧JPEG数据的容器*buf、输入组件input和输出组件output[2]。Mjpg-streamer的软件架构如图3所示。

2.3 相关组件

Mjpg-streamer的组件分为输入组件input和输出组件output,程序中定义好了各个组件的输入、输出以及组件之间的衔接关系,用户可以根据需求方便地选择、删改所需的模块,具有高内聚、低耦合的优点。Mjpg-streamer最常用的输入组件为针对UVC(USB video class)摄像头的input_uvc,输出组件为针对B/S(Browser/Server)架构的output_http。

2.3.1 input_uvc输入组件

input_uvc输入组件主要完成的工作是获取摄像头拍摄的图片并将其进行压缩编码,共包括5个组件接口函数与其他接口衔接。input_run函数是输入通道的运行函数,利用pthread_create函数建立工作线程,调用cam_thread抓取摄像头采集的一帧图像并进行格式转换,等待线程执行完毕后,调用pthread_detach函数回收线程资源。其中抓图线程cam_thread的执行流程如图4所示。

图3 Mjpg-streamer的软件架构

图4 抓图线程cam_thread执行流程

2.3.2 output_http输出组件

output_http输出组件主要完成的工作为创建http服务器线程、以socket套接字形式将视频数据发送出去,并创建客户端线程、定义服务器对客户端请求的响应。服务器线程server_thread被定义在httpd.c中,由output_http.c的output_run函数创建,作用是打开一个TCP socket套接字并等待客户端连接。如有客户端连接,则为每一个连接到服务器的客户端创建一个client_thread,服务于该客户端,设置可同时监听10个客户端。客户端线程client_thread的主要工作为接收客户端发送的请求并进行解析,根据请求类型作出相应操作。客户端接收的请求类型如表1所列。

表1 客户端请求类型

3 YUV2RGB快速转换算法设计

目前市售摄像头输出图像格式多为YUV,包括亮度信号Y、饱和度Cb和色彩度Cr,最常用的模型是YUV422格式,在将YUV数据压缩前需要将其转换为RGB(红、绿、蓝)数据。在Mjpg-streamer的输入组件input_uvc中,使用compress_yuyv_to_jpeg函数实现YUV转RGB再压缩为JPEG的功能。

RGB与YUV转换方程如下:

式中,Y表示亮度值,Cr为红色的色度值,Cb为蓝色的色度值。

经矩阵运算的转换公式如下:

3.1 整型算法

由于YUV2RGB的转换会涉及到浮点运算,为了进行快速转换,可以通过移位将浮点运算变为整型运算[3]。算法设计如下:

u = YUVdata[UPOS] - 128;

v = YUVdata[VPOS] - 128;

rdif = v + ((v * 103)>>8);

invgdif = ((u * 88)>>8) +((v * 183) >> 8);

bdif = u +( (u*198) >> 8);

r=YUVdata[YPOS] + rdif;

g=YUVdata[YPOS] - invgdif;

b=YUVdata[YPOS] + bdif;

对计算结果进行判断,防止溢出:

if (r>255) r=255;

if (r<0) r=0;

从RGB24格式到RGB565格式的转换如下:

RGBdata[1] =( (r & 0xF8) | ( g >> 5) );

RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );

3.2 部分查表法

除了使用公式实现YUV2RGB的转换,还可以使用查表法,查表法分部分查表法和完全查表法。部分查表法是指将算法中一些复杂的运算直接通过数据之间的映射关系得到,而保留较为简单的运算。将上述算法中的乘法用部分查表法代替,可以加快处理速度[4-5]。

算法改进如下:

rdif = fac_1_4075[u];

invgdif = fac_m_0_3455[u] + fac_m_0_7169[v];

bdif = fac_1_779[u];

3.3 完全查表法

完全查表法是根据YUV与RGB数据的映射关系,直接通过查表得到对应的RGB值,但以最复杂的G分量为例,由于G与Y、U、V三种分量都有联系,如G = YUV2G[Y][U][V]运算,需要用到下标均为255的三维数组,约占16 MB空间,内存消耗过大。对于G分量,实际上能通过二次查表法,将其运算简化为对两个二维数组的操作[5]:

G = yig2g_table[y][uv2ig_table[u][v]];

而R分量和B分量本身就只与YU分量或YV分量相关,共需4个8×8的二维表,占4×216=256 KB内存空间[6-7]。由于在嵌入式设备中,数据最终会被转换成RGB565格式,用于显示在LCD屏上;根据完全查表法可以将描述RGB的8位(0~255)精度简化为高6位的数据,所以可以将转换映射表改为4个6×6的二维表,占用16 KB内存,加快运算速率,降低内存消耗。

最终设计的优化YUV2RGB快速转换算法如下:

y = (YUVdata[Y1POS]>>2);

u = (YUVdata[UPOS]>>2);

v = (YUVdata[VPOS]>>2);

r = yv2r_table[y][v];

g = yig2g_table[y][uv2ig_table[u][v]];

b = yu2b_table[y][u];

RGBdata[1] =((r&0xF8)|(g>>5));

RGBdata[0] =(((g&0x1C)<<3)|(b>>3));

4 Android客户端设计及系统测试

4.1 Android客户端设计

针对Mjpg-streamer的数据发送模式,设计了Android客户端MjpgClient,用于连接到视频服务器并浏览视频画面。软件架构如图5所示。

图5 客户端软件架构

程序设计了三个包:Activity、IO和View。其中Activity包用于存放登录界面LoginActivity和主界面MainActivity;IO包中的MjpegInputStream类继承了DataInputStream类,实现了Serializable接口,用于获取视频流,并进行数据解析;View包中的MjpegView类继承了SurfaceView类,实现了SurfaceHolder.Callback接口,用于获取一帧图像并显示在画布Canvas上。程序设计了两个主要的工作线程:继承于异步任务AsyncTask的ConnectTask,用于创建http客户端与视频服务器连接、获取输入流并通过按钮实现Activity的跳转;继承于Thread、服务于MjpegView的渲染线程MjpegViewThread,用于抓图和显示视频画面。程序的执行流程如图6所示。

图6 MjpegClient执行流程

4.2 系统测试

硬件平台方面,摄像头选用HP 720P高清网络摄像头,分辨率为1280×720P,100万像素,输出视频格式为MJPG或YUY2;网卡选用EOUP 2.4G USB无线网卡,带宽为300 Mbps;视频服务器选用ARM11开发板,CPU为S3C6410,主频700 MHz,内存512 MB。软件平台方面,视频服务器平台操作系统为基于Debian GUN/Linux的原生系统Raspbian;视频服务器软件为mjpg-streamer-r63;客户端手机操作系统为Android 4.2.2,APP为MjpegClient。实验步骤如下:

① 根据软件平台修改Mjpg-streamer源码,移植到开发板中并编译通过;

② 编写自启动脚本,修改/etc/rc.local文件,实现Mjpg-streamer开机自启动;

③ 打开手机热点,设置开发板为固定IP并指定连接的热点;

④ 打开手机端的APP-MjpegClient,输入视频服务器IP地址和端口号,按下connect按钮控件,即可浏览视频画面。实测效果如图7所示。

图7 无线图传系统实测

实测数据如表2所列。

表2 无人机中图传系统测试环境与测试结果

结 语

[1] 刘登诚,沈苏彬.嵌入式Linux设备驱动程序开发技术的研究[D].南京:南京邮电大学,2011:48-65.

[2] 周鹏飞,潘地林.基于MJPG-Streamer的移动视频监控系统的设计与研究[D].淮南:安徽理工大学,2013:36-42.

[3] H NOBUHARA,K HIROTA,F DIMARTINO,et al.Fuzzy Relation Equations for Compression/Decompression Processes of Colour Images in the RGB and YUV Colour Spaces[J].Fuzzy Optimization and Decision Making,2005(4):235-246.

[4] YIYUN YAN,HUIDONG DAI,XINGJIONG LIU,et al.Colored adaptive compressed imaging with a single photodiode[J].Applied Optics,2016,55(14):3711-3718.

[5] 冯永超,罗敏,贺贵明.一种快速YUV-RGB彩色空间变换方法[J].微型机与应用,2002(7):59-60.

[6] 刘小龙,何勇.基于无人机遥感平台图像采集处理系统的研究[D].杭州:浙江大学,2013:60-63.

[7] 陈坤,苏韩松.微型无人机图像传输系统研究[D].天津:天津大学,2011:10-15.

[8] 肖征宇,郑耀,宋广华.无人机地面站软件的设计与实现[D].杭州:浙江大学,2010:3-5.

[9] 陈书益,黄永慧.开源视频服务器软件MJPG-streamer的研究和应用[J].电子设计工程,2012,20(5):172-176.

唐文莹(在读硕士研究生),主要研究方向为嵌入式系统应用;张海峰(副教授),主要研究方向为智能仪器设备。

[3] 李娟.基于蓝牙技术的无线数据包采集系统的设计[J].微计算机信息,2008(24):2.

[4] 赵霄.基于单片机的蓝牙接口设计及数据传输的实现[D].北京:北京交通大学,2008.

[5] 杨战社.基于蓝牙技术的数据传输[D].西安:西安科技大学,2005.

[6] 李浩瑜,唐荣斌.Android设备与STM32单片机通信方式的研究[J].通信设计与应用,2014(11).

[7] 谢景明.Android移动开发教程[M].北京:人民邮电出版社,2013.

[8] 唐霞.基于单片机的LED汉字显示屏的设计与Proteus仿真

[J].电子技术,2009(2):19-22.

[9] Joshua Bloch.Effective Java[M].2版.杨春花,俞黎敏,译.北京:机械工业出版社,2009.

[10] 谭浩强.C程序设计[M].4版.北京:清华大学出版社,2010:142-165.

[11] 翟震,张春玲.用74HC595芯片驱动LED的电路设计[J].机床与液压,2004,151(12):151-152.

邓高旭、王一鸣(在读研究生),研究方向为嵌入式应用与研究;邓琛(教授),研究方向为数字信号处理与智慧交通等。

(责任编辑:薛士然 收稿日期:2016-07-04)

Light Wireless Image Transmission System Design Based on Mjpg-streamer

Tang Wenying,Zhang Haifeng

(College of Eletronic Information,Hangzhou Dianzi University,Hangzhou 310018,China)

In the paper,the light wireless image transmission system based on Mjpg-streamer and S3C6410 is proposed,and a fast YUV2RGB conversion algorithm is designed.The Mjpg-streamer source is transplanted into the embedded system after modifying and cross-compiling,then the functions of video capture and transmission are realized.The Android client is used to display the video images.The experiment results show that the system can be easily used in unmanned aerial vehicle image transmission or wireless video monitoring scheme,and can display the video image smoothly in the Android terminal.

Mjpg-streamer;S3C6410;YUV2RGB;wireless transmission;mobile terminal

TP311.1

A

�士然

2016-07-14)

猜你喜欢
图传线程摄像头
浙江首试公路非现场执法新型摄像头
摄像头连接器可提供360°视角图像
基于国产化环境的线程池模型研究与实现
一种无线可视化有害气体探测仪的设计
DJI Goggles Racing Edition FPV眼镜
浅谈linux多线程协作
Arkbird天线追踪模块
奔驰360°摄像头系统介绍
《材料图传》
--关于材料发展史的对话
么移动中间件线程池并发机制优化改进