扫一扫
关注微信公众号

嵌入式Linux的图像采集与显示(下)
2007-01-26   中国IT实验室

然后调用ioct1(grab_fd,VIDIOCSYNC,&frame)函数,该函数成功返回则表示采集完毕,采集到的图像数据放到以data为起始地址,长度为240×320×3的内存区域中,读取该内存中的数据便可得到图像数据。

&

nbsp;
在此基础上同样可实现连续帧的采集,即一次采集连续多帧图像的数据,Video4Linux最多支持一次采集32帧,此时首先要设置 grab_buf.frame为要采集的帧数,而每一帧的数据在内存中的位置为data+grab_vm.offsets[frame],其中 grab_vm为video_mbuf结构体变量的一个声明,利用ioct1(fd,VIDIOCGMBUF,&grab_vm)便可获得grab_vm 的信息。

4 基于FrameBuffer的图象显示

当Video4Linux使用mmap方式采集图像时,他总是尽最大努力将图像直接显示在屏幕上,但并不一定能够完成,因此一个完整的设备应该具有图像显示的功能,一般来讲,嵌入式Linux下显示一幅图像总共有以下几种方法:

(1)在利用Video4Linux采集图像时,将采集到的图象数据直接放到FrameBuffer的内存映射区中,而Video4Linux也支持这种 功能,利用VIDIOCSFBUF和VIDIOCGFBUF这两个ioct1函数,可设置和获得struct video_buffer。但该方法并不是每个图像采集设备都支持。

(2)进图像数据存成各种格式(例如bmp),在各种GUI软件中,均会直接显示不同格式的图像的函数,如MiniGui中的FillBoxWithBitmap函数。

(3)直接将图像数据写入FrameBuffer中。

在这里主要介绍第3种。FrameBuffer设备是运行在Linux控制台上的一个优秀的图形接口,他几乎支持所有的硬件,提供了统一的API接口,很 好地实现了硬件无关性,他可以直接操作显存,而且还留有提供图形加速功能的接口,运行时不需要root权限;FrameBuffer的设备节点是 /dev/fb*,用户若要使用他,需要在编译内核时选中FrameBuffer,其简单的使用程序如下:

简单的使用程序

从vinfo和finfo中取得显存起始地址、分辨率、色深等信息,然后根据这些计算出需映射显存的大小。

从vinfo和finfo中取得显存起始地址、分辨率、色深等信息,然后根据这些计算出需映射显存的大小

由此便可直接操作大小为screensize,起始地址为fbp的内存区域,在LCD上直接显示图像、图形、文字等,例如执行memset(fbp,0,screensize)将进行清屏操作。

需要注意的是,对于色深为8位或8位以下的设备,在进行绘图操作前还需要设置合适的调色板,操作调色板要用到fb_camp结构,执行ioctl(fd,FBIOGETCMAP,&old_cmap)将保存调色板信息,执行ioctl(fd,FBIO-PUTCMAP,&new_cmap)将设置新的调色板。以下介绍如何显示一个象素,这里假设LCD为24位色的。



如何显示一个象素,这里假设LCD为24位色的

由此便可逐一显示每个象素,进而显示整幅图像。

5 结语

由于Linux的驱动模型支持模块堆叠技术,内核开发者已提供了一些通用模块,因此,虽然文中是以USB摄像头为例,但只要针对自己的图像采集设备编写基于Video4 Linux的驱动程序, 针对自己的LCD编写基于FrameBuffer的驱动程序,以上的程序便可成为通用的图像采集与显示程序。应用本文所述方法完成图像采集与显示工作,再 加上相关的处理并接入网络,就构成了一个智能终端设备,可用于工厂、银行等场合全天候的智能监控,图像的网络通信等,具有广阔的是市场和应用前景。

from:

http://article.ednchina.com/Embeded/2006-10/200610101046022.htm

热词搜索:

上一篇:嵌入式Linux的图像采集与显示(上)
下一篇:硬盘扇区的读写函数及其调用路径

分享到: 收藏