吴宗卓
(陕西国防工业职业技术学院,陕西西安,710300 )
在嵌入式技术飞速发展的推动下,嵌入式设备在汽车电子、消费电子以及军工航天等诸多领域得到了广泛的应用。基于开源性、可裁剪、可移植、实时性强、内核小等优势,嵌入式Linux逐渐发展为嵌入式设备的首选操作系统。作为计算机视觉技术中的重要分支之一,双目立体视觉技术已成为计算机视觉研究的一项重点与热点,取得的成果值得肯定。以嵌入式Linux操作系统为基础设计的双目立体视觉系统,具有突出的非接触、高精度、深度可感知等优势。
系统的硬件环境为ARM嵌入式开发平台,ARM核心板对S3C2440予以采用,液晶屏为SAMSUNG公司推出的UG-32F04,两个CMOS摄像头采用webeyeV2000(OV511+OV7620)。
ARM系统的接口与功能模块丰富,含USB接口、COM接口、JTAC接口等,主频最高可达203MHz。
系统所用USB接口CMOS摄像头为webeyeV2000,该设备对OV7620传感器芯片予以采用,其最大优势在于Linux操作系统自带该设备的驱动程序模块,有利于系统开发周期的大幅度缩短。USB控制器为OV511(片上USB收发器)。
液晶屏为 STN LCD(320×240),是一种 Framebuffer(帧缓冲)设备。用户可视Framebuffer为显示内存的一个映像,将其映射于内存地址空间上,便可直接执行读写任务,同时,写操作可在屏幕上得到实时显示。用户无需具体的细节,这些全部通过Framebuffer设备驱动实现。
系统软件设计包括3部分内容:(1)嵌入式操作系统;(2)硬件驱动程序;(3)应用软件。
嵌入式操作系统对Linux操作系统予以采用,内核版本为Linux-2.6.31,内带s3c6410评估版源码包,只需按照外设进行相应驱动部分的修改,可大幅节省开发时间。
Linux下所有设备全被视作文件,与两个摄像头相对应的文件分别为“/dev/v41/video0”与“/dev/v41/video1”。摄像头的 属 性 可通过 程 序“ioctl(fd,VIDIOCSWIN,&win)”与“ioctl(fd,VIDIOCSPICT,&vpic)”设置,摄像头所采集数据的读取则可由程序“read(fd,data,size)”来实现。LCD在 Linux下的设备文件为“/dev/fb0”,液晶屏的参数通过“ioctl(fb.FBIOGET_FSCREENINFO.&fb_finfo)”语句的调用来设置,而利用“fbdev.fb_mem=mmap(NULL.fbdev.fb_size.PROT_READ|PROT_WRITE.MAP_SHARED,fb,0)”可将屏的帧缓存地址映射到一个已知地址,操作此地址亦即对液晶屏进行操作。
Linux操作系统与相应驱动程序设计完成后,需进行应用程序的编写,以此实现某些特定的功能。系统应用程序的设计主要涉及图像数据采集、图像处理、坐标提取以及图像数据与坐标值输出等。
MJPG-streamer是开源的、基于命令行的一种能够提供JPEG图像流的轻量服务器,可从输入设备处进行图像数据的复制,然后传送至输出设备。支持MJPG-streamer的输入设备有CMOS摄像头、UVC摄像头、文件输入等,输出设备有文件、网络服务(HTTP、UDP)等。在默认情况下,MJPG-streamer仅支持单设备输入与多种途径输出,由于文章研究的双目视觉系统需进行两个CMOS设备输入与一个Framebuffer输出,因此需相应地修改MJPG-streamer源代码。
MJPG-stream的模块(插件)主要包括以下部分:
(1)mjpg_streamer:主程序,用于其他插件的调用;(2)input_cmos:摄 像 头 输 入 插 件;(3)output_frame:Framebuffer服务插件;(4)input_file:以视频或图像为输入;(5)output_file:输出到JPEG文件。
设计用到input_cmos与output_frame两个输入输出模块,通过分析MJPG-streamer源代码,可知各模块的运行采取的是独立线程的方式,各线程之间的通信方式为共享内存。输入插件存储图像数据至共享区域中,输出插件从共享内存区域进行图像数据的读取,然后将其写入网络终端或磁盘等目标位置中。
通过对源代码的进一步分析,可知MJPG-streamer支持多个输入插件,它可将从不同输入设备读取到的数据放到不同的内存位置,在此过程中,唯一起到限制性作用的是在输出时默认只发送第一个设备读取到的数据。
在对每个来自显示屏的请求进行响应之时,output_frame都会启用一个单独线程进行数据的发送,其中,全部数据都来自第一个输入插件。为了得到不同输入设备的数据,显示屏在请求数据时应指明从哪个设备获取;同时,若显示屏启动两个独立线程进行两个摄像头数据的分别访问,便会实现MJPG-streamer的多输入单插件输出的功能。该功能通过修改MJPG-streamer下output_frame模块中的framed.c文件来实现:
(1)增加静态全局整型变量stream_id定义,进行初始化处理,设置为0,即默认从第一个输入设备获取图像数据流;
(2)对framebuffer请求进行处理?actionstream,进行程序块内部增加获取请求的流id功能的判断:
Else if (strstr (buffer,”GET/?action=stream’)!=NU LL)
{
Char*tmp=strstr (buffer,”stream:”);
If(tmp!=NULL)
{
Stream_id=atoi(tmp+7);}
else
{
Stream)id=0;
}
req.type=A_STREAM;
query_suffixed-255;
}
(3)以stream_id为参数将其传递至send_stream函数;
(4)改变显示屏对应的frame请求。MJPG-streamer安装根据其说明文档进行,在源代码目录执行make USE_LIBV4L2=true&&make install,此处“USE_LIBV4L2=true”使 用video for linux视频设备驱动框架,以此实现MJPG-streamer的编译与安装。编写启动MJPG-streamer双输入单输出的shell脚本文件,该脚本从两个CMOS设备读取图像输入,分辨率为640×480,每秒 20 帧。
参考文献
[1]文成维,陈文建,詹冰.嵌入式双目立体视觉测距系统[J].计算机系统应用,2012(10):143-147.
[2]夏茂盛,孟祥磊,宋占伟,等.基于双目视觉的嵌入式三维坐标提取系统[J].吉林大学学报,2011(1):61-66.