USB 摄像头图像采集程序分析 本文是在Linux操作系统下实现对USB 摄像头的图像采集与显示的。由于操作系统已经有了 USB 摄像头的驱动,因此摄像头可以直接使用。USB 摄像头的数据采集和显示分为三个步骤:USB 摄像头采集数据;将采集的数据进行解码转换成 RGB 格式;利用 Framebuffer 将 RGB 数据显示在LCD 上。 USB 摄像头图像采集属于 V4L2 编程,可以参考 Video for Linux Two API Specification 这个文档。我的USB 摄像头采集的数据格式是Jpeg 图片,像素是320*240,下一步工作是将 JPEG 图片转换成 RGB 格式。对Framebuffer 进行操作便可以显示RGB 图像,即可显示摄像头采集的图像了。多祯图片连续显示便可显示连续的画面。 下面我将从后到前的顺序依次介绍这三个过程。 首先是对Framebuffer 的编程实现对RGB 图像的显示。 Framebuffer 在硬件上对应的就是手持设备的LCD,在PC 机上就是显示其了。在软件上就称为 Framebuffer 了,在Linux系统中,一个设备相当于一个文件,对文件的操作相当于对设备进行操作了,显示器对应的设备文件就是/dev/fb0。进行如下操作:le/dev ,查看设备文件,看是否有 fb0,如果有这个设备就可以进行下面的编程了。如果没有,需要修改一个文件,/boot/grub/menu.lst,在我们使用的那个系统增加如下参数,rgb = 0x317,设置为 1024*768 16 位色显示,然后重启便可以看到 fb0 了。 第一步是对fb0 的初始化,读取 fb0 相关参数并得到内存映射地址。 int init_fb (void) { //int fb; struct fb_var_screeninfo fb_var; //1.open framebuffer fb = open("/dev/fb0",O_RDWR); if (fb < 0) { printf("open /dev/fb0 error!\n"); return -1; } //2.get fb information ioctl(fb, FBIOGET_VSCREENINFO, &fb_var); w = fb_var.xres; h = fb_var.yres; bpp = fb_var.bits_per_pixel; printf("screen information: %d * %d, bpp :%d\n",w,h,bpp); //3.get framebuffer address fbmem = mmap(0, w*h*bpp/8, PROT_WRITE|PROT_READ, MAP_SHARED,fb,0); return 0; } 之前定义了全局变量, static int fb = -1; //fb0文件描述符 static int w, h, bpp; //显示器长度,宽度,每像素多少位 static short *fbmem; 这里主要有一个函数mmap(0, w*h*bpp/8, PROT_WRITE|PROT_READ, MAP_SHARED,fb,0...