基于嵌入式Linux及MJPG―streamer的双目立

(整期优先)网络出版时间:2017-09-19
/ 2

基于嵌入式Linux及MJPG―streamer的双目立

温治强

引言:消费类设备、自动化系统、军事和航空设计、医疗设备、网络和许多其他方面的嵌入式设计中,Linux已经成为事实上的标准操作系统。现代家庭中有许多设备运行着Linux,例如数字电视和数字录像机,机顶盒,以及智能家电。对于商务人士来说,在电脑包里有许多基于Linux的设备也是很常见的事情。Android智能手机证明了Linux操作系统也可以成为功能强大的移动操作系统。双目立体视觉通过模拟人类双眼获取信息并通过大脑处理的方式来替代人类完成一些领域的工作,它是计算机视觉中常用的方法之一。它利用两台位置相对固定的摄像机从不同角度同时获取目标对象的两幅图像,再通过计算空间点在两幅图像中的视差来计算目标的三维坐标值。双目立体视觉以非接触方式获取场景的三维信息,具有结构简单、灵活等优点,广泛用于三维重建、无人驾驶[2]、追踪定位等实用科技领域。

1双目立体视觉系统硬件框架

1.1系统构成.本文讨论的双目立体视觉系统硬件主要由两枚罗技USB摄像头、一个普联(TP-LINK)USB无线网卡、一块BeagleboneBlackARM开发板、上位机PC组成。其中摄像头、无线网卡、ARM开发板组成的下位机还可以实现移动功能。系统的原理为:ARM开发板负责同时采集两路摄像头的视频,然后通过HTTP视频流服务向上位机PC端提供实时图像数据,并且下位机提供运动控制接口以接收来自上位机的运动控制指令并与运动控制器通信实现运动;上位机通过无线网络获得实时图像帧序列,上位机PC可以发挥通用计算机编程简单的优势并结合独立图形显卡对图像进行并行加速处理,以达到目标识别、追踪的目的。

1.2硬件参数介绍.BeagleboneBlack是基于德州仪器SitaraAM3358ARM处理器、只有信用卡大小的低成本开发板,自其前辈Beagleboard发布以来,受到众多开发者的热爱,同时也已获多个Linux发行版的支持。本系统采用两枚罗技C270高清定焦摄像头,它们具备最高720p(1280x720)、30帧/s的彩色图像输出速率,且成像质量突出;还提供USB2.0接口,作为标准的UVC(USBVideoClass)设备,在Linux系统下面可以直接驱动。系统包含的USB无线网卡型号为TP-LINKWN823N,它支持IEEE802.11b/g/n标准,工作在2.4~2.4835GHz频段,最高无线传输速率为300Mb/s,支持WPA-PSK/WPA2-PSK加密。

2USB摄像头驱动实现

2.1UVC驱动程序实现。中星微USB摄像头的VC0345模块是一个标准的UVC设备。本文将在Linux2.6.32内核版本中移植和开发UVC驱动代码,该驱动代码路径为drivers/media/video/uvc/,通过查看该目录下的Makefile文件可知每个*.c文件生成对应的一个*.o文件。

UVC设备驱动初始化模块函数uvc_init调用了usb_register注册函数,将UVC设备视为一个标准的USB设备。其中uvc_driver结构体中的name将注册进USB?Core的驱动名字,它会显示在/sys/bus/usb/drivers/下,但它并不是应用程序将要读写的设备文件。当UVC设备插入的时候,会调用uvc_probe函数来探测视频设备,包括视频的格式和设备控制参数等,内核需要id_table用来判断插入的设备是否适配,然后将初始化USB的URB中断,接收USB接口采集到的视频数据。当UVC设备拔出的时候,会调用uvc_disconnect函数。

2.2V4L2驱动程序实现.UVC驱动程序虽然是一个模块文件,但是它里面并没有提供fops的文件操作函数,而是把该操作的open、read、write、ioctl和mmap等用户接口函数放在V4L2驱动程序去实现。V4L2的fops名字叫做uvc_fops,定义在uvc_v4l2.c中。

V4L2的子系统是围绕video_device这个结构体建立的,它代表的是一个V4L2设备。video_device的file_operations结构体包含常规的函数指针。视频设备通常都包括open、read、write、release函数,这取决于设备的功能是输入还是输出。对于视频流设备而言,传输数据一般使用poll和mmap方法。同时,视频设备还定义了一系列的控制参数,所有这些视频参数一般都由ioctl函数实现。uvc_fops结构体实现之后是通过uvc_driver.c中的uvc_register_video函数将UVC驱动和V4L2驱动关联起来实现一个视频驱动的整体框架程序,因此用户就可以通过V4L2接口函数操作UVC视频设备了。

3上位机软件实现

3.1上位机硬件及开发环境配置

上位机为普通IntelX86PC,带NVIDIA独立图形显卡并支持CUDA编程,开发工具使用了跨平台的QtC++环境,版本为5.5.0,编译安装了计算机视觉库OpenCV3.0。

3.2上位机软件编写

在Qt5环境中使用OpenCV提供的VideoCapture类型打开指定URL(UniformResourceLocator),代码操作如下:

VideoCapturecapLeft=VideoCapture

(“http//192.168.1.1358421/?action=stream:0”);

VideoCapturecapRight=VideoCapture

(“http//192.168.1.1358421/?action=stream:1”);使用OpenCV提供的Mat类型来保存每一帧图像,同时使用t提供的软件定时器每秒20次从资源中获取左右各一帧图像,将图像显示出来,并复制到特定内存区域以便后续处理程序进行访问,读取一帧图像的操作如下:

MatmatLeft,matRight;

capLeft.read(matLeft);

capRight.read(matRight);

左右摄像头以640×480分辨率、每秒20帧的速率采集,上位机程序也以每秒20帧的速率刷新显示,效果流畅。

:本文主要讨论了下位机的软硬件框架,利用开源软件MJPG-streamer并修改其部分代码实现了多路设备输入、单个插件输出的功能;通过实验验证了方案的可行性,对双目立体视觉系统设计具有参考价值。

参考文献:

[1]杨明.无人自动驾驶车辆研究综述与展望[J].哈尔滨工业大学学报,2006,38(8):1259-1262.

[2]李亚峰,秦开怀.一种双目立体视觉算法的GPU实现[J].计算机工程,2006,32(10):210-211.