APP下载

基于嵌入式平台的USB摄像头图像采集及显示

2013-07-13陈胜利

电子设计工程 2013年3期
关键词:内核嵌入式摄像头

钱 鹰,陈胜利

(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.

猜你喜欢

内核嵌入式摄像头
浙江首试公路非现场执法新型摄像头
多内核操作系统综述①
摄像头连接器可提供360°视角图像
强化『高新』内核 打造农业『硅谷』
TS系列红外传感器在嵌入式控制系统中的应用
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
搭建基于Qt的嵌入式开发平台
嵌入式软PLC在电镀生产流程控制系统中的应用
奔驰360°摄像头系统介绍