基于嵌入式linux视频图像采集.doc
文本预览下载声明
基于嵌入式linux视频图像采集
[摘要] 本文主要介绍在linux操作系统、ARM XSBase270平台上,利用linux内核中已经植入video4linux函数库的数据结构和API函数,通过OV511摄像头实现视频采集的方案,本方案采用Qt Designer为开发环境,以效率较高的mmap(内存映射)方式截取视频;可保存单张的图片,也可保存为视频。
[关键词] 视频采集 video4linux 嵌入式linux mmap
一、引言
随着多媒体和通信技术的发展,越来越多的人希望能够直接通过屏幕,看到所要监控的信息。如:视频监控、WebCam、视频会议和可视电话,摄像机等。嵌入式系统的发展越来越集成化,功能也越来越强大。本文论述的是基于嵌入式linux系统的视频采集模块的设计与实现。由于linux对视频的支持是通过video4linux提供的。并且red hat9.0内核中已经包含了video4linux软件包,所以利用video4linux编程接口就可以在Xscale270平台实现对OV511 USB摄像头图像数据的采集;使用QT进行界面设计,同时对需要的图像进行保存。最终通过交叉编译连接,生成在ARM平台上运行的程序。作为大学生创新项目,通过相关的开发与研究,可以熟练地掌握嵌入式系统的开发流程,以及对其中涉及到的相关技术有较为深入的理解。
二、系统内核的定制
在Linux系统下对摄像头的支持是通过内核中video4linux模块的加载来实现的,而该模块的加载可以是静态加载也可以是动态加载。
1.静态加载
这种加载方式使视频支持模块嵌在新生成的内核中;虽然会使内核的尺寸变大,但系统运行可靠。其基本流程是:
(1)运行make menuconfig或make xconfig;
(2)选择Multimedia device-下的Video for linux(选为*号标示;这个选项的目的是加载video4linux模块,为视频采集设备提供了编程接口);
(3)在usb support-目录下,选择support for usb和 usb camera ov511 support(同样选为*号标示;这使在内核中加入了对OV511接口芯片的USB数字摄像头的驱动支持);
(4)保存配置并退出;
(5)make dep;make zImage
此时在/tftpboot下就生成了带有ov511驱动的内核。
2.动态加载
这种加载方式不会将视频支持模块嵌在新生成的内核中,只是告诉Linux系统在需要的时候以模块方式调用,所以生成的内核相对较小。与静态加载??比差别在于选择usb camera ov511 support时选为标示;另外,还要运行make modules编译模块,其它的步骤与静态加载相同。
三、用Video4Linux API获取视频图像
在Linux系统中将设备视为特殊文件以便于对其进行操作。要用Video4Linux API获取视频图像,首先,打开视频设备;这通过调用open函数来实现,它返回设备文件描述符,以后的系统调用函数就使用该描述符来对设备进行操作;接着,读取设备信息;这可以得到结构类型各成员域中有关摄像头的信息;然后,设置设备的属性,比如图像的亮度、对比度等等。最后,进行视频采集。有两种方法实现视频数据的获取:
1.文件读写
文件读写的方式是通过read()和write()函数对摄像头进行读写,然后分配缓冲区存放。这样每次都要调用read()对数据进行拷贝,设备的速度相对于内存的速度来说的比较慢的。
2.内存映射
在linux下,设备就是文件,文件的读写是慢速的,mmap方法可以将普通文件映射进内存,这样就可以通过访问内存的速度来访问文件。图像的信息是非常大的,采用mmap进行读取数据,会整体提高采集性能。
四、视频采集的实现
1.视频采集时一些参数的初始化
定义的函数原型为v4l_grab_init(v4l_device *vd,int width,int height)参数vd为自定义的数据结构struct _v4l_device,设置宽、高、帧使用情况的属性等。该函数的重点代码如下:
vd-mmap.width = width;
vd-mmap.height = height;
vd-mmap.format = vd-picture.palette;
vd-frame =0;
vd-framestat[0] =0;
vd-framestat[1] =0;
vd-frame为当前帧,framestat[]
显示全部