您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

嵌入式Linux体系的图像征求与表现

发布日期:2011-06-08

    1 体系平台的硬件布局 

    本文利用的体系平台硬件结果框图如图1所示,该平台采取Samsung公司的处理惩罚处罚器S3C2410。该处理惩罚处罚器内部集成了ARM公司ARM920T处理惩罚处罚器核的32位微控制器,资源丰富,带独立的16KB的指令Cache和16KB数据Cache,LCD控制器、RAM控制器,NAND闪存控制器,3路UART、4路DMA、4路带PWM的Timer、并行I/O口、8路10位ADC、Touch Screen接口,I2C接口,I2S接口、2个USB接口控制器、2路SPI,主频最高可达203MHz。在处理惩罚处罚器丰富资源的底子上,还举行了干系的配置和扩展,平台配置了16MB 16位的FLASH和64MB 32位的SDRAM,通过以太网控制器芯片AX88796扩展了一个网口,别的引出了一个HOST USB接口。在USB接口上外接一个带USB口的摄像头。别的,还配有辨别率为320×240,256色的LCD。

    2 嵌入式Linux简介 

    Linux利用体系具有相称多的长处,他的内核稳固、结果强大、支持多种硬件平台、源代码完全开放,可淘汰和低资源的特性非常得当于嵌入式应用,并且Linux本身直接提供完备的TCP/IP协议,可非常方便地举行网络应用。但Linux内核本身不具备强及时性,且内核体积较大,并且嵌入式体系的硬件资源有限,因此把Linux用于嵌入式体系,必须对Linux举行及时化和嵌入式化,即通过配置内核,淘汰shell和嵌入式C库对体系定制,使整个别系可以大概存放到容量较小的FLASH中,Linux的动态模块加载,使Linux的淘汰极为方便,高度模块化的部件使添加非常容易。 

    整个别系软件是在嵌入式Linux的底子上构建的。S3C2410平台利用的Linux内核是在Linux-2.4.18内核打上patch-2.4.18-S3C2410这个补丁后编译而成。S3C2410平台利用的文件体系是yaffs,文件体系包括应用步调、模块、配置文件和库等,图像的征求和表现是创建在嵌入式Linux内核之上的,整个软件体系如图2所示。


    通常宿主机和目标板上的处理惩罚处罚器差别,宿主机通常为Intel处理惩罚处罚器,而目标板如图1所示为SAMSUNG S3C2410,以是步调须要利用针对处理惩罚处罚器特点的编译器才华天生在相应平台上可运行的代码,GNU编译器提供如许的结果,在编译时,可以选择开辟所需的宿主机和目标机,从而创建开辟环境。在举行嵌入式开辟前的第一步变乱便是把一台PC机作为宿主机开辟机,并在其上摆设指定利用体系。敷衍嵌入式Linux,宿主机PC上应摆设Linux体系。之后,在宿主机上创建交错编译调试的开辟环境,开辟环境的细致创建这里不细谈。本文采取移植性很强的C语言在宿主机上编写视频征求步调,再利用交错编译调试东西编译链接天生可实行代码,着末向目标平台移植。 

    3 基于Video4Linux的图像征求 

    Video4Linux是Linux中关于视频配置的内核驱动,他为针对视频配置的应用步调编程提供一系列接口函数,在Linux下,视频征求配置的正常利用依赖于对Video4 Linux标准的支持。要是利用Video4Linux,在编译内核时,肯定要选中Multimedia Devices下的Video for Linux选项,本文针对的配置文件是 / dev / video,利用的器件是基于OV511的USB摄像头。在运行步调前,肯定要先加载USB及OV511配置驱动模块,同时加载Video4Linux模块,分别利用下令:modprobe usbcore,modprobe usbohci,modprobe videodev和modprobe ov511,以确保天生配置文件/dev/video,若利用的Linux利用体系不支持modprobe下令,也可利用insmod下令。一样通常来讲,基于Video4Linux的图像征求的步调流程如图3所示。

    以下大抵先容步调的编写,在这里只给出关键部分的实当代码。 

    起首,必须声明包括2个头文件:

    在获取图像信息后,还可根据须要变革这些信息,比喻相比度、亮度、调色板等,细致做法是先给video_picture中相应变量赋新值,再利用VIDIOCSPICT ioct1函数。 
    第2部分,利用mmap要领的单帧图象征求:

    然后调用ioct1(grab_fd,VIDIOCSYNC,&frame)函数,该函数告成返回则表现征求完毕,征求到的图像数据放到以data为肇始地点,长度为240×320×3的内存地区中,读取该内存中的数据便可得到图像数据。 

    在此底子上同样可实现连续帧的征求,即一次征求连续多帧图像的数据,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中获取显存肇始地点、辨别率、色深等信息,然后根据这些谋略出需映射显存的大小。

    由此便可直接利用大小为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的驱动步调,以上的步调便可成为通用的图像征求与表现步调。应用本文所述要领完成图像征求与表现变乱,再加上干系的处理惩罚处罚并接中计络,就构成了一个智能终端配置,可用于工厂、银行等场合全天候的智能监控,图像的网络通讯等,具有广阔的是市场和应用远景。