资源描述:
《usb摄像头采集》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、.USB摄像头图像采集程序分析本文是在Linux操作系统下实现对USB摄像头的图像采集与显示的。由于操作系统已经有了USB摄像头的驱动,因此摄像头可以直接使用。USB摄像头的数据采集和显示分为三个步骤:USB摄像头采集数据;将采集的数据进行解码转换成RGB格式;利用Framebuffer将RGB数据显示在LCD上。USB摄像头图像采集属于V4L2编程,可以参考VideoforLinuxTwoAPISpecification这个文档。我的USB摄像头采集的数据格式是Jpeg图片,像素是320*240,下一步工作是将JPEG图片转换成RGB格式。对Framebuffe
2、r进行操作便可以显示RGB图像,即可显示摄像头采集的图像了。多祯图片连续显示便可显示连续的画面。下面我将从后到前的顺序依次介绍这三个过程。首先是对Framebuffer的编程实现对RGB图像的显示。Framebuffer在硬件上对应的就是手持设备的LCD,在PC机上就是显示其了。在软件上就称为Framebuffer了,在Linux系统中,一个设备相当于一个文件,对文件的操作相当于对设备进行操作了,显示器对应的设备文件就是/dev/fb0。进行如下操作:le/dev,查看设备文件,看是否有fb0,如果有这个设备就可以进行下面的编程了。如果没有,需要修改一个文件,/b
3、oot/grub/menu.lst,在我们使用的那个系统增加如下参数,rgb=0x317,设置为1024*76816位色显示,然后重启便可以看到fb0了。第一步是对fb0的初始化,读取fb0相关参数并得到内存映射地址。intinit_fb(void){//intfb;structfb_var_screeninfofb_var;//1.openframebufferfb=open("/dev/fb0",O_RDWR);if(fb<0){printf("open/dev/fb0error!");return-1;}...//2.getfbinformationio
4、ctl(fb,FBIOGET_VSCREENINFO,&fb_var);w=fb_var.xres;h=fb_var.yres;bpp=fb_var.bits_per_pixel;printf("screeninformation:%d*%d,bpp:%d",w,h,bpp);//3.getframebufferaddressfbmem=mmap(0,w*h*bpp/8,PROT_WRITE
5、PROT_READ,MAP_SHARED,fb,0);return0;}之前定义了全局变量,staticintfb=-1;//fb0文件描述符staticintw,h,b
6、pp;//显示器长度,宽度,每像素多少位staticshort*fbmem;这里主要有一个函数mmap(0,w*h*bpp/8,PROT_WRITE
7、PROT_READ,MAP_SHARED,fb,0);把Framebuffer映射到内存空间,长度为w*b*bpp/8个字节。然后通过对这段内存进行读取和修改,相当于对Framebuffer(硬件上就是LCD)的读取和修改。下面是对Framebuffer的操作了,也就是对LCD进行操作了。voidfb_point(unsignedshort*fbmem,intx,inty,intw,shortcolor){fbmem
8、[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=(un
9、signedshort*)imgbuf;for(j=0;j10、为RGB格