基于嵌入式Linux及MJPG―streamer的双目立体视觉系统设计
摘 要:文中设计了一套双目立体视觉系统,该系统采用上位机与下位机无线通信的结构,其中下位机采用嵌入式Linux操作系统,移植了无线网卡驱动,并在下位机上修改移植MJPG-streamer以实现多路摄像头图像输入单路输出功能。通过上位机验证了系统中的图像采集不仅十分流畅,而且画质清晰。
关键词:嵌入式Linux;MJPG-streamer;立体视觉;无线通信
中图分类号:TN948.6 文献标识码:A 文章编号:209➳5-1302(2016)03-0-03
0 引 言
双目立体ศ视觉通过模拟人类双眼获取信息并通过大脑处理的方式来替代人类完成一些领域的工作,它是计算机视觉中常用的方法之一。它利用两台位置相对固定的摄像机从不同角度同时获取目标对象的两幅图像,再通过计算空间点在两幅图像中的视差来计算目标的三维坐标值。双目立体视觉以非接触方式获取场景的三维信息,具有结构简单、灵活等优点,广泛用于三维重建、无人驾驶[2]、追踪定位等实用科技领域。
1 双目立体视觉系统硬件框架
1.1 系统构成
本文讨论的双目立体视觉系统硬件主要由两枚罗技USB摄像头、一个普联(TP-LINK)USB无线网卡、一块Beaglebone Black ARM开发板、上位机PC组成。其中摄像头、无线网卡、ARM开发板组成的下位机还可以实现移动功能。系统的原理为:ARM开发板负责同时采集两路摄像头的视频,然后通过HTTP视频流服务向上位机PC端提供实时图像数据,并且下位机提供运动控制接口以接收来自上位机的运动控制指令并与运动控制器通信实现运动;上位机通过无线网络获得实时图像帧序列,上位机PC可以发挥通用计算机编程简单的优势并结合独立图形显卡对图像进行并行加速处理[3-5],以达到目标识别、追踪的目的。系统的硬件构架如图1所示。
1.2 硬件参数介绍
Beaglebone Black是基于德州仪器Sitara AM3358 ARM处理器、只有信用卡大小的低成本开发板,自其前辈Beagleboard发布以来,受到众多开发者的热爱,同时也已获多个Linux发行版的支持。
本系统采用两枚罗技C270高清定焦摄像头,它们具备最高720 p(1280x720)、30帧/s的彩色图像输出速率,且成像质量突出;还提供USB 2.0接口,作为标准的UVC(USB Video Class)设备,在Linux系统下面可以直接驱动。系统包含的USB无线网卡型号为TP-LINK WN823N,它支持IEEE 802.11b/g/n标准,工作在2.4~2.4835 GHz频段,最高无线传输速率为300 Mb/s,支持WPA-PSK/WPA2-PSK加密。
2 系统实现
2.1 系统选择及网卡驱动移植
Linux操作系统具有完善的网络通信功能及稳定性、可裁剪性等特点,非常适用于嵌入式设备。这里使用的操作系统是Debian社区提供的Debian 7.9(Wheezy)系统镜像,为了节省硬件资源采用了控制台版本,即不带图形界面;系统默认Linux内核版本为3.8,手动更新内核至4.1版本以修复Beaglebone Black USB设备热插拔支持不稳定的问题。使用Debian镜像的优势在于社区为开发平台提供了完善的工具链,可以在开发板上安装必要的gcc编译器集合及make工具和内核头文件,直接在开发板上进行小型程序的编译,省去了麻烦的交叉编译步骤。
由于USB网卡不被当前操作系统内核支持,需要手动添加驱动。TP-LINK WN823N使用Realtek rtl8192系列控制器,任何人都可以从Realtek网站获取相关设备驱动源代码。这里把驱动源代码放到了开发板上,以内核模块的形式编译出驱动;通过Debian软件管理器安装wpa_supplicant来管理无线网络连接,以借此实现开发板开机后自动连接到指定无线路由器的操作。
2.2 MJPG-streamer移植
MJPG-streamer[6,7]是开源的、基于命令行的可提供JPEG图像流的轻量服务器,它实现了从输入设备复制图像数据到输出设备的功能。受支持输入设备以UVC摄像头为主,还有CMOS摄像头、文件输入等;输出设备可以是文件、网络服务(HTTP, UDP)等。 MJPG-streamer默认只能支持单设备输入多种途径输出。而在本双目视觉系统中要实现的是两个UVC设备输入,一个HTTP插件输出,故需对MJPG-streamer源代码进行修改。
MJPG-streamer主要分为以下几个模块(插件):
(1)mjpg_streamer: 主程序,用来调用其它插件;
(2)input_uvc:USB 摄像头输入插件;
(3)output_http:HTTP服务插件;
(4)inp✔ut_file: 以视频或图像作为输入;
(5)output_file: 输出到JPEG文件。
本设计中用到input_uvc和output_http两个输入输出模块。通过对MJPG-streamer源代码进行分析,发现其各个模块以独立线程的方式运行,各线程以共享内存的方式进行通信。输入插件将图像数据存储到共享区域,输出插件从共享内存区域读取图像数据写入目标位置(网络终端、磁盘等)。
进一步分析源代码,发现MJPG-streamer已经实现了多个输入插件的支持,并且从每个输入设备读取到的数据放到了不同的内存位置,唯一的限制是在输出时默认只发送第一个设备读取到的数据。
output_http在响应每个来自网络的客端时都启用一个单独的线程来对其发送数据,其中的数据均来自第一个输入插件。为了获取不同输入设备的数据,客户端在请求数据时应指明从哪个设备获取;同时如果客户端启动两个独立线程来分别访问两个摄像头的数据,那么就实现了MJPG-streamer多输入单插件输出的功能。 通过修改MJPG-streamer工程下output_http模块里的httpd.c文件来实现该功能:
(1)增加静态全局整型变量stream_id定义,并初始化为0,即默认从第一个输入设备获取图像数据流;
(2)处理http请求?action=stream判断程序块内部增加获取请求的流id功能:
(3)将stream_id作为参数传递至send_stream函数;
(4)客端对应的http请求变为http://server_address:port_number/?action=stream:id。其中,id从0开始编号,对应从第一个设备起。MJPG-streamer安装按照其说明文档进行,在源代码目录执行make USE_LIBV4L2=true && make install,这里”USE_LIBV4L2=true”使能了V4L(Video for Linux)视频设备驱动框架,由此完成了MJPG-streamer的编译和安装。
3 上位机软件实现
3.1 上位机硬件及开发环境配置
上位机为普通Intel X86 PC,带NVIDIA 独立图形显卡并支持CUDA编程,开发工具使用了跨平台的Qt C++环境,版本为5.5.0,编译安装了计算机视觉库OpenCV3.0。
3.2 上位机软件编写
上位机软件的逻辑框图如图2所示。
在Qt5环境中使用OpenCV提供的VideoCapture类型打开指定URL(Uniform Resource Locator),代码操作如下:
VideoCapture capLeft = VideoCapture(“http//192.168.1.1358421/?action=stream:0”);
VideoCapture capRight = VideoCapture(“http//192.168.1.1358421/?action=stream:1”);
使用OpenCV提供的Mat类型来保存每一帧图像,同时使用Qt提供的软件定时器每秒20次从资源中获取左右各一帧图像,将图像显示出来,并复制到特定内☣存区域以便后续处理程序进行访问,读取一帧图像的操作如下:
Mat matLeft, matRight;
capLeft.read(matLeft);
capRight.read(matRight);
左右摄像头以640×480分辨率、每秒20帧的速率采集,上位机程序也以每秒20帧的速率刷新显示,效ฌ果流畅。图3所示为室内环境显示效果截图。
4 结 语
本文介绍了一种双目立体视觉系统设计,采用上位机与下位机无线通信的架构,可以发挥上位机强大的计算能力以及下位机灵活移动的优势。其中主要讨论了下位机的软硬件框架,利用开源软件MJPG-streamer并修改其部分代码实现了多路设备输入、单个插件输出的功能;通过实验验证了方案的可行性,对双目立体视觉系统设计具有参考价值。
参考文献
[1]贾云得.机器视觉[M].北京: 科学出版社,2002.
[2]杨明.无人自动驾驶车辆研究综述与展望[J].哈尔滨工业大学学报,2006,38(8):1259-1262.
[3]李亚峰,秦开怀.一种双目立体视觉算法的GPU实现[J].计算机工程,2006,32(10):210-211.
[4]李新德,张晓,朱博,等.一种基于GOR+GPU算法的机器人视觉导航方法[J].机器人,2012,34(4):466-475.
[5]张平.基于CUDA的TLD视觉跟踪算法研究[D].北京:北京交通大学,2014.