1 / 22
文档名称:

usb摄像头采集.doc

格式:doc   大小:70KB   页数:22页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

usb摄像头采集.doc

上传人:2028423509 2019/11/23 文件大小:70 KB

下载得到文件列表

usb摄像头采集.doc

相关文档

文档介绍

文档介绍:USB摄像头图像采集程序分析本文是在Linux操作系统下实现对USB摄像头的图像采集与显示的。由于操作系统已经有了USB摄像头的驱动,因此摄像头可以直接使用。USB摄像头的数据采集和显示分为三个步骤:USB摄像头采集数据;将采集的数据进行解码转换成RGB格式;利用Framebuffer将RGB数据显示在LCD上。USB摄像头图像采集属于V4L2编程,可以参考VideoforLinuxTwoAPISpecification这个文档。我的USB摄像头采集的数据格式是Jpeg图片,像素是320*240,下一步工作是将JPEG图片转换成RGB格式。对Framebuffer进行操作便可以显示RGB图像,即可显示摄像头采集的图像了。多祯图片连续显示便可显示连续的画面。下面我将从后到前的顺序依次介绍这三个过程。首先是对Framebuffer的编程实现对RGB图像的显示。Framebuffer在硬件上对应的就是手持设备的LCD,在PC机上就是显示其了。在软件上就称为Framebuffer了,在Linux系统中,一个设备相当于一个文件,对文件的操作相当于对设备进行操作了,显示器对应的设备文件就是/dev/fb0。进行如下操作:le/dev,查看设备文件,看是否有fb0,如果有这个设备就可以进行下面的编程了。如果没有,需要修改一个文件,/boot/grub/,在我们使用的那个系统增加如下参数,rgb=0x317,设置为1024*76816位色显示,然后重启便可以看到fb0了。第一步是对fb0的初始化,读取fb0相关参数并得到内存映射地址。intinit_fb(void){ //intfb; structfb_var_screeninfofb_var; // fb=open("/dev/fb0",O_RDWR); if(fb<0) { printf("open/dev/fb0error!\n"); return-1; } // ioctl(fb,FBIOGET_VSCREENINFO,&fb_var); w=; h=; bpp=; printf("screeninformation:%d*%d,bpp:%d\n",w,h,bpp); // fbmem=mmap(0,w*h*bpp/8,PROT_WRITE|PROT_READ,MAP_SHARED,fb,0); return0; }之前定义了全局变量,staticint fb=-1; //fb0文件描述符staticintw,h,bpp; //显示器长度,宽度,每像素多少位staticshort*fbmem;这里主要有一个函数mmap(0,w*h*bpp/8,PROT_WRITE|PROT_READ,MAP_SHARED,fb,0);把Framebuffer映射到内存空间,长度为w*b*bpp/8个字节。然后通过对这段内存进行读取和修改,相当于对Framebuffer(硬件上就是LCD)的读取和修改。 下面是对Framebuffer的操作了,也就是对LCD进行操作了。voidfb_point(unsignedshort*fbmem,intx,inty, intw,shortcolor){ fbmem[y*w+x]=color;} 这是一个画点的函数,(x,y)代表LCD的横坐标、竖坐标,确定某一个具体的位置,color为颜色值。在这里我采用的是RGB565编码,通过三元色确定一个像素的颜色。R(red)占5位,G(green)占6位,B(blue)占5位,正好16位,两个字节,因此fbmem为short类型。voiddisplay_image(unsignedshort*fbmem,intw, intimgw,intimgh,unsignedshort*imgbuf){ inti,j; shortcolor; unsignedshort*imagebuf=(unsignedshort*)imgbuf; for(j=0;j<imgh;j++) { for(i=0;i<imgw;i++) { color=*imagebuf; fb_point(fbmem,10+i,10+j,w,color); imagebuf++; } }}这是一个显示图片的函数,参数fbmem代表mmap映射frambuffer的首地址,intw代表屏的宽度,intimgw,imgh代表图片的长和宽,imgbuf为一张图片的RGB565数据。通过此函数可以将一副图片显示在LCD上。现在唯一的问题是图片格式一般很少是RG