周文博 张勇 孙良义 苏军
摘 要:针对现有的视频传输系统存在的技术复杂、研发周期长、研制成本高等问题,本文以嵌入式技术为基础结合开源高效的OpenCV(Open Source Computer Vision Library)视频觉库,设计和实现了一种可应用于舰载无人机的无线视频传输系统。该系统采用Client/Server的架构模式,以嵌入式ARM(Advanced RISC Machine)开发板做为视频信息采集的硬件平台,通过搭建的MJPG-streamer服务器软件对视屏模块采集的信息进行处理和传输;以Visual Studio 2010作为软件开发平台,利用OpenCV技术构建了客户端视频实时显示与存储软件;测试表明:该系统能有效实现视频信息的采集、处理、传输,以及实时显示与存储;系统运行稳定,远程获取得到视频数据清晰流畅;系统软硬件成本较低且采用免费跨平台的开源控件简单易于推广使用,具备一定的实用价值。
关键词:舰载无人机;视频传输;OpenCV;ARM
中图分类号:TP391 文献标识码:A
Research on the Application of Embedded Wireless Video Transmission
System in Shipboard Unmanned Aerial Vehicle
ZHOU Wenbo, ZHANG Yong, SUN Liangyi, SU Jun
(Unit 91388 of PLA, Zhanjiang 524022, China)
1325157181@qq.com; 1845971@qq.com; 26900939@qq.com; soldierales@163.com
Abstract: Aiming at the defects of the existing video transmission systems, such as complex technology, long period of development and high development cost, this paper designs and implements a wireless video transmission system which can be applied to shipborne Unmanned Aerial Vehicle (UAV), based on embedded technology and efficient Open Source Computer Vision Library (OpenCV). Adopting the Client / Server architecture and using the embedded ARM (Advanced RISC Machine) development board as the hardware platform for video information collection, this system processes and transmits information collected by the video module through the MJPG-streamer server software. Taking Visual Studio 2010 as the software development platform, this system uses OpenCV technology to build the real-time display and storage software of the client video. The experiment result shows that this system can effectively collect, process, transmit, real-time display and store video information. This system also runs stably with clear and smooth video data. This system is easy to be widely applied because of its low cost of hardware and software with free cross-platform open source control.
Keywords: shipborne UAV; video transmission; OpenCV; ARM
1 引言(Introduction)
舰载无人机[1]是一种可装备在驱逐舰、护卫舰和海事船[2]等水面平台,用以执行空中航拍、海洋监测、海事执法和搜索救援等任务的特殊无人机,与有人驾驶飞机相比,其具有使用成本低、机动性能好、智能化程度高且容易布放与回收等特点,在民用和军用领域应用前景广阔。实时有效获取舰载无人机作业现场的视频图像数据,对其加以分析处理不仅能有效提升舰载无人机在海域空域中侦查搜索、目标识别及跟踪监测等多方面的性能,同时高清的视频图像还能为后方指控人员制定决策提供参考依据,根据作业现场情况变化实时调整任务。然而现有视频传输系统采用的技术大多较为复杂、技术整合难度大、研制周期长、研发成本高[3],因此,研究舰载无人机视频传输技术,进一步降低其研制和使用成本,对于促进舰载无人机技术的应用和发展具有重要意义。
基于上述背景,本文设计和实现了一种可应用于舰载无人机的嵌入式Linux无线视频传输系统,该系统通过嵌入式ARM开发板搭载的视频模块实现对无人机作业现场视频信息的采集,采用MJPG-streamer[4]视频服务器对采集到的视频信息进行处理和传输,利用OPenCV[5]技术实现采集的图像数据在远程客戶端实时显示与存储。
2 系统总体设计(Overall system design)
视频传输系统采用服务器与客户端(Client/Sever)结构,服务器端负责舰载无人机视频图像信息的采集、压缩编码和传输,客户端负责实现数据的显示与存储。其中服务器端主要包含嵌入式ARM开发板、无线通信模块和视频模块等硬件,采用嵌入式Linux作为服务器端的操作系统,通过MJPG-streamer视频服务器将采集的视频信息编码处理以流的形式经无线模块传输至客户端。客户端硬件主要由无线通信模块和PC(Personal Computer)机组成,以Visual Studio 2010作为客户端软件开发平台,利用OpenCV技术实现图像数据在客户端的显示和存储,系统的总体设计如图1所示。
系统选用OK6410嵌入式开发板作为服务器端的硬件平台,其搭载基于ARM1176JZF-S内核的SamsungS3C6410微处理器,主频标配为533MHz,最高可运行至667MHz,开发板支持硬件编解码,外围配置USB Host、USB Device、Audio、SD/MMC/SDIO等多种接口,支持WinCE6.0、Linux3.0.1、Android2.3.4等多种操作系统,开发板在音视频处理[6]、图像显示方面性能优异,已有较多的成功应用案例。
系统采用BL-LW05-2M模块作为无线通信模块,该模块采用RalinkRT3070L芯片实现信息的收发,最大可实现150M/bps的传输速率,具有Infrastructure Mode、AdHoc Mode和AP三种工作模式,兼容Linux、Windows、Wince等多种操作系统,开发设计方便。
视频模块选用LogitechC270高清USB网络摄像头,其具备动态130万像素、最高30帧/s的图像输出速率,采用USB2.0传输接口,便于与ARM开发板搭载连接,且作为标准的UVC设备,在Linux操作系统下可以免驱使用。
3 服务器端软件實现(Server-side software implementation)
3.1 嵌入式Linux系统的移植
在OK6410开发板上移植嵌入式Linux系统步骤包括安装交叉编译组件、Uboot编译、kernel编译和最小文件系统的制作等步骤。具体过程简述如下:
(1)将交叉编译组件源码解压至虚拟机ubnutu系统中的/usr/local/arm文件夹下,在etc/profile文件中设置交叉编译器的搜索路径。
(2)将开发板提供的Uboot源码拷贝至虚拟机解压,将相关参数配置成与开发板相对应的版本,执行“make”命令,对Uboot进行编译,得到其镜像文件。
(3)解压嵌入式Linux的内核源码,执行“make menuconfig”命令对内核进行裁剪配置,执行“make zImage”命令生成内核镜像文件。
(4)执行“make menuconfig”命令对BusyBox进行配置,然后执行“make”命令对BusyBox进行编译,根据生成的文件配置项目所需的最小文件系统。
(5)将Uboot镜像文件、内核镜像文件和最小文件系统烧写到嵌入式OK6410开发板上,至此Linux系统在服务器硬件平台上的移植工作完成。
3.2 无线网卡驱动的移植
为了确保无线通信模块的正常使用,需要在嵌入式开发板上移植无线通信模块驱动,将驱动源码拷贝内核目录下,解压后使用cd命令进入驱动模块的文件夹,对makefile文件进行如下修改:
(1)进行芯片选型设置CHIPSET = 3070,硬件平台选型设置PLATFORM= SMDK。
(2)在如下位置处添加内核源码路径和交叉编译器路径:
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = 内核源码路径
CROSS_COMPILE = 交叉编译器的路径
(3)执行“make”命令,对驱动进行编译,将生成的rt3070sta.ko文件拷贝至开发板上,即可完成无线网卡驱动的移植。
3.3 MJPG-streamer服务器移植
MJPG-streamer是一款免费开源的视频流服务器软件,该软件采用LinuxC语言编写,在不同的计算机平台间具有较好的移植性,继承自uvc_streamder组件,能较好兼容Linux_uvc的摄像头,通过V4L2接口从视频模块采集视频信息,具备利用视频模块的硬件压缩功能实现对图片信息的处理,能有效降低服务器端CPU的载荷,提高系统的运行效率;其将采集的图像数据处理生成为JPEG格式,以数据流的形式通过网络发送至客户端,用户只需通过IP地址即可在客户端的浏览器实现对视频数据流的实时获取。MJPG-streamer服务器软件视频信息处理流程如图2所示。
MJPG-streamer基于jpeg库来处理视频图像数据,为确保Mjpeg-streamer在嵌入式ARM开发板上能正常运行必须先移植jpeg库,具体过程如下:
(1)jpeg库的编译与移植
首先,配置jpeg库,添加交叉编译组件的搜索路径和交叉编译后文件的保存目录。
其次,分别执行“make”“make install”命令。
最后,将编译生成的文件拷贝到开发板。
(2)MJPG-streamer编译与移植
首先,将服务器源码顶层文件夹及plugins文件夹中各子文件夹中make文件中的编译器修改为开发板指定的交叉编译版本。
其次,对plugins目录下input_uvc文件夹中Makfile文件进行修改,添加对jpeg库的支持。
最后,执行编译命令,将生成的.so文件拷贝到开发板对应的目录下,至此MJPG-streamer移植工作完成。
4 客户端软件实现(Client software implementation)
本文以Visual Studio 2010作为客户端软件开发平台,结合Visual Studio 2010平台下的MFC(Microsoft Foundation Class)技术和OPenCV机器视觉库,实现舰载无人机无线视频传输系统客户端软件的开发。
MFC是微软基础类库的简称,其以C++类的形式封装了Windows API(Application Programming Interface),库中包含大量Windows句柄封装类、Windows的内建控件和组件的封装类[7],使用该类库进行软件开发可以在很大程度上的减小程序设计人员的工作量。
OpenCV为开源的跨平台计算机视觉库,该库采用C及C++语言编写,库内的代码经过优化,具有较高计算效率,其提供友好的机器视觉接口函数,能有效缩短复杂机器视觉产品的研发时间[8]。
4.1 视频数据实时显示
本文基于OpenCV库中的VideoWrite类实现视频信息的实时显示,该类提供了从摄像机和视频文件获取视频数据的接口,用以读取和控制视频流、处理每一帧图像;为达到实时采集与显示的效果,使用Visual Studio 2010提供的软件定时器,设置每10毫秒从视频数据流中读取当前每一帧视频数据,并将其在Visual Studio 2010的Picture控件中周期性的更新显示出来。无线视频传输系统的实时显示功能实现步骤如下:
(1)使用VideoCapture类的Open()函数实现对视频服务器的视频流获取。
capture.open("http://192.168.***.**:8080/?action=stream?dummy=param.mjpg");
(2)创建视频播放显示的窗口。
namedWindow("ImageShow");
hWnd = (HWND)cvGetWindowHandle
("ImageShow");
hParent=::GetParent(hWnd);
::SetParent(hWnd,GetDlgItem(IDC_STATIC)->m_hWnd);
::ShowWindow(hParent,0);
通过namedWindow()函数指定ImageShow为视屏显示的窗口,并获取该窗口的指针hWnd,为了使视频数据能在基于MFC类库编写的软件界面上显示,使用SetParent()函数将MFC的Picture控件设置为ImageShow窗口的父窗口。
(3)设置软件定时器。
SetTimer(1,10,NULL);
使用SetTimer()函数创建一个ID号为1的定时器,设置该定时器每10毫秒触发一次MFC类的WM_TIMER消息并通过OnTimer()函数对触发的消息进行响应和处理。
(4)编写OnTimer()函数响应定时器1的触发消息,实现对视频数据的实时获取和显示。
Void CvideoDlg::OnTimer(UINT_PTR nIDEvent)
{
……
case 1:// 对定时器1的触发消息进行响应
{
//采集每一帧图像并对其进行显示
}
……
}
可在OnTimer()函数中对获取到的每一帧视频数据进行处理,如图像去抖、特征点提取、目标监测等相关操作,直至完成数据的采集、处理和播放。
(5)視频采集结束后,终止定时器。
KillTimer(1);
视频数据实时显示功能实际测试效果分别如图3和图4所示。
图3和图4分别为室内环境下和户外远程测试环境下的视频数据采集和实时显示情况,由图3和图4可知客户端获取得到的视频数据清晰,系统运行流畅无卡顿。
4.2 视频数据的保存
本文基于OpenCV库中的VideoWrite类实现视频信息的写入存储,为确保视频数据的连续不间断保存,使用Visual Studio 2010提供的软件定时器,设置了每10毫秒从视频流中获取一帧图像数据,然后将每一帧图像数据经VideoWrite类write()函数周期性写入事先指定的视频文件。视频保存功能实现步骤如下:
(1)使用VideoWrite类的Open()函数对即将保存的视频数据进行文件名、视频编码格式、帧率、保存视频的高度和宽度等参数进行设置。
time=CTime::GetCurrentTime();
m_strTime = time.Format("%Y年%m月%d日%H时%M分%S秒");
sprintf(vname,"E:\\robot%s.avi", m_strTime);
fps = capture.get(CAP_PROP_FPS);
size((int)capture.get(CAP_PROP_FRAME_WIDTH),(int)capture.get(CAP_PROP_FRAME_HEIGHT));
writer.open(vname,CV_FOURCC('M', 'J', 'P', 'G'), 25, size);
(2)创建软件定时器。
SetTimer(2,10,NULL);
创建一个ID号为2的软件定时器,设置触发时间为10毫秒。
(3)根据需要在MFC提供的回调函数OnTimer()中实现将视频信息的周期性写入指定的视频保存文件,代码如下:
Void CvideoDlg::OnTimer(UINT_PTR nIDEvent)
{
……
case 2://对定时器2的触发消息进行响应
{
//处理每一帧图像,将其按规定的格式写入指定的文件
}
……
}
(4)视频数据存储完成时,关闭定时2。
KillTimer(2);
视频保存测试效果如图5所示。
5 结论(Conclusion)
本文设计和实现了一种可应用于舰载无人机的基于嵌入式Linux技术的无线视频传输系统。该系统采用Client/Sever的架构模式,以嵌入式RAM开发板作为视频信息采集的硬件平台,通过搭建MJPG-streamer服务器软件对视屏模块采集的信息进行处理和传输;以Visual Studio 2010作为远程客户端开发平台,利用OpenCV技术构建了客户端视频实时显示和存储软件;测试表明:该系统能有效实现视频信息的采集、处理、传输以及显示和存储功能,系统运行稳定,远程客户端获取得到的视频信息清晰流畅,系统软硬件成本较低且采用免费跨平台的开源控件简单易于推广使用,具备一定的实用价值。
参考文献(References)
[1] 刘振兴,戴耀.舰载无人机系统电子对抗作战运用研究[J].飛航导弹,2017(3):53-56.
[2] 陈剑栋,蔡程,上官信.浅谈无人机在海事监管领域的应用[J].珠江水运,2019,480(08):38-40.
[3] 姜永成,周正干,任福君.基OpenC的移动机器人视频流采集与处理[J].机床与液压,2010,038(015):40-43.
[4] 宋蕴璞,陈元.基于嵌入式Linux及MJPG-streamer的双目立体视觉系统设计[J].物联网技术,2016,6(3):102-104.
[5] 卓磊,周律,杨丽红.基于穿线法的计算器数字识别[J].软件工程,2018(12):1-3.
[6] 杨东琼,云利军,王坤.Linux和OK6410环境下视频图像的采集与显示[J].云南师范大学学报:自然科学版,2016,36(170):52-57.
[7] 王伟.雷达模拟器系统研制与开发[D].荆州:长江大学,2013.
[8] 吴昭质.火灾视频识别及远程智能报警系统[D].南京:南京邮电大学,2015.
作者简介:
周文博(1986-),男,硕士,助理工程师.研究领域:嵌入式开发,视频监控.
张 勇(1977-),男,硕士,工程师.研究领域:嵌入式开发,无线电导航定位.
孙良义(1981-),男,本科,工程师.研究领域:视频监控,无线电导航定位.
苏 军(1980-),男,硕士,工程师.研究领域:嵌入式开发,水声通信.