1、目录第一章绪论11.1研究背景11.2无线视频监控应用开发意义1第二章嵌入式无线视频监控系统总体方案设计22.1总体框架设计22.2系统硬件构成32.3系统应用软件设计52.4本章小结6第三章嵌入式Linux操作系统及开发环境的建立63.1嵌入式Linux操作系统63.2交叉开发环境的建立73. 2. 1 GNU开发工具集83.2.2建立宿主机交叉开发环境93.3基于嵌入式Linux的上层软件开发模式103. 3. 1应用程序的开发103.3.2应用程序的调试10第四章视频数据采集与处理114.1嵌入式Linux下的视频采集模块软件设计114. 1. 1 USB摄像头驱动程序加载124. 1.
2、 2基于V4L模块的程序开发134.2图像识别报警模块软件设计164. 2. 1基本结构与算法原理174.2.2基于边缘的背景去除算法的原理与实现184. 2. 3语音采集与报警的实现204.3图像数据压缩模块软件设计224.3.1 MPEG-4压缩理论与实现224.4本章小结27第五章网络视频传输模块软件设计275.1流媒体传输控制协议栈275.2 RTP/RTCP协议分析与实现295. 2. 1 R丁P协议分析295. 2. 2 RTCP协议分析305. 2.3 RTP/RTCP协议的软件设计与实现315.3基于RTP/RTCP的MPEG一4传输技术355. 3. 1 RTP有效载荷的确定
3、355. 3. 2 VOP的封装算法365.4 RTSP服务器建立375. 4. 1 R丁SP协议概述375. 4. 2 RTSP的消息385. 4. 3 SDP会话描述协议385. 4. 4 RTSP的方法395.4.5监控系统中R下SP服务器的设计与实现405.5本章小结44第六章 总结与展望446.1论文总结446.2研究展望44参考文献4547 第一章绪论1.1研究背景现在每个人都生活在嵌入式产品的世界里,在手表、手机、照相机、汽车,甚至运动鞋里都有嵌入式系统的身影。嵌入式系统小到一个芯片,大到一个标准的PC板,种类繁多,形式各异。事实上,嵌入式设备在数量上远远超过了各种通用计算机。P
4、C的各种输入输出和外部设备均是由嵌入式处理器控制的,每台PC的外部设备中包含了5 J10个嵌入式微处理器,而一些高档汽车中则包含了30到50个甚至更多的嵌入式微处理器,在工业流水线控制、通讯、仪器仪表、船舶、航空航天、军事装备等领域更是嵌入式计算机的天下。嵌入式系统的发展离不开通信和网络等技术的支持,嵌入式设备的联网成为必然趋势。面向21世纪的嵌入式系统要求配备标准的一种或多种网络通信接口,如IEEE1394,USB, CAN, IrDA或Bluetooth, GPRS等无线网络接口,同时也需要提供相应的通信组网协议软件和物理层驱动软件,在这样的趋势下,嵌入式Internet (Embedde
5、d Internet )技术应运而生。嵌入式Internet是指设备通过嵌入式模块而非PC接入Internet,以Internet为介质实现信息交互的技术。例如,工业远程监测系统是利用Internet技术和总线控制技术实现远程数据采集、分析并实时监控设备运行,从而降低成本,提高效率;手持智能设备通过GPRS等无线接入方式和Internet相连,代替PC在Internet进行个人数据传输、处理和存储,如收发邮件,下载资料,即时聊天等;远程视频监控系统是利用Internet以及视频压缩等技术将实时视频数据传到监控中心,其应用范围极为广泛。嵌入式Internet带来的不仅是传输方式的改变,更重要的是
6、拓宽了传统设备信息交流的范围。通过Internet,任何地点,任何时间,任何两个设备的信息交换都将成为可能,从而真正步入了“信息化”社会。1.2无线视频监控应用开发意义研究表明,人类通过视觉所获取的信息约占到其获取的总信息量的70%,视觉信息具有直观、可靠等一系列优越性。近年来,随着计算机、网络及通信技术的迅猛发展,整个世界对网络视频方面的投入逐年加大,相关应用也越来越广泛,形成了具有巨大发展潜力的市场,日益受到人们的重视和关注。视频监控系统的发展基本上是从早期的模拟闭路电视监控系统向数模结合的视频监控系统和现在的数字视频监控系统演变的过程。其中,利用网络实现视频监控已成为一种趋势,传统的模拟
7、视频监控技术正在逐步向数字化、网络化、智能化、无线化发展。可以说,视频监控进入了全数字化的网络时代。模拟视频监控系统中的信息流为模拟的视频信号,系统的网络结构主要是一种单功能、单向的信息采集网络,因此系统尽管已发展到很高的水平,己无太多潜力可挖,其局限性依然存在。模拟监控系统的主要缺点有:(1)通常只适合于小范围的区域监控。模拟视频信号的传输工具主要是同轴电缆,而同轴电缆传输模拟视频信号的距离不大于1 Km,双绞线的距离更短,这就决定了模拟监控只适合于单个大楼、小的居民区以及其它小范围的场所;(2)系统的扩展能力差。对于已经建好的系统,如要增加新的监控点,工程繁琐复杂,新的设备也很难添加到原有
8、的系统之中;(3)无法形成有效的报警联动,由于各部分独立运作,相互之间的控制协议很难互通,联动只能在有限的范围内进行。数字视频监控系统将系统中信息流(包括视频、音频、控制等)从模拟状态转为数字状态,根本上改变视频监控系统从信息采集、数据处理、传输、系统控制等的方式和结构形式。信息流的数字化、编码压缩、开放式的协议,使视频监控系统与安防系统中其它各子系统间实现无缝连接,并在统一的操作平台上实现管理和控制。在国内外市场上,主要推出的是数字控制的模拟视频监控和数字网络视频监控两类产品。前者技术发展已经非常成熟、性能稳定,并在实际工程应用中得到广泛应用;后者是新近崛起的以计算机技术及图像视频压缩为核心
9、的新型视频监控系统,该系统解决了模拟系统部分弊端而迅速崛起,但仍需进一步完善和发展。嵌入式方式的视频监控系统主要是以嵌入式视频服务器方式提供视频监控。其具有布控区域广阔、几乎无限的无缝扩展能力、易于组成非常复杂的监控网络、性能稳定可靠等特点,必将成为今后视频监控领域的主流产品。本文的工作就是开发一套基于ARM处理器和USB摄.像头的嵌入式无线网络视频监控系统。本文所设计的嵌入式无线视频监控系统顺应视频监控系统的发展趋势,结合先进的视频压缩技术和网络传输协议,并将近几年来,逐渐成熟的无线通讯技术运用到视频监控中,具有一定的理论和实践价值。需要指出的是,由于现在的GPRS网络稳定性和覆盖范围的局限
10、,这里考察的这类无线监控系统还没有真正得到商业上的大规模应用。但是,相信随着无线网络的建设,特别是第三代移动通信网络的建设和成熟,此系统在不远的将来一定会得到广泛的应用。 第二章嵌入式无线视频监控系统总体方案设计嵌入式无线视频监控系统涉及通信技术和视频压缩技术等多方面要点,良好的总体方案设计是系统开发成功的关键,本章提出系统设计的总体方案,分别从硬件方案和软件方案两个方面介绍。2.1总体框架设计视频监控系统的一般过程是:在一些重要的场所安放一个或若干个摄像机拍摄监控现场,然后将视频信号通过一定的传输介质传到指定的监控中心实时播放,或是再通过存储设备,将媒体存储到存储介质上,同时还可以根据不同需
11、要和途径在现场安装其它的探测装置作为监控系统的辅助设备,如温湿度传感器、声音报警装置等。根据视频监控系统的特点构建系统总体框架如下:图2. 1监控系统总体框架设计整个无线视频监控系统由嵌入式微处理器系统和被控对象组成,嵌入式微处理器系统是整个系统的核心,由硬件层、中间层、软件层和功能层组成。其中软件层完成监控系统的视频图像,音频数据的采集压缩,识别报警等功能,并为构建流媒体服务器实现网络通信协议;被控对象则是USB摄像头、GPRS无线网络连接模块,声音接收器和其他监测传感器等,它们接收嵌入式微处理器系统发出的控制命令,执行所规定的操作或任务。2.2系统硬件构成整个嵌入式无线视频监控系统主要由嵌
12、入式微处理器、外围硬件设备、嵌入式操作系统以及应用软件等几部分组成。嵌入式微处理器方面,RISC技术推动着计算机体系结构从封闭的CISC向开放的结构发展。全球各大CPU芯片制造厂商争相开发生产RISC芯片,目前的典型结构为ARM系列、MIPS和SHI。一般的嵌入式实时操作系统都支持上述R.ISC微处理器。ARM公司是一家IP供应商,其核心业务是IP核以及相关工具的开发和设计。ARM公司的IP核也由ARM7 ARM9发展到今天的ARM 11版本。 一般而言计算机体系架构设计主要由以下几部分组成:指令集设计,CPU核的设计,流水线技术,存储器层次结构设计,I/O系统设计。RISC思想的提出从简化指
13、令集的角度降低了微处理器的开发难度和成本,同时提高微处理器的并行度。ARM微处理器特点:体积小、低功耗、低成本、高性能;支持Thumb (16位)/ARM (32位)双指令集,能很好地兼容8/16位器件;大量使用寄存器,指令执行速度更快;大多数数据操作都在寄存器中完成;寻址方式灵活简单,执行效率高;指令长度固定。ARM体系的设计是基于RISC思想的,其代码密度性能介于其他多数RISC微处理器和CISC微处理器之间。后来引入的Thumb指令集则大大提高了代码密度。ARM主要使用32位的RISC指令,但是指令代码利用率低,ARM为了弥补此不足,在新型ARM构架(V4T版本以上)定义了16位的Thu
14、mb指令集。另外,为了加速通信和多媒体中有关数字信号的处理,ARM微处理器在RISC的基础上增加了DSP核中的关键部件,双核协同工作。 由于ARM架构的微处理器主要用于嵌入式系统,因此ARM构架在设计中十分注意低电压、低功耗处理,设计中采用了以下一些措施:降低电源电压;减少门的翻转次数,当某个功能电路不需要时,禁止门翻转;减少门的数目,即降低芯片的集成度;降低时钟频率。ARM的低功耗,使得ARM在专门针对嵌入式系统的微处理器市场中始终处于有利的地位。ARM还其他采用了一些特别的技术,在保证高性能的前提下尽量缩小芯片的面积。目前广泛应用的ARM微处理器有ARM7系列、ARM9系列、ARM9E系列
15、、ARM 1 QE系列、SecurCore系列和Intel StrongARM, Xscale系列。鉴于ARM微处理器的众多技术和市场优势,本系统硬件设计中,选用了一款带有ARM处理器的嵌入式评估板,如图2.2所示。该硬件平台采用Intel Xscale结构的PXA255嵌入式微处理器。硬件平台上的重要部件有晶振(时钟)电路,复位电路,键盘、LED等人机交互接口,JTAG接口电路,存储系统采用了64MB的nand Flash和32MB的SDRAM。为方便接入LAN网络,设计了RTL8019网络芯片接口电路s。本系统的GPRS应用设计采用的方式是将GPRS模块独立设计,与嵌入式硬件平台通过DAR
16、T接口经电平转换后的RS232接口相连。这种模块化的结构设计,可以降低硬件调试难度,同时也是基于硬件平台的可重用性考虑。图2. 2监控系统硬件结构图2.3系统应用软件设计系统的软件设计基于嵌入式Linux操作系统平台,系统软件结构模块如图2.3所示,整个系统根据功能分为4个独立的模块,各功能模块功能说明如下:图2. 3应用软件功能模块(1)视频音频采集模块。该模块用于完成对视频音频信号的采集,将USB摄像头和声音接收器采集到的信号以文件的形式保存或者放入缓冲区供其它模块使用。(2)图像识别报警模块。该模块对采集得到的图像信息做识别处理,发现异常时则以彩信或声音的形式报警。(3)图像压缩模块。该
17、模块用于完成对图像数据的压缩处理,读取由视频采集模块产生的缓冲区数据,对其进行压缩处理后再以文件的形式保存或者将压缩数据放入缓冲区供其它模块使用。(4)网络传输模块。该模块用于完成对视频数据的网络传输,读取由缓冲区里的视频数据,并将其打成RTP包,然后将其做成流式文件格式,通过内置的流媒体服务器传输到网络上。监控系统直接将数字视频信号采集编码,无需计算机的协助即可独立进行工作,并通过GPRS无线接入模块与Internet进行连接。系统内置网络视频服务器,用户通过各类GPRS智能终端以及标准的流媒体播放程序就可以根据IP地址对视频采集设备进行访问,观看通过无线GPRS网络传输的实时图像。同时监控
18、系统具备智能图像识别功能,对定点场景的异常情况进行彩信,声音等形式的报警。 整个系统具有如下的特点:(1)设备硬件核心采用基于Xscale系列的PXA255嵌入式芯片,系统软件使用嵌入式Linux系统,使得系统本身具有强大的处理功能,方便功能的扩展;(2)视频采集采用具有USB接口的通用外置摄像头进行,使视频采集的通用性更好,软硬件设计容易,成本更低;(3)软件部分采用模块化设计,各模块均可作为独立的子系统存在,增强的系统通用性、可升级性和可维护性;(4)图像识别报警功能采用基于边缘检测的背景去除算法,对异常情况识别准确率高;(5)采用先进MPEG-4视频压缩方式,适合无线网络传输的需要;(6
19、)联网方便,安装简易,充分利用GPRS永远在线等优点。2.4本章小结本章首先描述了嵌入式视频监控系统的总体设计框架,硬件开发平台的主要构成,并阐述了基于该硬件平台的依据和优势。然后设计了基于嵌入式Linux操作系统的应用软件框架,并指出了系统具备的特点。 第三章嵌入式Linux操作系统及开发环境的建立采用Linux的嵌入式系统设计者可以利用开源代码的易得性、POSIX兼容性、坚实的可靠性以及大量的应用程序,而且没有许可费用。所有这些好处,再加上价格优势,使得Linux成为嵌入式操作系统的一个出色的解决方案。3.1嵌入式Linux操作系统嵌入式系统是以应用为中心,以计算机理论为基础,软件硬件可裁
20、剪,适应系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统6。一般的嵌入式系统具有以下特征:系统内核小;专用性强;系统可裁剪以及实时操作系统(RTOS)的需求。嵌入式操作系统EOS ( Embedded Operating System)是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括硬、软件系统)重要的组成部分,包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面的特点。目前广泛应用的EOS产品包括VxWorks, WinCE,
21、VRTX, PaImOS, pSOS, Nucleus,Lynx , QNX等,这些RTOS都是商用的嵌入式操作系统,它们在系统可靠性和对用户的技术支持上都有优势。但是缺点是价格昂贵,核心源代码不公开,可移植性差,难以实现嵌入式系统要以最小的软硬件系统,最低的成本去完成目标功能这一特点。Linux系统与UNIX系统兼容,开放源代码。它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式设备。由于Linux使用GPL(GNU General Public License),所以任何对将Linux定制于PDA或者其他移动设备的人都可以从Internet上免费下载其
22、内核和应用程序,并开始移植或开发。许多Linux改良品种迎合了嵌入式/实时市场。它们包括 RTLinux(实时Linux ),uClinux(用于非MMU设备的Linux), Montavista Linux(用于ARM, MIPS, PPC的Linux分发版)、ARM-Linux ( ARM上的Linux和其它Linux系统。Linux用于嵌入式领域的优势具体表现如下:(1) Linux内核精简,各部分的功能明确,可扩展性强,容易剪裁。(2)免费,可以极大幅度地降低产品成本,在价格上面拥有优势,只要不违反GPL协议,就可以自由发布和使用软件。(3)代码开放,可以免费获得,有利于后来者学习,缩
23、短开发过程。(4) Linux符合IEEE POSIX编程标准,有非常好的可移植性和稳定的性能。(5)支持TCP/IP协议,有强大的网络功能。(6)丰富的开发工具和大量的文档。Linux提供C C+十,Java以及其他很多的开发工具,这些工具可以被免费地使用。当然,嵌入式Linux也存在其不足之处。在实时领域内,其实时性存在不足。Linux是一个分时系统,虽然实现了软实时性,在很多的情况下还是无法满足满足实时的需求。对于一些实时性要求强的环境需要改进。对于具体的应用还需要开发具体的启动程序、设备驱动程序和上层应用程序。这些程序是不具备通用性的,需要专门开发。表3. 1嵌入式Linux与商业RT
24、OS比较3.2交叉开发环境的建立Linux软件开发以native方式进行的,即本机开发、调试,本机运行的方式。这种方式通常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机运行开发工具和调试设备。嵌入式系统的软件开发采用交叉编译调试的方式,如图3.1.图3. 1基于宿主机和目标板的交又开发环境交叉编译调试环境建立在宿主机上,开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码,然后把可执行文件下载到目标机上运行。GNU所倡导的自由软件除了Linux操作系统外,GNU的软件还包括编译器(gcc, g+十)、二进制转换工具(objdump, objcopy)
25、、调试工具(gdb, gdbserver, kgdb)和基于不同硬件平台的开发库。3. 2. 1 GNU开发工具集交叉编译环境的建立最重要的就是要有一个交叉编译器。本系统开发用到的编译器是-linux-gcc,它是gcc的改版。编译器的生成依赖于相应的函数库。配置一个gcc的交叉编译器一般包含如下几个步骤:(1)取得binutils, gcc, glibc的源码;(2)配置并编译binutils,得到下一步要用到的汇编器和连接器;(3)配置并编译gcc源代码,生成gcc编译器;(4)配置glibc编译生成glibc的C函数库;(5)再次配置并编译gcc源代码,生成其它语言的编译器如:c+等。也
26、可从网上直接下载相关的工具链(toolchain ) o arm-linux-toolchain包括一系列的开发调试工具17。工具集如表3.2所示。表3. 2 GNU工具集其中主要组件包括:(1) arm-linux-gcc: ARM交叉编译器,可以以交叉编译的形式开发目标应用程序,即在宿主机上开发编译可在目标上运行的二进制文件。arm-linux-gcc的使用方法同标准gcc基本一样,可以参考GUN的gcc文档。(2)辅助工具。包括-linux-obj dump(可以反编译二进制文件),arm-linux-as(汇编编译器),arm-linux-ld(连接器)。(3) arm-linux-g
27、db(交叉调试器),可使用多种交叉调试方式,gdb-bdm(背景调试工具),gdbserver(使用以太网络调试)o ARM-Linux的打印终端通常情况下是串口,内核在启动时所有的信息都打印到串口终端(使用printf函数打印),同时也可以通过串口终端与系统交互。3.2.2建立宿主机交叉开发环境在进行应用程序开发之前,要在宿主机上建立和配置好开发应用程序所需要的开发环境。(1)安装RedHat Linux9.0。需要选择定制(custom)安装,并且在定制时选择NFS(网络文件系统)和dialup workstation(拨号工作站);配置网络时,主机IP要与开发板的IP在同一子网内。(2)
28、安装工具链,即把toolchain压缩包解压到相应的目录下,默认的路径是/usr/local下,把-linux工具链目录加入到环境变量PATH中,可实现-linux-gcc编译器直接调用。(3)安装ARM-Linux操作系统,即把ARM-Li压缩包解压到相应目录下,采用下列命令安装kernel.tgz到根目录下。 tar zxvf kernel.tgz -C/(4)配置NFS ( Network File System )。配置NFS的目的是让目标板通过网络映像宿主机硬盘,从而使宿主机的硬盘成为目标板的一个虚拟硬盘,这时你宿主机硬盘上的文件映射为目标板上某一目录中的文件。(5)配置minico
29、m( minicom作为目标板的显示终端,以监控目标板上程序的运行)。运行minicom-s进行配置,选择Serial port setup项,设置如下参数: Serial Device: /dev/ttySO Bps/ParBits: 115200 8N 1 Hardware Flow Control: no Software Flow Control: no3.3基于嵌入式Linux的上层软件开发模式3. 3. 1应用程序的开发本系统在软件模块开发时采用了以下两种嵌入式Linux应用程序开发模式:1.先在宿主机(Intel CPU)上调试通过后,再移植到PXA255评估板上。这种HOST方
30、式下有gdb调试工具可用。移植的工作要解决一个函数库的问题。由于嵌入式Linux开发平台提供的工ibc库同标准的libc库有一些不同,在程序移植时可能会有函数未定义的问题。对于这种问题,就需要编制这些要用到却又未定义的函数。同时也需要改动Makefile以适应目标板。2.利用NFS直接在目标板上开发将宿主机和目标板通过串口相连,在宿主PC机上运行minicom作为目标板的显示终端,利用NFS在目标板端mount上宿主机硬盘,这样就可直接在目标板上调试宿主机硬盘中交叉编译好的应用程序。下面给出这种直接开发模式下的开发流程:(1)用串口和网线将宿主机和目标板连接起来。要求宿主机安装了NFS(2)在
31、宿主机上编写应用程序,并进行交叉编译,生成可执行的文件。交叉编译可以用命令行的方式,如果有多个源文件,则可以通过编写Makefile来进行编译;(3)将编译好的文件放到开启NFS服务的目录下(4)在宿主机上启动minicom作为目标板的仿真终端(5) mount映射宿主机硬盘根目录/到板子的/mnt目录下,例如:mount 192. 168.0. 2:/mnt(6)在minicom下即可运行映射目录下的可执行文件调试信息通过串口打印在宿主机的minicom屏幕上或记录在syslog文件中,这样便可进行应用程序的调试。假如程序运行不对,可方便切换到宿主机去编辑、编译,只要不重启开发板就不必再作任
32、何操作,因为mount的宿主机硬盘上的应用程序会自动覆盖更新,再重新执行的就是更改后的新版本。这样反复调试、更改、编译再调试,而不必反复烧写开发板,直至程序工作正常,再将最终定版的映象文件烧写到开发板上。3.3.2应用程序的调试直接在目标板上调试应用程序采用以下三种方法:(1)打印串口。这是嵌入式系统中最常用的调试手段,虽然简单但却有效实用。其实几种方法相比之下,最有效便捷的方法还是printf,尤其配合mount进行应用程序的调试。(2)使用log记录文件。例如,使用syslog将应用程序运行过程中的中间信息全部v录在/var/log/syslog下。(3) gdb调试。首先需要在板子上移植
33、gdbserver,才支持通过以太网或串口远程调试。下面介绍以太网调试步骤: 先在目标板端启动gdbserver cd /bin gdbserver 192.168.0.2:7070 test这里test为用户应用程序可执行文件名且已烧制在板子/bin目录下,7070为TCP端口号,宿主机通过这个端口与板子建立调试通道。端口号可任意选取,一般大于20000然后在宿主机侧键入下列命令: cd /home/test arm-linux-gdb test.gdb 则进入gdb提示符: (gdb) target remote 192.168.0.230:7070该命令与板子建立TCP连接以进行调试,下
34、一步进行调试时不要运行run,而应该用continue,即c。要实现gdb(或ddd)的源代码级调试,必须在编译应用程序时打开一g参数。采用该选项进行编译,FLAT格式的可执行文件大小没有变化,只是.gdb文件变大,这样在gdb和ddd环境中就可以看到源代码。3.5本章小结 本章首先介绍了嵌入式Linux的发展与特点,给出了交叉开发环境的建立方法,然后详细分析了内核的引导和启动过程以及内核移植、文件系统移植和Bootloader设计等嵌入式系统开发所涉及的重要环节,最后介绍了基于嵌入式Linux的上层软件开发模式。 第四章视频数据采集与处理视频数据的采集是监控系统实现的第一步,也是图像识别和视
35、频压缩的基础。本监控系统由多个子系统构成,在系统功能模块划分的基础上设计一个良好的应用程序结构和一系列符合视频数据特点的数据结构,并借助Linux多线程的程序设计方法和多种系统调用完成功能模块的软件设计是本章工作的重点。4.1嵌入式Linux下的视频采集模块软件设计本系统运行的平台是基于Xscale的嵌入式Linux系统。系统在启动后,启用了MMU,系统进入保护模式,所以应用程序就不能直接读写外设的v0区域(包括v0端口和vo内存),这时一般就要借助于该外设的驱动来进入内核完成这个工作。所以系统中的视频采集分为两步实现:一是为USB接口的数码摄像头在内核中写入驱动,二是编写上层应用程序获取视频
36、数据。4. 1. 1 USB摄像头驱动程序加载系统使用的是USB接口的外置数码摄像头,USB设备和嵌入式硬件开发平台构成了一个USB通信系统。Linux USB主机驱动由三部分组成13。主机控制器驱动程序 ( HCD ) , USB驱动(USBD)、设备端驱动程序(Slave Device Driver),相互关系如图4.1所示。图4. 1 Linux USB驱动程序结构HCD是USB主机驱动程序中直接与硬件交互的软件模块;USBD部分是整个USB主机驱动的核心,提供USB总线管理,带宽管理等;USB设备端驱动是最终与应用程序交互的软件模块,向应用程序屏蔽了硬件实现了的细节,使得应用程序可以像
37、操作普通文件一样来操作外部设备,即可以使用和操作文件中相同的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和I/O控制操作。为应用程序提供访问接口。对于 USB摄像头来说,其核心是感光芯片和数据处理DSP芯片。其中DSP芯片是影响摄像头视频采集速度以及相关性能的主要因素。本系统选用的是中星微zc301,用它将摄取的数字视频图像直接通过USB接口送入开发板进行处理。这款芯片的特点是内含数字摄像IC接口,DRAM接口、实时图像压缩引擎、USB接口、FIFO等功能,通过采用影像光源自动增益补强技术,自动亮度、白平衡控制技术,色饱和度、对比度、边缘增强以及伽马矫正等先进的影像控制技术,搭配
38、COMS感光芯片使各项技术指标都能与CCD芯片相媲美,因此,完全可以满足后面系统图像识别报警处理以及实时监控的需要。在Linux下,对驱动程序的编译添加一般有两种方式14。可以静态编译进内核,再运行新的内核来测试;也可以编译成模块在运行时加载。第一种方法效率较低,但在某些场合是唯一的方法。模块方式调试效率很高,它使用insmod工具将编译的模块直接插入内核,如果出现故障,可以使用od从内核中卸载模块。不需要重新启动内核。但嵌入式系统是针对具体应用的,所以本系统将linux下的zc301驱动程序通过menuconfig配置以及内核重编译将设备驱动程序以静态的方法编译进内核,再将带有zc301驱动
39、的内核,将其烧写到开发板上即可使用。USB模块的视频数据流如图4.2所示。图4. 2 USB模块的视频数据传输4. 1. 2基于V4L模块的程序开发Linux下的Video for Linux,简称V4L为市场现在常见的电视采集卡和并口及USB口的摄像头提供统一的编程接口【s。同时也提供无线电通信、文字电视广播解码和垂直消隐的数据接口。现在己经有了Video for Linux Two驱动,即V4L2,它解决了V4L中存在的一些问题,并提高了硬件性能。但是,目前V4L2仍然没有集成到Linux的内核中,因此,本系统的视频采集开发仍然是基于V4L的。Linux下与V4L相关的设备文件与其用途如表
40、4.1所示。表4. 1 V4L的设备文件与用途USB摄像头在Linux中和打印机,鼠标一样,属于字符设备。其主设备号是810在嵌入式平台上使用USB摄像头时,先用mknod命令创建一个设备结点/dev/video0再用In命令建立该结点与/dev/v41/video0的连接。访问时,用open()打开设备/dev/video0即可。利用V4L对USB摄像头的编程需要Li下两个系统调用,分别是ioctl()调用和mmap()调用。ioctl ( input/output control ) o ioctl系统调用的功能是通过打开的文件描述符对各种文件尤其是字符设备文件进行控制,完成特定的I/O操
41、作。V4L支持的ioctl命令大概有二十几个16,在应用中主要用的是下面几个命令:表4. 2 V4L的主要控制命令mmap调用的功能是实现内存映射,即将指定文件或对象的一部分映射到内存中去。这样可以通过访问特定的内存区域来直接对文件或对象进行存取。与:ead和write。调用相比,这种I/O方式效率更高。mmap调用同样适用于设备文件,即可以用mmap调用将设备文件映射到内存中去,对设备文件的读写就转化为对内存的读写。对持续采集大量图像数据的摄像头来说,用mmap的内存映射方式来传送数据,更能体现效率。mmap调用的格式是:void* mmap(void* start,size t lengt
42、h,int prot,int flags,int fd,off t offset);参数fd是被映射到内存文件的描述符;start指向欲对应的内存起始地址;length为映射到内存的文件大小;offset为目标文件中被映射部分起始点距文件开头的偏移量;mmap调用成功后,其返回值就是指向内存映射区域的指针,该内存区域的大小就是由length参数指定的字节长度,接着应用程序就可以对该区域进行存取操作。V4L视频程序设计时必须声明两个头文件sys/types.h和linux/videodev.h,然后,遵循V4L给出video device数据结构的定义:typedef struct v41 in
43、put int fd; struct video- capability capability;/*设备的基本信息*/ struct video_picture picture;/*设备采集的图象的各种属性*/ struct video- mmap mmap;/*用于设置ap*/ struct video一 mbuf mbuf;/*利用ap进行映射的帧的信息*/ unsigned char *map;/*存放返回地址*/ char device256; int width; int height; struct frame * f; pthreadwe tthread; int cur fra
44、me; int framestat2;/*双缓冲*/ video_ device;主要用到的采集操作函数定义如下: int v41_ open(char *name video device *vd);/*打开设备文件*/ int v41_ close(video_device *vd);/*关闭设备文件*/ int v41-get capability(video一evice *vd); /*取得设备文件的相关信息*/ int v41-get_pictwe(video_ device *vd); /*取得输入到摄像头的影像信息*/ int v41_ setalette(v4ldevice *
45、vd, int palette)/*设置采集图片格式*/ int v41_grab_ init(v41_ device *vd, int width, int height);/*采集初始化*/ int v41-grab frame(video一evice *vd, int frame); /*将影像放到mmap()映射的内存*/ int v41-grab_ sync(v41_ device *vd); /*同步,等待一帧影像采集的完成*/ int v41_ mmap(v41一evice *vd); /*内存映射*/ int v41-get mbuf(v41_ device *vd); /*得
46、到用于内存映射的缓冲区信息*/ unsigned char *v41_get address(v41_ device *vd)/*将采集数据的起始地址以指针返回*/图4. 2 V4L视频采集流程图下面给出几个主要函数的实现:(1)v41_ open()函数 #define DEFAULT DEVICE /dev/video0int v41_ open(char *named video一 device *vd)if (!dev) dev=DEFAULTse DEVICE; if (vd-fd=open(dev O- RDWR)fd里。(2 ) v41-get一 capability()函数 int v41et capability(video device *vd)if (ioctl(vd-fd VIDIOCGCAP, &(vd-capability)0) return一1;else return 0;