基于OV511芯片的摄像头图像采集显示系统【实验目的】1、掌握OV511摄像头和V4L视频驱动的配置方法。
2、掌握JPEG的交叉编译与移植的过程。
3、掌握帧缓冲编程原理以及利用帧缓冲显示图像的编程方法。
【实验原理】USB摄像头以其良好的性能和低廉的价格得到广泛应用。
同时因其灵活、方便的特性,易于集成到嵌入式系统中,现有的符合Video for Linux标准的驱动程序配合通用应用程序,可以实现USB摄像头视频数据的采集及应用开发。
摄像头属于视频类设备。
在目前的Linux核心中,视频部分的标准是Video for Linux(简称V4L)。
这个标准其实定义了一套接口,内核、驱动、应用程序以这个接口为标准进行交流。
目前的V4L涵盖了视、音频流捕捉及处理等内容,USB摄像头也属于它支持的范畴。
1、Video4Linux和USB摄像头驱动配置如果需要在Linux操作系统中使用USB摄像头进行视频数据采集,则必须在进行内核配置时,应检查Linux 内核中是否已经添加了对Video4Linux驱动和对USB摄像头驱动模块的支持。
本实验采用静态加载驱动。
首先切换linux源代码所在的目录,并终端输入make menuconfig,系统弹出基于Ncurses 内核配置图形界面(如图1所示),便可进行内核选项的配置。
图1内核配置主界面1.1、配置界面的使用方法(1)、在菜单方式的配置界面上可用上下方向键来在各菜单之间移动;(2)、在标有"---->" 标志的地方按回车键进入下级菜单;(3)、按两次<ESC>或选择<Exit>则返回到上级菜单;(4)、按“h” 键或选择下面的<Help>则可看到配置帮助信息;(5)、按<Tab> 键则在各控制选项之间移动;(6)、Y表示包含该功能选项配置在内核中,M表示以模块的方式编译到内核中,N表示该功能选项不进行编译;(7)、设置状态在[ ] 或< > 中以“ * “(选择), “ M “ (模块), 空格(除外)来表示。
1.2、Video4Linux驱动配置对Video4Linux支持驱动进行配置,选中多媒体设备选项“Multimedia device->”(如图1-1所示)按回车,进入多媒体设备配置界面(如图2所示),在多媒体配置界面中,选中“Video For Linux”,加载video4linux模块,就可以使内核实现对Video4Linux驱动的支持,为视频采集设备提供编程接口。
图2 内核配置-多媒体设备配置界面1.3、USB驱动配置配置好内核对Video4Linux驱动后,返回内核配置主界面,选中USB支持选项(如图3 所示)“USB support—>”按回车,进入USB支持配置界面。
图3 内核配置主界面-USB支持在USB支持配置界面中,选中“USB Multimedia device”选项下的“USB OV511 Camera support”,使内核中加入OV511接口芯片的USB数字摄像头的驱动支持。
(如图4 所示)。
图4 OV511 USB 摄像头驱动配置界面2、JPEG的交叉编译与移植本实验为了节省有限的存储空间,将数据帧转为JPEG格式存储,为了支持对实验过程中生成的JPEG格式图片的各种操作,例如将JPEG格式的图片转为BMP格式图片显示时,需要JPEG的交叉编译与移植。
在移植前,需要找到libjpeg,可以在以下网址下载:/source/libjpeg/libjpeg-6b.tar.gz。
jpeg的交叉编译与移植的过程如下:tar -zxvf libjpeg-6b.tar.gzcd libjpeg-6b./configure --enable-shared --enable-static --prefix=/usr/local/arm/3.4.5/arm-linux --build=i386 --host=arm然后修改生成的Makefilegedit Makefilecc =gcc 改为CC=arm-linux-gccAR=ar rc 改为AR=arm-linux-ar rcAR2=ranlib 改为AR2=arm-linux-rablibmakemake install-lib然后在当前的目录下ls –acd .libsls会出现图5所示的结果,这就是需要移植到目标板上面的文件。
图5把libjpeg.a、、libjpeg.so、libjpeg.so.62、libjpeg.so.62.0.0拷到目标板的/lib目录下,把cjpeg、djpeg拷到目标板的/bin目录下就完成了jpeg的交叉编译与移植。
3、帧缓冲编程原理以及利用帧缓冲显示图像在PC上面仿真的时候需要开启并使用帧缓冲设备。
3.1、帧缓冲编程原理帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。
这种操作是抽象的,统一的。
用户不必关心物理显存的位置、换页机制等等具体细节。
这些都是由Framebuffer设备驱动来完成的。
Linux FrameBuffer 本质上只是提供了对图形设备的硬件抽象,在开发者看来,FrameBuffer 是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。
所以说FrameBuffer就是一块白板。
例如对于初始化为16 位色的FrameBuffer 来说,FrameBuffer中的两个字节代表屏幕上一个点,从上到下,从左至右,屏幕位置与内存地址是顺序的线性关系。
帧缓存可以在系统存储器(内存)的任意位置,视频控制器通过访问帧缓存来刷新屏幕。
帧缓存也叫刷新缓存Frame buffer 或refresh buffer, 这里的帧(frame)是指整个屏幕范围。
帧缓存有个地址,是在内存里。
我们通过不停的向frame buffer中写入数据,显示控制器就自动的从frame buffer中取数据并显示出来。
全部的图形都共享内存中同一个帧缓存。
CPU指定显示控制器工作,则显示控制器根据CPU的控制到指定的地方去取数据和指令,目前的数据一般是从显存里取,如果显存里存不下,则从内存里取,内存也放不下,则从硬盘里取,当然也不是内存放不下,而是为了节省内存的话,可以放在硬盘里,然后通过指令控制显示控制器去取。
帧缓存Frame Buffer,里面存储的东西是一帧一帧的,显卡会不停的刷新Frame Buffer, 这每一帧如果不捕获的话,则会被丢弃,也就是说是实时的。
这每一帧不管是保存在内存还是显存里,都是一个显性的信息,这每一帧假设是800x600的分辨率,则保存的是800x600个像素点和颜色值。
显示器可以显示无限种颜色,目前普通电脑的显卡可以显示32位真彩、24位真彩、16位增强色、256色。
除256色外,大家可以根据自己的需要在显卡的允许范围之内随意选择。
很多用户有一种错误概念,认为256色是最高级的选项,而实际上正好相反。
256色是最低级的选项,它已不能满足彩色图像的显示需要。
16位不是16种颜色,而是2的16次平方(256×256)种颜色,但256色就是256(2的8次平方)种颜色。
所以16位色要比256色丰富得多。
帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32 个,分别为/dev/fb0到/dev/fb31,而/dev/fb则为当前缺省的帧缓冲设备,通常指向/dev/fb0。
当然在嵌入式系统中支持一个显示设备就够了。
帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31。
分别对应/dev/fb0-/dev/fb31。
通过/dev/fb,应用程序的操作主要有这几种:(1)读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。
例如用cp /dev/fb0 tmp命令可将当前屏幕的内容拷贝到一个文件中,而命令cp tmp > /dev/fb0 则将图形文件tmp显示在屏幕上。
(2)映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。
为此,Linux在文件操作file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。
对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。
实际上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。
由于映射操作都是由内核来完成,下面我们将看到,帧缓冲驱动留给开发人员的工作并不多。
(3)I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。
ioctl的操作是由底层的驱动程序来完成的。
在本实验中,使用内存映射(mmap)将帧缓冲设备中的屏幕缓冲区映射到进程中的一段虚拟地址空间,接着,通过读写该虚拟地址来访问屏幕缓冲区,实现在屏幕上绘图或者保存屏幕上的绘图信息等操作。
3.2、帧缓冲设备的开启(1)只需要将/etc/grub.conf改成如下形式就行了(加粗那一行中的vga=0x314是修改过的): # grub.conf generated by anaconda# Note that you do not have to rerun grub after making changes to this file# NOTICE: You do not have a /boot partition. This means that# all kernel and initrd paths are relative to /, eg.# root (hd0,0)# kernel /boot/vmlinuz-version ro root=/dev/sda1# initrd /boot/initrd-version.img#boot=/dev/sdadefault=0timeout=10splashimage=(hd0,0)/boot/grub/splash.xpm.gztitle Red Hat Linux (2.4.18-14)root (hd0,0)kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ hdc=ide-scsi vga=0x314其中(2)设置完成后,重启系统,会发现启动过程中出现一个企鹅的图标,说明修改成功,已经启动帧缓冲设备。