基于ARM的嵌入式USB图像采集与显示

时间:2022-10-06 04:51:56

摘 要:基于ARM9处理器和嵌入式Linux操作系统,文章研究了视频图像采集与显示的一般方法。以USB摄像头采集图像为例,介绍了Linux系统下基于Video4Linux进行视频图像采集的一般过程,并且最终通过Qt/Embedded编写的图形界面将采集到的视频图像在LCD上实时地显示出来。

关键词: 嵌入式Linux;图像采集;Video4Linux;Qt/Embedded;图像显示

中图分类号:TN949.199文献标识码:B

Image Capture and Display of Microprocessor and USB Camera Based on Embedded ARM

WU Jian

(School of Instrument Science and Opto-electronic Engineering, Hefei University of Technology, Hefei Anhui 230009, China)

Abstract: Based on ARM9 platform and the Linux operating system, this article studied on the general methods of the video image capture and display. Take USB-camera image acquisition for example, the general process of video image acquisition based on Video4Linux under the Linux operating system is introduced, and through the image display interface based on Qt/Embedded the collected images is displayed on the LCD finally.

Keywords:Linux embedded; image acquisition; Video4Linux; Qt/Embedded; image display

引 言

目前市场上大部分的图像采集与处理系统是基于DSP芯片的,这种图像采集与处理系统成本高、功耗高、体积约束等特点并不适用于一些简单的应用。随着USB摄像头的普及和基于ARM的嵌入式芯片的快速发展,将二者结合的便携性越来越受人们欢迎。本文介绍了一种基于三星S3C2440A芯片的嵌入式USB摄像头图像采集与显示方案,该方案具有良好的可移植性和扩展性,并且成本、大小和实时处理都能够满足市场需求。

1系统架构

系统通过当前市场上应用最广泛的中芯微公司生产的zc301p芯片的USB摄像头进行图像采集,然后将图像信息传送到ARM芯片中进行处理,最终通过基于Qt/Embedded编写的图形显示程序在LCD上实时显示。系统的整体架构如图1所示。

2视频图像采集

系统采用中芯微公司生产的zc301p芯片的USB摄像头作为图像采集设备,并介绍了基于Video4Linux编程协议进行视频图像采集的一般过程。

2.1USB摄像头驱动[1]

Linux内核能够很好地支持OHCI(开放式主机控制接口协议),并且能够很好地支持包括OV511系列摄像头在内的各种各样的USB设备,但是并不包括zc301pUSB摄像头。直到后来2.6.27版本左右的内核中才增加了针对zc301系列芯片的驱动,统称为Linux UVC。本文采用的是Linux2.6.32.2版本内核,只需要对内核进行简单的配置,就可以实现功能了。

在配置菜单选项中,设备驱动是最重要的配置项。选择的配置项如下:

Device Drivers --->

Multimedia devices --->

Video For Linux

Enable Video For Linux API 1(DEPRECATED)

Video capture adapters --->

V4L USB devices --->

USB Video Class (UVC)

UVC input events device support

GSPCA based webcams --->

ZC3XXX USB Camera Driver

USB ZC0301[P]Image Processor and Control Chip support

现在,内核被配置成可以支持Video4Linux的视频接口,并且加入了支持zc301pUSB摄像头的驱动程序。

2.2基于Video4Linux的视频图像采集程序设计

Video4Linux(简称V4L)[2,3]为目前市场常见的电视捕获卡和并口及USB口的摄像头提供统一的编程接口。在Linux内核中它为用户空间提供统一的编程接口,V4L分为两层:底层是音频和视频设备驱动程序的内核;上层为系统提供一些API接口信息。视频图像采集流程如图2所示。

(1) 打开视频设备

在Linux中视频设备是被作为设备文件来执行的,本文USB摄像头的设备文件名为/dev/video0。int my_v4l_open(char*dev,my_v4l_struct*vd)函数用于打开视频设备并初始化摄像头设备,该函数调用open函数可以读设备文件,成功返回设备描述符,失败返回-1。主要程序代码如下:

int my_v4l_open(char*dev,my_v4l_struct*vd){

if((vd->fd=open(vd->videodevice,O_RDWR)) = =-1){

printf("ERROR opening V4L interface");

exit(1);}

……}

(2) 读设备信息

int my_v4l_get_capability(my_v4l_struct*)函数的功能是读取设备基本信息,它利用ioctl(vd_fd,VIDIOCGCAP,&(vd->capability)来读取有关摄像头的信息。该函数成功返回后将这些信息从内核空间拷贝到用户程序空间capability各成员分量中,使用printf函数就可得到各成员分量信息。具体如下:

int my_v4l_get_capability(my_v4l_struct*){

if(ioctl(vd->fd,VIDIOCGPICT,&(vd->capability))

printf("error:v4l_get_capability\n");

exit(1);}

return 0;}

(3) 视频图像采集

本文通过mmap方式来采集视频图像信息。为了获得映射的帧缓冲信息,my_v4l_mmap_init(my_v4l_struct*)函数需先初始化缓冲区,并进行内存与缓冲区的绑定,其中函数mmap用于将文件fd与video_mbuf绑定实现映射,函数mmap()返回值是系统实际分配的起始地址。函数my_v4l_mmap_init()的部分代码实现如下:

void my_v4l_mmap_init(my_v4l_struct*vd){

……

ioctl(vd->fd,VIDIOCGMBUF,&(vd->mbuf));

//初始化video_mbuf以得到所映射的buffer的信息

vd->pFramebuffer=(unsigned char*)mmap(0,vd->videombuf.size,

PROT_READ|PROT_WRITE,MAP_SHARED,vd->fd,0);

/*把文件fd与video_mbuf绑定,实现映射*/

vd->mmapsize=vd->videombuf.size;

vd->vmmap.height=vd->hdrheight;

vd->vmmap.width=vd->hdrwidth;

vd->vmmap.format=vd->formatIn;

vd->vmmap.frame=0;

……}

然后利用驱动程序的ioctl()函数的VIDIOCMCCAPTURE和VIDIOCSYNC命令来获取图像。其中ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->mmap))开始一帧图像的采集,是非阻塞的;ioctl(vd->fd,VIDIOCSYNC,&frame)用于判断一帧图像采集过程结束与否,frame是当前采集的帧的序号。

采集工作结束后调用munmap取消文件fd与video_mbuf的绑定。

munmap(vd->map,vd->mbuf.size);

(4) 关闭设备

在视频采集完成后,必需关闭视频设备。

close(vd->fd);

3基于Qt/Embedded图像显示程序的编写

基于嵌入式Linux常见的GUI系统有MiniGUI、Micro Windows、OpenGUI和基于Framebuffer[5]的Qt/Embedded[4]。Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架,它提供给应用程序开发者建立艺术级的图形用户界面所需的功能,并且是完全面向对象的,很容易扩展,允许真正的组件编程。正是基于以上优点,本文采用Qt/Embedded开发平台,并将基于Qt的图形界面Qtopia移入我们的文件系统中。

为了避免由于图像数据量大而在目标板上显示闪烁的问题,本文采用双缓冲技术实现采集图像显示,采用的是QPixmap对象。QPixmap是Qt为图像处理提供的类,主要用于图像的绘制。实现双缓冲时,先把要显示的内容绘制在这个QPixmap pixmap对象上,然后再用一步操作把pixmap绘制在屏幕上。基于Qt图像显示及辅助框线绘制的部分代码段如下:

QPixmap pix(width(),height());//定义一个QPixmap用于在上面绘制图像及框线

QPainter p(&pix);//定义绘制工具QPainter

QPen pen(yellow,3,DotLine);//定义一个画笔的属性,如颜色、粗细、线条样式

p.drawImage(0,0,img);//把摄像头采集到的图像绘制到QPixmap上

p.setPen(pen);//设置画笔属性

p.moveTo(50,330);//设置画笔笔尖起始位置

p.lineTo(150,50);//开始绘制框线

p.lineTo(490,50);

….略

p.end();//在QPixmap上的所有绘制任务结束

p.begin(this);//准备把QPixmap绘制到屏幕上

p.drawPixmap(0,0,pix);//绘制QPixmap到屏幕操作,图像显示到LCD上

图像数据的连续采集和显示是通过定时器实现的,QTimer类提供了定时器信号和单触发定时器。设置定时启动触发周期,每当定时器时间到就触发一个定时器事件,在事件中调用VIDIOCMCAPTURE函数完成对图像的采集,并通过QPixmap类将图像显示到LCD上。至此就可以通过基于Qt编写的图形界面程序,将USB摄像头采集的视频图像在LCD上实时显示。

4结论

本文基于ARM9处理器和嵌入式Linux操作系统,详细介绍了一种USB摄像头图像采集与显示的通用方法。Linux代码完全开源,系统具有良好的移植性,可方便地进行各种扩展,采用Qt进行人机界面的设计能够极大地节省开发成本和周期。本方案经推广可用于工业控制、智能交通、小区监控等领域。

参考文献

[1] 王永清. Linux下基于ARM920T的USB摄像头图像采集[J]. 微计算机信息,2007,第23卷第1-2期:176-177.

[2] 陈亮. 基于Video4Linux2的图像采集程序设计[J]. 微计算机信息,2009,第25卷第3-1期:65-67.

[3] 戴丽. 基于Video4Linux的USB摄像头图像采集实现[M]. 未出版.

[4] 倪继利. QT及Linux操作系统窗口设计[M]. 北京:电子工业出版社,2006:217-219.

[5] 郑强. Linux驱动开发与实践[M]. 北京:清华大学出版社,2011:279-288.

[6] [加拿大]Jasmin Blanchette,[英]Mark Summerfield著,闫峰欣,曾泉人,张志强译. C++ GUI Qt4编程(第二版)[M],北京:电子工业出版社,2008.

作者简介:吴健(1987-),男,安徽合肥人,合肥工业大学硕士研究生,主要研究方向为嵌入式技术,E-mail:。

上一篇:超越视界 三星商用领潮数字标牌产业 下一篇:触控首选 三星商用大屏打造高端互动显示方案