Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15499006
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2009-08-05 09:08:53

摘要:随着USB摄像头的普及和基于ARM核的嵌入 式芯片的快速发展,二者结合的便携性越来越受到人们欢迎,而嵌入式Linux的迅速发展更为二者的结合铺平了道路,本文介绍了基于ARM920T的嵌入式 Linux下利用USB摄像头采集图像的硬件、软件设计过程,最终实现了在目标板上图像的采集和显示。
关键词:ARM;USB摄像头;Video for Linux;图像采集;嵌入式Linux

1、基于ARM920T的USB摄像头图像采集硬件平台

                                 图(1) 硬件结构原理图

图(1)中各个主要模块基本组成描述如下:

① 微处理器(MPU):针对开发多媒体视频终端的需要,并考虑到系统外围设备的需求情况,本系统采用SAMSUNG公司内嵌ATM920T内核的三星S3C2410处理器。最高主频可达203MHz [1]

② SDRAM存储部分采用两颗Hynix公司的HY57V561620CT内存,大小为32M。

③ FLASH存储器采用SAMSUNG公司的K9F1208UOM Nand Flash,大小为64M。

④ USB集线器芯片:采用ALCOR MICRO公司的AU9254A21,可扩展为4个USB外围接口,分别连接图(1)中所示的四个外围设备。

⑤ LCD:采用Sharp公司的3.5寸LCD,分辨率为240×320。

2、基于ARM920T的USB摄像头图像采集的软件系统

由于嵌入式Linux具有成本低、代码开放、移植性好的特点,其用于嵌入式系统的优势和发展潜力是不容置疑的。软件部分的搭建主要依赖于以下三个部分:

① Boatloader:可以从SAMSUNG公司的官方网站获取,经过交叉编译生成映像文件,然后通过JTAG接口将映像烧写到目标板,实现引导程序的装载[2]

② Kernel:本系统采用Linux-2.4.18.tar.gz版本的内核。

③ 文件系统:由于本系统要进行动态的擦写FLASH,所以采用了支持此功能的YAFFS文件系统[3]

Linux平台的驱动一般分为字符设备、块设备和网络设备三种类型。而在Linux下要使系统所挂接的外部设备正常工作,必须加载相应的驱动程序。 Linux下对于一个硬件的驱动,可以有两种方式:一种是直接加载到系统的内核当中去,另一种是以模块方式进行加载,就是在编译内核的时候,同时生成可重 定位的目标文件(.o文件)[4]。项目中所用的SBC2410X的实验板的USB主控器驱动程序模块为USB-OHCI- S3C2410.o。在Linux下要采集视频类数据,需要加载Video4Linux驱动模块Videodev.o。然后再加相应的摄像头驱动程序。在 项目开发中,我们所使用的摄像头采用的USB控制器为ov511+,所对应的驱动程序模块为ov511.o。所以在系统启动时必须要通过如下命令:


>>insmod videodev.o

>>insmod usb-ohci-s3c2410.o

>>insmod ov511.o

来加载所需要的模块。通过开源项目spca5xx可以得到上边所需模块的全部源代码。 上层软件部分我们参考了vidcat,vgrabber, w3cam,gqcam这几种软件的操作过程,重点参照了vidcat进行了V4L编程,使用了v4l.c和vidcat.c 中的函数,经过交叉编译,在实验板上实现了实时图像采集的目的。

    在图(2)中显示了各个模块之间的关系,其中从上到下的箭头流向表示通过各个模块启动和配置摄像头,从下到上的箭头流向表示由摄像头所采集的图像数据经各个模块采集到用户指定的位置。

3、在Linux下采集并显示USB摄像头数据

Linux下摄像头的驱动程序是以81为主设备号,在编写应用程序的时候,要通过打开一个具有该主设备号的设备文件来建立与设备驱动程序的通信,我 们所使用的Linux没有该文件,所以需要手工创建,并建立其软连接,因为要对文件进行操作,所以要改变其访问权限为666。我们用到的 videodev.o模块即为视频部分的标准Video for Linux (简称V4L)。这个标准定义了一套接口,内核、驱动、应用程序以这个接口为标准进行通信。

3.1图像数据的采集过程:

第一步:要打开摄像头设备,而在Linux下可以通过系统的设备文件来访问设备,在前面我们创建并建立了摄像头的设备文件,所以文件描述符(dev)可以如下方法获取:

        while (max_try) {

dev = open (device, O_RDWR);

               if (dev == -1) {

                      if (!--max_try) {

                             fprintf (stderr, "Can't open device %s\n", device);

                             return (1);}    /*max_try为试图打开设备的最多次数*/

                      sleep (1);

               } else { break; }}

第二步:进行访问摄像头设备的状态信息。

首先我们可以在kernel的源代码中找到头文件videodev.h,这个头文件定义了我们要编写的应用程序的所有数据结构和函数。当然我们先要 获得摄像头的信息,可以通过头文件中的video_capability结构来了解摄像头的性能。其函数接口是int v4l_check_size (int fd, int *width, int *height),读出其中的单元可按如下方法,宏VIDIOCGCAP定义为 _IOR('v',1,struct video_capability)。

struct video_capability vid_caps;

if (ioctl (fd, VIDIOCGCAP, &vid_caps) == -1) {

            perror ("ioctl (VIDIOCGCAP)"); return -1;}

然后通过访问结构体vid_caps就可以读出摄像头可拍摄的图片类型、图片的最大最小高度和宽度。

第三步通过控制摄像头来采集图象数据。

实现函数为image = get_image (dev, width, height, palette, &size),通过该函数可以将设备文件中的图象数据的信息读出来,该函数的返回值image为图片要存储的格式,例如png、jpeg等。但这 样必须首先申请一块足够大的内存空间,我们是这样完成的:

map = malloc (width * height * bytes);

               len = read (dev, map, width * height * bytes);

               if (len <= 0) { free (map); return (NULL); }

这样采集到的图像数据就会先存到所分配到的内存空间中,然后进行下一步的象素和图片格式存储处理。

第四步:按照预定的象素值和图片格式来存储图像。

在驱动程序向应用程序传递图像数据是一个拷贝过程,所以应用程序在采集图片数据时,先将驱动程序中图片缓冲区中的数据拷贝到应用程序中,然后再控制和处理图片数据。

if (palette == VIDEO_PALETTE_YUV420P) {

                      convmap = malloc ( width * height * bytes );

                      v4l_yuv420p2rgb (convmap, map, width, height, bytes * 8);

                      memcpy (map, convmap, (size_t) width * height * bytes);

                      free (convmap); }

这就是拷贝的过程,memcpy()为拷贝函数,v4l_yuv420p2rgb()函数用来将原生图片转换为RGB格式的图像信息。然后通过前边image的返回值来分别调用函数put_image_png,put_image_jpeg来生成相应格式的图像信息。

3.2 通过QT编译的图片查看器查看摄像头采集的图像。

QT目前是在嵌入式Linux领域中比较流行的图形开发工具,在我们的文件系统中,采用了基于QT的图形界面Qtopia,以下是实现调用图像信息 的QT语句。第一句表示将图片的路径以及图片的名字传给pm1,然后通过Qlabel类的pl传出图片给图片查看器,从而实现了图像信息的显示。

QPixmap pm1("picture_path/picture_name");

Qlabel p1;

p1—>SetPixmap(pm1);

在采集的图像数据中,可以自定义所存储的图片格式,大小及其像素,方便迅速,而Qtopia是基于QT的比较成熟的嵌入式图形界面,利用其来显示我们所采集的图像数据效果良好。

4、结束语

本文详细介绍了基于ARM920T的嵌入式Linux下的USB摄像头图像采集的硬件、软件构建过程,可以灵活应用于基于嵌入式的各种电子产品中。由于所采用的软件全部是开放源码而且免费获得,所以对于需要便携好而又要有较高的数据处理能力且成本要求严格的方面尤其适合。

本文作者创新点:通用串行总线是一种非常实用的通信接口,其应用日益广泛,而Linux+ARM9下USB设备的应用也逐渐完善;并且采用了具有永 久性存储功能的Yaffs文件系统,为客户进行实时处理图像提供了方便;同时使用QT编译的图像采集界面使图像数据的采集更加人性化,这几方面的结合使其 必有很广的市场前景。

阅读(896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~