&
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中取得显存起始地址、分辨率、色深等信息,然后根据这些计算出需映射显存的大小。
由此便可直接操作大小为screensize,起始地址为fbp的内存区域,在LCD上直接显示图像、图形、文字等,例如执行memset(fbp,0,screensize)将进行清屏操作。
需要注意的是,对于色深为8位或8位以下的设备,在进行绘图操作前还需要设置合适的调色板,操作调色板要用到fb_camp结构,执行ioctl(fd,FBIOGETCMAP,&old_cmap)将保存调色板信息,执行ioctl(fd,FBIO-PUTCMAP,&new_cmap)将设置新的调色板。以下介绍如何显示一个象素,这里假设LCD为24位色的。
由此便可逐一显示每个象素,进而显示整幅图像。
5 结语
由于Linux的驱动模型支持模块堆叠技术,内核开发者已提供了一些通用模块,因此,虽然文中是以USB摄像头为例,但只要针对自己的图像采集设备编写基于Video4 Linux的驱动程序, 针对自己的LCD编写基于FrameBuffer的驱动程序,以上的程序便可成为通用的图像采集与显示程序。应用本文所述方法完成图像采集与显示工作,再 加上相关的处理并接入网络,就构成了一个智能终端设备,可用于工厂、银行等场合全天候的智能监控,图像的网络通信等,具有广阔的是市场和应用前景。
from:
http://article.ednchina.com/Embeded/2006-10/200610101046022.htm