基于嵌入式平台的USB摄像头图像采集及显示
2013-07-13陈胜利
钱 鹰,陈胜利
(1.重庆邮电大学 软件学院,重庆 400065;2.重庆邮电大学 自动化学院,重庆 400065)
随着科技的进步和社会的发展,数字视频图像的采集、存储、处理及传输技术在最近几年得到了广泛的应用,与传统图像处理系统相比,嵌入式图像处理系统具有体积小、成本低、可靠性高等优点,在智能交通、远距离监控、计算机视觉等领域广泛运用。而嵌入式Linux系统具有源代码开放、内核稳定、可裁减性、驱动丰富等特点,吸引着众多商业公司和自由软件开发者的目光,成为嵌入式系统领域不可或缺的操作系统之一。
文献[1]详细介绍了嵌入式中的交叉编译环境的搭建及移植技术,但该论文没有说明具体实际的应用。在文献[2]中介绍了ARM920T的嵌入式Linux下利用USB摄像头采集图像的硬件、软件设计过程,但在设计图片显示的GUI时只是简单的显示而没有设计对采集图片的操作。文献[3]分析了V4L2的图像采集驱动和流程,然后在Qt环境下设计并实现采集终端软件设计,最后在Tiny6410平台上移植嵌入式视频采集终端,受该文献的启发,本文在完成V4L图像采集驱动及内核的定制之后,直接利用Qt库设计GUI显示,并在设计GUI时考虑了对采集图像的放大、缩小等简单操作,最终在Linux环境下完成交叉编译,并将交叉编译所得的可执行文件直接运行于OK6410开发板。
1 系统架构
文中使用的系统架构如图1所示。该架构采用Samsung公司的处理器S3C6410,该处理器是一款低功耗、高性价比的RSIC处理器,它基于 ARM11内核(ARM1176JZF-S),资源丰富,执行ARMv6架构的指令,ARMv6指令包含了针对媒体处理的单指令流多数据流(SIMD)扩展,采用特殊的设计,以改善视频处理性能,拥有强大的内部资源和视频处理能力,可稳定运行在667 MHz主频以上,支持Mobile DDR和多种NAND Flash。
开发板硬件模块包括1个100 M网口、无线网卡、高速SD卡座、CMOS摄像头接口、JTAG接口。在处理器丰富的资源基础上,还进行了相关配置和扩展,平台另外配置了128 M字节Mobile DDR内存和1 G字节NAND Flash。
2 嵌入式Linux内核的定制及摄像头驱动的加载
图1 系统整体架构Fig.1 Structure of the system
由于嵌入式Linux具有成本低、代码开放、移植性好的特点,其用于嵌入式系统的优势和发展潜力是不容置疑的。在嵌入式系统中,由于硬件资源有限,需要对Linux内核进行嵌入式化,即通过配置内核、裁剪shell和嵌入式C库对系统进行定制,使得整个系统能够存放到容量较小的FLASH中。
Linux平台的驱动一般分为字符设备、块设备和网络设备3种类型。而在Linux下要使系统所挂接的外部设备正常工作,必须加载相应的驱动程序,Linux下对于一个硬件的驱动,可以有两种方式:一种是直接加载到系统的内核当中去,另一种是以模块方式进行加载,就是在编译内核的时候,同时生成可重定位的目标文件(.o文件),动态方式与静态方式相比,测试时要简单的多,不需要下载整个内核,只需通过NFS加载驱动即可测试,在测试成功后就可以编译进内核[4],因此本文采用第一种方法。
又由于Video4Linux是Linux中关于视频设备的内核驱动,并为针对视频设备的应用程序编程提供一系列接口函数,因此,在Linux下进行图像的采集首先必须加在Video4Linux模块和USB及ZC301设备驱动模块。在内核源目录下运行make menuconfig,具体步骤为:
1)在配置菜单中选择Multimedia support→Video for Linux,加载video4linux模块,为实现图像的采集提供了编程接口;
2)在配置菜单中选择USB Support→Support for Host_side USB 及 USB announce new devices,Multimedia support→Video capture adapter→V4L USB Video device→CSPCA based webcams→ZC301 USB Camera Driver使得内核中加入了对采用ZC301接口芯片的USB数字摄像头的驱动支持[5]。
3 基于Video4Linux的图像采集
Video4Linux(简称V4L)模块提供的主要API函数有:VIDIOCGCAP函数以数据结构video_capability返回视频采集设备的基本信息,包括设备名称、设备类型、信道数、最大及最小像素高度和宽度等;VIDIOCSFBUF函数使用数据结构video_buffer设置采集设备的帧缓存参数,包括缓存区大小、同时采集的帧数、偏移量等;VIDIOGWIN函数使用数据结构video_windows来设置采集窗口参数,使用参数1调用VIDIOCCAPTURE开始视频信号采集;VIDIOCSPICT函数使用数据结构video_picture来获取和设置采集图像帧的属性,如亮度、色调和对比度等。基于V4L的视频采集程序流程图如图2所示[6]。
以下简单介绍程序的编写,给出关键部分的实现代码。
图2 视频采集程序流程图Fig.2 Video acquisition program flow chart
首先,必须声明包含sys/types.h、linux/videodev.h2个头文件:
其次,设备的初始化[7]:
在获得图像信息后,还可根据需要改变这些信息,例如对比度、调色、亮度板等,具体做法是先给video_picture中相应变量赋新值,再利用VIDIOCSPICT ioct1函数。
最后,调用 ioctl(grab_fd ,VIDIOCSYNC,&frame)函数,该函数成功返回则表示采集完毕,采集到的图像数据放到以data为起始地址,长度为240×320×3的内存区域中,读取该内存中的数据便可得到图像数据。
4 基于QT/Embedded的图像显示
目前的桌面机操作系统大多有着美观、操作方便、功能齐全的GUI(图形用户界面),GUI的存在为使用者提供了友好便利的界面,并大大方便了非专业用户的使用,使得人们从繁琐的命令中解脱出来,可以通过窗口、菜单方便地进行操作。在嵌入式领域 GUI种类繁多,如:QT/Embedded、MiniGUI、OpenGUI等,其比较如表 1 所示[8]。
表1 常见GUI比较Tab.1 Comparison of common GUI
QT/Embedded是一个为访问嵌入式设备的API,它的类库完全采用C++封装,丰富的控件资源和较好的可移植性是其最优秀的一方面,因此,本文通过QT/Embedded编写图像显示程序。
QPixmap和QImage对象都能实现对图片的显示,和QPixmap不同,QImage是独立于硬件的,它可以同时被另外一个线程访问,因此,对QImage的使用是非常方便的,本文使用QImage加载后转换为QPixmap显示,使得当图片较大时,通过QImage将图片加载进来,然后缩放成需要的尺寸,最后转换为QPixmap进行显示[9-10]。关键代码如下:
至此完成基于Qt编写的图片浏览界面程序,实现了将USB摄像头实时采集到的图片在开发板的LCD上的显示,显示结果如图3所示,其中红色方框区域内为图像的显示区域,蓝色方框区域为对图片的操作区域。
图3 结果在开发板上的显示Fig.3 Showing on the demoboard
5 结束语
文中在ARM11+嵌入式Linux的平台基础上介绍了一种基于USB摄像头的图像采集及显示的方法,主要涉及应用Video4Linux对图像采集的实现及由QT设计的GUI对采集图像的显示,本文设计的图像采集和显示系统可广泛用于工厂、银行等场合全天候的智能监控、图像的网络通信等,而且具有广阔的市场和应用前景。
[1]华晶,贾晶,何火娇.基于Qt/Embedded的嵌入式GUI在ARM上的移植[J].计算机与现代化,2009(10):117-119.
HUA Jing,JIA Jing,HE Huo-Jiao.Porting of embedded GUI toARMbasedonQt/Embedded[J].ComputerandModernization,2009(10):117-119.
[2]王永清,何波.Linux下基于ARM920T的USB摄像头图像采集[J].微计算机信息,2007(23):116-117.
WANG Yong-Qing,HE Bo.Getting image data with USB camera based on LINUX and ARM920T[J].Micro-Computer Information,2007(23):116-117.
[3]郝俊,孟传良.基于V4L2的ARM11 USB视频采集终端的设计与实现[J].贵州大学学报:自然科学版,2011(4):74-78.
HAO Jun,MENG Chuan-liang.Design and implement of the ARM11 USB video capture terminal based on V4L2[J].Joural of Guizhou University:Natural Science Edit,2011(4):74-78.
[4]华清远见嵌入式培训中心.嵌入式Linux系统开发[M].北京:人民邮电出版社,2009.
[5]畅卫功.嵌入式Linux中USB摄像头驱动的研究[J].微计算机信息,2008(2):54-56.
CHANG Wei-gong.The investigation of USB camera driving program in embedded linux system[J].Micro-Computer Information,2008(2):54-56.
[6]刘永林,程耀瑜.基于ARM的图像采集系统的硬件设计与实现[J].电子测试,2011(6):12-15.
LIU Yong-lin,CHENG Yao-yu.Hardware design and implementation of image acquisition system based on ARM[J].Electronic Test,2011(6):12-15.
[7]杨水清.ARM嵌入式Linux系统开发技术详解[M].北京:北京航空航天大学出版社,2011.
[8]俞辉,李永.ARM嵌入式Linux系统设计与开发[M].北京:机械工业出版社,2010.
[9]Blanchtte J,Summerfield M,著.C++GUI Qt4编程[M].2版.闫峰欣,曾泉人,等译.北京:电子工业出版社,2008.
[10]薛敏彪,吴广伟,王健,等.嵌入式机载视频输出接口设计[J].现代电子技术,2011(2):9-11,14.
XUE Min-biao,WU Guang-wei,WANG Jian,et al.Design of embedded airborne video output interface[J].Modern Electronics Technique,2011(2):9-11,14.