钱鹰;陈胜利
【摘 要】For the purpose of image acquisition based on embedded Iinux environment and image display in the embedded development board, this paper studies the general method of video capture and display, and combined the OK6410 development board of Feiling company with embedded Iinux operating system. Through customizing kernel, cross-compiling procedure and designing image display GUI based on Qt/Embedded, we ultimately achieve image acquisition in the embedded Linux platform and display in the development board by USB camera,and simple operation in the development board of the displayed image.%基于嵌入式Linux环境下图像采集及在嵌入式开发板上对图像显示的目的,本文研究了视频采集及显示的一般方法,并将飞凌公司0K6410开发板与嵌入式Linux操作系统相结合,通过对内核的定制、交叉编译程序及基于Qt/Embedded设计图像显示GUI,最终实现了嵌入式Linux平台下USB摄像头对图像的采集以及在开发板上的显示,并且在开发板上实现了对显示图像的简单操作. 水晶笔筒
【期刊名称】《电子设计工程》
【年(卷),期】2013(021)003
【总页数】3页(P140-142)
【关键词】ARM;USB摄像头;V4L;嵌入式Linux
【作 者】钱鹰;陈胜利
【作者单位】重庆邮电大学软件学院,重庆400065;重庆邮电大学自动化学院,重庆400065
【正文语种】中 文
【中图分类】卫生棉条自动拔除器TP391.4
随着科技的进步和社会的发展,数字视频图像的采集、存储、处理及传输技术在最近几年得到了广泛的应用,与传统图像处理系统相比,嵌入式图像处理系统具有体积小、成本低、可靠性高等优点,在智能交通、远距离监控、计算机视觉等领域广泛运用。而嵌入式L
inux系统具有源代码开放、内核稳定、可裁减性、驱动丰富等特点,吸引着众多商业公司和自由软件开发者的目光,成为嵌入式系统领域不可或缺的操作系统之一。
文献[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指令包含了针对媒体处理的单指令流多数据流(SI
餐台滑轨
MD)扩展,采用特殊的设计,以改善视频处理性能,拥有强大的内部资源和视频处理能力,可稳定运行在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],因此本文采用第一种方法。se110
又由于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 MiniGUI OpenGUI函数库典型大小 600K 300K 300K移植性 很好 较好 只支持x86 API(完备性)Qt(C++)(很完备)Win32(很完备)私有(很完备)系统消耗 最大 小 最小操作系统 Linux Linux Linux,DOS,QNX
QT/Embedded是一个为访问嵌入式设备的API,它的类库完全采用C++封装,丰富的控件
HSCSB资源和较好的可移植性是其最优秀的一方面,因此,本文通过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.