>
首页 » 技术文章 » 基于嵌入式Linux的图像采集系统的设计与实现

基于嵌入式Linux的图像采集系统的设计与实现

作者:西安电子科技大学 白 孙肖子  时间:2005-11-07 15:24  来源:本站原创

摘 要:本文介绍了在嵌入式Linux系统下开发USB摄像头图像采集系统的方法,给出了基于Intel Xscale PXA255处理器的嵌入式图像采集系统的设计方案,并对如何编写符合Video for Linux 标准的摄像头图像采集程序进行了讨论。
关键词:Video for Linux;USB摄像头;USB驱动
引言
嵌入式Linux操作系统同目前广泛应用的嵌入式操作系统如pSOS、VxWorks、winCE相比,具有可移植性好、网络功能强、有优秀的GNU编译工具支持等优点。更重要的是Linux的开放源代码和免费的优点使得系统成本显著降低。一流的程序设计和开发加上测试的开放性使得Linux系统非常可靠和稳定,因而越来越多的人开始使用Linux开发应用程序。Intel Xscale PXA255处理器是一款采用ARM结构,面向高性能、低功耗设备的嵌入式处理器,非常适用于手持移动设备的开发。USB摄像头因具有低廉的价格,良好的性能,及方便使用的特性,因此很容易集成到嵌入式系统中。本文介绍的基于嵌入式Linux系统的USB摄像头图像采集系统使用采用OV511芯片的WEBEYE摄像头,在基于PXA255处理器的开发板上实现了图像的采集与压缩,借助Mencoder编码工具可以将多幅JPEG图片合成AVI视频流,并实现视频回放。

图1 硬件系统总体框图


图2 Linux下USB系统软件结构


图3获得图像过程


图4 图像采集程序的流程图
系统硬件平台
系统结构
系统硬件平台如图1所示。PXA255处理器主频最高可达400MHz,内部集成了多种外设控制模块,在实际使用时可以根据需要进行裁减。开发板上提供了64M SDRAM、32M Flash、640×480 TFT LCD触摸屏,以及外扩的USB主口控制器等,它们构成了一个嵌入式多媒体开发平台,可以满足复杂计算和图形显示的需求。采用OV511芯片的WEBEYE摄像头支持多种制式,CIF(352×288)格式帧率达30fps,可实现真正的实时视频捕获,VGA(640×480)格式帧率为10~15fps,具有完善的自动亮度、白平衡控制,提供色彩饱和度、对比度、边缘增强、伽马表等高级数码影像控制功能。它与TWAIN标准兼容,提供640×480格式的高清晰静止图像捕获模式,具有多种视频和输出格式供选择。USB总线控制器采用Cypress 公司的一款专为嵌入式领域研制的USB控制芯片CY67300,该芯片可作为主口控制,也可作为从口控制芯片,内嵌有8051微控制器和RAM,支持全速和高速两种模式。JTAG口用于Flash的擦写,UART用于系统调试。以太网口可使现网络传输,也可作NFS调试用。
系统工作过程
系统通过WEBEYE摄像头采集图像,对现场图像进行高速捕捉,然后将捕捉到的图像通过USB总线传输到PXA255处理器进行处理,并将图像压缩,保存为JPEG格式的文件。程序调用Encoder编码器可以将多幅JPEG格式的图像合成一段AVI视频流,实现视频回放,这在安全监控、事故鉴定、车辆防盗等领域中都有广泛应用。最后,系统还可以通过以太网口或UART口将保存的图片和视频流传到服务器上,实现网络监控。

系统软件实现
软件系统结构
Liunx系统中对USB设备的支持是通过如图2所示的结构实现的。Linux内核中的USB Core为设备和主控制器提供API接口。USB Core包含所有的USB设备和主控制器的一些通用操作,为向上和向下操作提供一个接口。在Linux系统中,设备驱动可分为字符设备、块设备以及网络设备。其中,字符设备面向字符I/O操作,没有缓冲,顺序读取;而块设备面向数据块,所有操作都通过内核地址空间的I/O缓冲区完成,支持随机存取操作。USB设备通过快速串行通信的方式工作,应作为字符设备来处理。系统加载设备驱动的方式有模块加载和内核初始化加载两种:前者通过用户使用insmod命令动态加载到内核中,通过rmmod命令卸载驱动模块;后者是把驱动编进内核,在内核初始化时自动加载。USB主口程序由HCD(主机控制器驱动)、USBD (USB驱动程序)以及客户程序组成。其中USBD负责管理所有HCD、设备驱动和所有连接到USB总线上的设备,是USB主机软件的核心。如图2所示,Linux系统中USB子系统采用分层结构,其中USBD和HCD提供了支持设备驱动程序开发的API。USB设备驱动程序不是通过I/O操作访问设备,而是通过USB Core提供的标准接口与设备交互,它采用由管道组成的通道与设备进行通信。设备驱动程序根据USBD创建所需的管道,并为其分配传输所需的缓冲空间。
USB的传输分为控制传输、中断传输、批量传输以及等时传输四种模式。对于时间性极强但是准确性不高的视频捕捉应用来说,摄像头应采用等时传输模式。Linux系统中,任何USB传输都需要通过URB(USB请求块)来实现。为了尽可能快地得到图像数据,需要加大URB的缓冲,这样可以降低每个USB事务中握手信息所占的比例,提高有效数据传输比例。由于每次USB传输都要包括URB的建立、发送、回收、数据整理,而在这些阶段中不产生有效数据,因此可建立两个URB交替工作,一个URB在等待回收时初始化另一个URB。获得图像的过程如图3所示。
摄像头视频捕获程序的编写
摄像头属于视频类设备,遵循的标准为Video for Linux (V4L)标准。这个标准定义了一套API接口,内核、驱动、应用程序都以这个接口为标准进行交流。目前的V4L涵盖了音视频捕捉及处理等内容,也包括USB摄像头。
Linux系统中一般的文件操作是通过read、write等系统调用完成,但这些系统调用是通过内核态与用户态之间相互进行数据拷贝实现的。对于图像数据来说,进行拷贝必然会增加时间开销,因此需要使用内存映射的办法来加以解决。
首先应申请足够大的内核态内存作为图像数据缓存,将URB带来的数据暂存;然后将其用remap_page_range函数映射到用户态空间。这样,用户态空间的图像处理程序就可以使用mmap()函数,直接读写内核态帧缓冲区,减少了额外开销。要进行视频捕捉必须用到VIDIOCMCAPTURE 和VIDIOCSYNC这两个ioctl函数。VIDIOCGMBUF包含有所用缓冲器的设置与地址。VIDIOCMCAPTURE用于开始捕捉;VIDIOCSYNC用于等待捕捉完成。为加快数据处理速度,一般使用双缓冲设置,即buffer0捕捉数据时,buffer1传输数据;buffer1捕捉数据时,buffer0传输数据。
整个图像采集程序的流程图如图4所示。将采集到的图像保存为JPEG格式,然后调用Mplayer中的Mencoder编码器,即可将多幅JPEG文件合成一段视频流,实现视频回放。

结语
本文在台式机上编程实现了基于Linux系统的USB摄像头图像采集系统。系统可以实现每秒30帧的图像采集,可以直接连续显示到屏幕上构成实时监控系统,也可压缩为一段视频流,用播放器播放出来。通过交叉编译将程序移植到PXA255开发板上,实现了预期功能。

相关推荐

Linux将进军汽车智能系统领域

Linux  汽车智能系统  2013-07-09

Android回归Linux核心怀抱

Google  Linux  Android  2012-11-01

EXT4数据损失bug影响Linux稳定版内核

EXT4  Linux  2012-10-25

Fedora Linux 18 延期至年底

Fedora Linux 18  2012-10-17

Marvell和Tuxera推出业界最快的全功能NAS解决方案

Marvell  Linux  NAS  2012-01-19

ARM-Linux嵌入式系统的BootLoader分析与设计

嵌入式系统  Linux  2011-09-19
在线研讨会
焦点