新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Linux 下基于ARM920T 的USB 摄像头图像采集

Linux 下基于ARM920T 的USB 摄像头图像采集

作者:时间:2012-05-21来源:网络收藏

3.1图像数据的采集过程:

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

while (max_try) {

dev = open (device, O_RDWR);

if (dev == -1) {

if (!--max_try) {

fprintf (stderr, "Can't open device %sn", 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目前是在嵌入式领域中比较流行的图形开发工具,在我们的文件系统中,采用了基于QT的图形界面Qtopia,以下是实现调用图像信息的QT语句。第一句表示将图片的路径以及图片的名字传给pm1,然后通过Qlabel类的pl传出图片给图片查看器,从而实现了图像信息的显示。

QPixmap pm1("picture_path/picture_name");

Qlabel p1;

p1—>SetPixmap(pm1);

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

4、结束语

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

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

参考文献:

[1] SAMSUNG主页:http://www.samsungsemi.com/

[2]《基于ARM-Linux 嵌入式系统引导程序的设计》刘晶晶《微计算机信息》2006第2-2期

[3]《构建嵌入式Linux系统》,Karim Yaghmour著,中国电力出版社

[4]《Linux设备驱动程序(第三版),Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman著,魏永明等译,中国电力出版社

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭