大学毕业设计---基于嵌入式linux的网络视频监控系统的研究.doc

上传人:教**** 文档编号:92926287 上传时间:2023-06-16 格式:DOC 页数:25 大小:890KB
返回 下载 相关 举报
大学毕业设计---基于嵌入式linux的网络视频监控系统的研究.doc_第1页
第1页 / 共25页
大学毕业设计---基于嵌入式linux的网络视频监控系统的研究.doc_第2页
第2页 / 共25页
点击查看更多>>
资源描述

《大学毕业设计---基于嵌入式linux的网络视频监控系统的研究.doc》由会员分享,可在线阅读,更多相关《大学毕业设计---基于嵌入式linux的网络视频监控系统的研究.doc(25页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、摘要随着电子技术和多媒体及网络技术的快速发展,视频监控系统正向嵌入式,数字化,网络化方向发展。嵌入式视频监控系统利用大规模集成电路和网络的科技成果。实现体积小,性能稳定,通讯便利的监控设备。本项目提出了在ARM微处理器平台上移植嵌入式Linux操作系统,并完成视频采集、压缩、控制等任务。系统硬件设备选择采用实验室配备的ARM9微处理器S3C2410作为主处理器,利用USB接口的摄像头作为视频采集设备。为降低产品成本,在此基础上,借助Linux下的开源软件,构建了整个嵌入式视频监控系统。关键词:视频监控 嵌入式系统 ARM9 Linux V4L视频采集Abstract With the rapi

2、d development of the electronic technology, multimedia technology and network technology, video surveillance system is going to the embedded, digital, networked direction. Taking full advantage of LSI and networks of scientific and technological achievements, the embedded video surveillance system a

3、chieves delicate volume, stable performance, facilitates the communication of the surveillance equipment.The project is in arm microprocessor platform, and porting embedded linux system in it. It completes video capturing, compression, transmission and control tasks. The hard devices select the ARM9

4、 (S3C2410) as the main processor in the system; and the USB camera as the device of video capture. In order to reduce the cost of the product, Based on the architecture and with the open source software in linux, the whole embedded video surveillance system is implemented.Keywords: Video Surveillanc

5、e Embedded system ARM9 Linux video for linux 摘要11绪论41.1项目背景41.2视频监控系统的发展41.3论文的主要研究工作52视频监控系统方案设计52.1系统硬件设计方案52.2软件设计方案63软件开发环境的建立72.1嵌入式LINUX操作系统72.2建立交叉编译环境92.3 BootLoader的移植93.4 Linux内核编译与移植103.5文件系统的移植114设备驱动程序开发简介124.1 Linux的驱动程序层次结构124.2字符型设备驱动程序144.3Linux下驱动程序的实现144.4USB摄像头选择以及驱动设计155 Linux下视

6、频采集165.1视频采集模块的设计165.2 基于v4l的编程175.2.1Video4linux中主要的数据结构175.2.2视频数据的读取185.3在LCD上显示视频图像196 视频网络传输模块研究与实现206.1 TCPIP协议简介206.2基于webserver的视频网络传输模块226.3播放视频流231绪论1.1项目背景随着电子技术和多媒体技术的飞速发展,利用嵌入式设备进行数字处理传送成为可能。嵌入式设备具有体积小、功耗低、数字化、安装方便、价格低廉等优点,因此基于嵌入式的视频采集和监控成为了当前嵌入式应用开发领域的一个热门课题。相比较传统的视频采集监控系统,它具有高可靠性、组网方便

7、、可远程监控等优点,因而更适用于工业控制、银行、政府部门的安防系统中。本文通过建立一个适用于家庭安保、学校等应用场合的嵌入式网络视频监控系统,在实验室环境下针对网络视频监控系统的各项关键技术进行研究,包括嵌入式Linux技术、视频采集、视频图像网络化传输和运动目标检测等。论文工作也将为网络视频监控系统在其它领域的应用起到一定的作用。如环境与安保集中监控系统、移动监控系统等领域以及智能小区、银行、商场等场所。同时为了更好的学习Linux,熟悉Linux移植中的难点、要点。所以选择以Linux作为项目所需的操作系统。通过此项目,可以更深入的了解Linux,熟悉驱动程序的编写等。1.2视频监控系统的

8、发展随着图像(视频)处理、网络通信和微电子技术的快速发展,视频以其直观、方便和内容丰富等特点,日益受到人们的青睐。然而在很多应用领域。智能视频监控是计算机视觉领域一个新兴的应用方向和备受关注的前沿课题。伴随网络技术和数字视频技术的飞速发展,监控技术正向着数字化、智能化、网络化的方向不断前进。智能视频监控系统的需求主要来自那些对安全要求敏感的场合,如银行、停车场、无人值守的变电站等。比如通过传统的多媒体监控系统虽然也可实现变电站的无人值守,但它只能获取变电站的电气参数,并不能反映变电站运行的其它方面的情况,如防火防盗,变压器、开关等设备表面检查等。另外,对于异常入侵及各类故障缺乏足够的事后分析手

9、段,所以要实现变电站综合全面的自动化管理,就需要一个功能完备的远程智能视频监控系统。智能监控技术包括运动目标检测、跟踪、目标分类和行为理解等方面。其中,处于整个视觉系统底层的运动目标检测与跟踪是各种后续高级处理如目标分类、行为理解的基础和关键,在自动导航、机器人目标捕获等研究方向上都具有举足轻重的作用,从而更受到广泛的研究和探讨。视频监控系统大致经历了以下几个阶段,第一代模拟监控系统、第二代数字化视频监控系统、第三代网络视频监控系统三个阶段。其中,第三代视频监控系统以网络为依托,以数字视频的压缩、传输、存储和播放为核心,以智能实用的图像分析为特色,引发了视频监控行业的技术革命,受到了学术界、产

10、业界和使用部门的高度重视。1.3论文的主要研究工作论文基于中国科学技术大学软件学院研究生的工程实践项目,在深入研究了嵌入式Linux操作系统、视频数据的采集、压缩与流媒体实时传输技术的基础上,将上述三者有机结合起来设计了一套基于嵌入式Linux操作系统的网络视频监控系统。论文的研究工作主要集中在以下几个方面:(1) 系统软硬件平台的搭建;(2) Linux系统的裁剪配置以及移植;(3) USB摄像头的选择以及Linux平台上驱动程序的开发;(4) 基于Vidoo4Linux的视频采集程序的研究与实现;(5) 基于webserver的视频网络传输模块研究与实现;(6) 客户端视频接收模块的选择与

11、设计实现;2视频监控系统方案设计2.1系统硬件设计方案系统在总体布置上分为远程视频监测、现场视频采集、本地LCD显示三个部分。远程监测端运行于控制中心,它实时接收和显示图像数据,采用普通PC即可,关键要能连入以太网。现场视频采集采用ov511的网眼摄像头,处理器采用基于三星s3C2410处理器的ARM开发系统,这里我们用了博创UP-NET ARM2410-S试验箱。该试验箱提供了众多的外设接口,特别是开发平台上的10/l00M自适应网络接口和USB接口,特别适合本项目的使用环境。本系统硬件平台集成了ARM CPU、SDRAM以及FLASH,外设接口:RS-232串口 (COM1),USB HO

12、ST接口,自适应以太网接口,TFTLCD接口,一个触摸屏接口。通过RS-232接口连接到宿主机上;通过在USB接口上外接一个USB口的摄像头,将采集到的视频图像数据输入缓冲区中,在本地LCD 上显示,或是通过以太网传到远端。系统硬件平台如图2-1所示用户终端监控终端数据压缩数据传输层USB摄像头S3C2410XSRAM电源及复位电路控制台NAND Flash存储设备SDRAMJtag接口图2-1 系统硬件平台结构图2.2软件设计方案通过对嵌入式操作系统Linux体系结构的分析,结合ARM处理器及其外围设备的的特性,本系统中将软件的体系结构分为两层:内核空间和用户空间。内核空间:Linux内核以

13、及视频采集、以及相关协议栈的移植。操作系统内核的主要功能是管理任务、任务排序、提供中断、系统时钟管理以及实现硬件抽象层和视频编码内核间的通信;为了使系统具有网络传输功能,必须用到嵌入式操作系统中网络协议如TCP/IP协议。应用程序的接口由API来实现,API的实现包括二个部分:一部分API作为库来实现与应用程序间的连接,一部分在SOCKET中实现。用户空间:即应用层软件,当USB摄像头驱动加载之后,视频采集模块采集摄像头的视频数据,然后通过网络传送到远程客户端。如图2-2所示为系统的整体软件设计架构图。视频采集模块USB摄像头驱动程序Bootloader网络视频流服务模块以太网远程网络监控端图

14、2-2 软件系统架构3软件开发环境的建立基于嵌入式Linux开发环境一般由目标系统硬件开发板和装有Linux桌面版的主机平台PC组成。Linux主机上操作系统采用Redhat9.0版本。目标系统硬件开发板用来运行嵌入式Linux操作系统、用户系统应用程序等,而主机平台用来进行嵌入式操作系统内核编译,文件系统的制作和系统应用程序开发和调试等。双方通过串口、并口或者以太网口等建立连接。2.1嵌入式LINUX操作系统Linux类似于UNIX,是免费的,源代码开放的,符合POSIX标准规范的操作系统。近几年Linux在嵌入式领域获得了飞速发展,选择Linux作为嵌入式操作系统的嵌入式系统占很大比例。L

15、inux之所以有能在嵌入式系统市场上取得如此迅速的发展,与自身的优点有着不可分割的关系。Linux作为嵌入式操作系统的优势:Linux正在嵌入式开发领域稳步发展,是由于其自身具有非常适合于作为嵌入式操作系优点,主要表现在:使用成本低几乎所有的商业用操作系统如Microsoft公司的Windows系列,都需要为每一个拷贝支付数量的费用。但是Limix是免费软件,只要遵守GPL的规定,就可以免费获得拷贝。Linux同样遵循GPL规定的C、C+、Java等等一系列的软件工具开发包,同时可以极大的降低开发成本。这点优势是其他商用操作系统无法比拟的。源代码公开Linux可以随意地配置不需要任何的许可证或

16、商家的合作关系,任何人可修改并在Linux下发行。Linux带有Unix用户熟悉的完善的开发工具,几乎所有的Unix系统的应用软件都己移植到了Linux上。其强大的语言编译器gcc、g+等也是开源的,可以很容易得到,并在不断完善与成熟。支持多种硬件平台Linux拥有了一个庞大的支持者群体,其中许多人都编写驱动程序和其它的更新程序并且免费的通过Intenet网络进行分发。现在Linux已经被移植到多种硬件平台,支持包括x86、Alpha、Sparc、Mips、powerPC、ARM等现有的绝大部分微处理器体系结构中。这对受开销和时间限制的研究与开发项目是很有吸引力的,原型可以在标准平台上开发然后

17、移植到具体的硬件上,加快了软件与硬件的开发过程。强大的网络功能Linux操作系统最突出的是网络部分,基本上所有的网络协议和网络接口都可以在Linux上找到,Linux内核比标准的UNIX能够更加高效地处理网络协议,系统的网络吞吐性能非常好,这也是为什么Linux在网络服务器市场上占据越来越大市场份额的一个原因。微内核模块化体系结构Linux操作系统本身的微内核体系结构相当简单,网络和文件系统以模块形式置于微内核的上层,驱动程序和其它部件可在运行时作为可加载模块编译到或者是添加到内核,这为构造定制的可嵌入系统提供了高度模块化的构件方法,使添加部件非常容易。系统小巧一个功能完备的Linux内核要求

18、大约IMB内存。而Linux微内核只占用其中很小一部分内存,包括虚拟内存和所有核心的操作系统功能在内,只需占用系统的100K内存。2.2建立交叉编译环境交叉编译是嵌入式开发过程中的一项重要技术,主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成。采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到PC中进行。 当前交叉编译器有多种版本,本设计中使用2.95.3版的arm-linux-gcc。在网上下载该版本的交叉编译器包:arm-linux-gcc2.95.3.tar.gz,将arm-linux-gcc2.95.3.

19、tar.gz拷贝到某个目录下,然后进入该目录,执行解包命令tar zxv arm-linux-gcc2.95.3.tar.gz ,然后编辑/etc/bash.rc文件,修改环境变量。以后编译内核或其他应用程序均可用arm-linux-的前缀来指定交叉编译器。2.3 BootLoader的移植图是一个典型的嵌入式应用系统固态存储设备的空间分配示意图。Bootloader是系统一加电所执行的第一个程序,在操作系统内核或用户应用程序运行之前运行。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为最终调用操作系统内核或用户应用程序准备好正确的环境。B

20、ootloader 启动参数 内核 文件系统图2-1bootloader及系统各个部分所处的层次Bootloader是依赖于硬件而实现的,特别是在嵌入式系统中建立一个通用的Bootloader几乎是不可能的,不同的体系结构需求的Bootloader是不同的。除了体系结构,Bootloader还依赖于具体的嵌入式板级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们基于相同的CPU构建,运行在其中一块电路板上的Bootloader,未必能够运行在另一块电路开发板上,因此我们必须对其进行移植,这也是我们开发的第一步。通常都是对己有的Bootloader进行移植工作,如Vivi和UBoot等

21、。本系统中,采用VIVi作为ARMg处理器的BootLoader。VIVi是韩国的而mizi公司开发的BootLoader,适用于ARM9处理器。VIVi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动Linux内核,这时VIVi的默认模式。在下载模式下,VIVi为用户提供一个命令行接口,通过接口可以使用VIVi提供的一些命令。在VIVi代码的头文件公共目录 /include中,s3c2440.h文件定义了该处理器的一些寄存器,Platform/smdk2440.h定义了与开发板相关的资源配置参数,我们只需要修改这些文件就可以配置目标板的参数,如波

22、特率、引导参数、物理内存映射等。VIVi的嵌入式移植过程主要有以下六个步骤:(l)从mizi公司网站获得VIVi源文件,进入vivi根目录执行vi命令修改Makefile文件。(2)修改三个宏定义。LINIUXINCLUDEDIR:更改为交叉编译器的include文件夹CROSSCOMPILE:更改为交叉编译器的可执行文件的路径ARMGCCLIBS:更改为交叉编译器的lib库文件的路径(3)修改arch/s3c2440/smdk.c,主要是修改 nandflash的分区信息。(4)修改内核启动时使用的命令行初始参数。(5)#makemenucofig配置VIVi。(6)#make vivi命令

23、编译VIVi源文件。可以获得编译成功的VIVi二进制代码。 我们这里采用的是博创公司提供的已经编译好的适合于博创试验箱的vivi的二进制文件。将Vivi通过JTAG烧写在Nandflash的地址Ox00处,即完成了Vivi的编译和移植。3.4 Linux内核编译与移植在对内核移植前,需要根据系统硬件资源对Linux内核进行配置和裁剪,以便在实现功能的前提下尽量减小内核,充分利用嵌入式系统有限的资源。在宿主机Linux系统终端下,进入内核源代码的目录,输入 makemenucoonfig可以对内核进行配置,如图所示。本系统中主要需要对一下参数进行配置:处理器结构、网络功能、设备驱动、可执行文件格

24、式等。内核配置完毕后,即可通过以下命令对内核进行编译: (1)makeclean:清除之前编译生成的文件。 (2)makedep:建立内核文件之间的联系和依赖关系。 (3)makezlmage:生成最终所需要的映像文件。运行以上三个命令之后,即可在二 /arch/arm/boot目录下生成所需要的zImage映像文件。之后利用终端仿真程序minicom和Bootloader引导程序通过串口就可以把Linux内核映像移植到目标系统板的flash存储中了,这儿我们用的是tftp工具:tftp flash kernel zImage3.5文件系统的移植在嵌入式系统中,一般采用 NANDFlash作为

25、代码和数据存储器。引导程序、内核以及需要保存的数据等都要放在Flash中,而且操作系统一般都需要在存储器上建立文件系统才能对存储器进行操作,因此需要在Flash上建立文件系统以满足嵌入式操作系统和实际的需要。在Linux里,系统对独立的文件系统不是用设备标示符来存取(比如驱动器编号或驱动器名称),而是连接成为一个树型结构。Linux在安装新的文件系统时,把它安装到指定的安装目录,从而合并到这个单一的文件系统树上。Linux的一个重要特征是它支持多种不同的文件系统,文件系统将存放在系统硬盘上的文件和目录用可以理解的统一形式提供给用户,让用户不必考虑文件系统的类型或底层物理设备的特性。在嵌入式系统

26、中,常用的文件系统有RAMFS、JFFS2、CRAMFS等。CRAMFS是针对Linux2.4内核之后的版本所设计的一种新型文件系统,也是压缩和只读格式的。它主要优点是将文件数据以压缩形式存储,在需要运行的时候进行解压缩。由于它存储的文件形式是压缩的格式,所以文件系统不能直接在Flash上运行。虽然这样可以节约很多Flash存储空间,但是文件系统运行需要将大量的数据拷贝进RAM中,消耗了RAM空间。CRAMFS的移植过程如下:首先生成image:在kernel/script/cramfs有生成image程序的源代码,编译之后生成mkcramfs。建立一个目录,将需要放到文件系统的文件复制到这个

27、目录。如果目录名为/mnt,要生成的image文件名为root.cramfs,则命令语句为:./mkcramfs /mnt root.cramfs然后,让内核支持CRAMFS:在kemel目录执行命令make menuconfig配置内核需求,选中MTD(MemoryTechnologyDeviee)设备,选择直接编译到内核中去,这样就不用insmod了。选中其中的相关选项,可以根据自己的使用情况定制,多选中一些只是使启动变得慢一些,内核大一点,没有什么其他坏处。如果CRAMFS文件系统不是作为系统的根文件系统,要改mtdblock0的主设备号从31改为30,这个修改在文件kernel/inc

28、lude/linux/mtd/mtd.h中。然后重新编译内核,重新烧写内核和文件系统的映像。系统启动以后,就可以移植CRAMFS文件系统了,烧写如下:tftp flash root root.cramfs至此本系统开发环境己经建立起来。4设备驱动程序开发简介4.1 Linux的驱动程序层次结构在嵌入式系统中,操作系统是介于应用程序与硬件之间的一个系统软件,其作用是为用户提供统一的API接口。操作系统所面对的硬件设备种类非常多,不同型号不同厂家的设备又具有各自不同的特点,因此,要支持某种设备就必须提供这种设备的控制代码,然后把它加载进内核,内核才能使用该设备。从内核的角度来看,驱动程序是一个设备

29、的代表。当内核需要与某个设备交互时,就找到该设备的驱动程序,而后通过标准的接口调用驱动程序的相应函数,控制设备,而内核并不需要知道驱动程序如何工作,也不需要了解设备的细节,设备的细节由驱动程序掌握。驱动程序可以动态地加载和卸载,内核只包含必需设备的驱动程序。设备驱动程序一般需要完成以下功能:(1)对设备初始化和释放;(2)把数据从内核传送到硬件和从硬件读取数据;(3)读取应用程序传送给设备文件的数据和回送应用程序的请求数据;(4)检测和处理设备出现的错误。在Linux操作系统下有三类主要设备文件类型:块设备、字符设备和网络设备。用户进程正是通过设备文件来与硬件打交道。每个设备文件都有其文件属性

30、(cb),表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的设备号一致,否则用户进程将无法访问驱动程序。Linux的设备驱动程序可分为三个主要部分:(1) 自动配置和仞始化子程序,负责检测所要驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其他必需的条件(如中断、DMA通道)进行申请并初始化。这部分驱动程序仅在初始化时被调用一次。(2) 服务于IO请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程

31、序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,但仍具有进行此系统调用的用户程序的运行环境,因而可以在其中调用与进程运行环境相关的函数。(3) 中断服务子程序,又称为驱动程序的下半部分。在Linux操作系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统束接收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务子程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,

32、以唯一标识请求服务的设备。4.2字符型设备驱动程序在系统内部,I/O设备的存取通过设备驱动程序提供的一组固定的入口点来进行,这组入口点在驱动程序初始化时向系统进行登记,以便在系统适当的时候调用。一般来说,字符型设备驱动程序能够提供如下几个入口点:(1) open入口点:打开设备准备IO操作,对字符特别设备进行打丌操作,都会调用设备的open入口点。open子程序必须对将要进行的IO操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备的状态。函数原型:int (*open)(struct innod*,struc

33、t file* ) (2)close入口点:关闭一个设备,当最后一次使用设备结束后,调用close子程序。独占设备必须标记设备可再次使用。函数原型:int (*release)(struct innod*,struct file* )(3)read入口点:读取设备,对于有缓冲区的IO操作,一般从缓冲区罩读取设备数据。函数原型:ssize_t(*read)(struet flle*,char*,size_st,loff_t*):(4)write入口点:向设备写数据,对于有缓冲区的IO操作,一般向缓冲区里写入数据。函数原型:ssize_t(*write)(struet flle*,const ch

34、ar*,size_st,loff_t*):(5)ioctl入口点:执行读写之外的操作。函数原型:int (*ioctl)(struct inode*,struct file*,unsighed int,unsighed long)4.3Linux下驱动程序的实现Linux对一个硬件设备的驱动有两种方式:一种是直接加载到内核代码中,启动内核时就会驱动此硬件设备;另一种是以模块方式,编译生成一个.o文件。模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备

35、驱动程序,当应用程序需要它时再加载进内核空间运行。通常一个硬件的驱动程序就是指一个驱动模块。对于任何一个硬件设备,它在/dev下面存在一个对应的逻辑设备节点,即通常所说的设备文件。这个节点是通过mknod命令建立的,其中指定了主设备号和次设备号。主设备号表明了某一类设备,一般对应确定的驱动程序;次设备号一般用于区分不同属性,例如不同的使用方法,不同的位置,不同的操作。这个设备号是从/proc/devices文件中获得的,所以一般是先有驱动程序在内核中,才有设备节点在目录中。图4-1表明了驱动程序与系统之间的关系。通过模块的read writ操作Mknod通过主次设备号相连返回主设备号Insmo

36、d向系统注册Open read write操作应用程序硬件设备文件驱动模块/etc/modules.conf文件内核图4-1 驱动程序与系统的关系4.4USB摄像头选择以及驱动设计目前比较流行的摄像头是基于ov511芯片和zc301芯片的,已有很多关于zc301芯片的开发文档之类,ov511可能比较陈旧,可参考的资料不是很多,我们摄像头的选择取决于实验室配置的开发板三星s3c2410的开发板,选择网眼的ov511摄像头。摄像头属于视频设备,在Linux内核中,Video for Linux(简称V4L)是关于视频设备的驱动标准。这个标准为应用程序定义了一系列的接口函数,内核、驱动和应用程序都是

37、依靠这个标准来进行交流。本系统所使用的USB摄像头正是基于该标准来编写驱动和应用程序的。Linux内核是依据设备号来操作设备文件的,在内核中,摄像头对应的设备文件名为/dev/video0,主设备号是81,次设备号根据摄像头数目来确定,本系统中仅使用一个摄像头,所以可以通过mknod /dev/video0 C 81 0末创建节点。如下图4-2摄像头驱动的实现原理用户进程系统调用接收缓冲区|发送缓冲区文件操作接口终端服务程序摄像头图4-2 摄像头驱动的实现5 Linux下视频采集5.1视频采集模块的设计视频采集模块的任务是从USB摄像头设备中读取视频帧数据,并将获取的视频数据压缩成一定格式保存

38、。它是后边图像处理,视频监测的基础。Linux系统中的视频采集子系统Video4Linux为视频应用程序提供了一套统一的API,视频应用程序通过标准的系统调用即可操作各种不同的视频捕获设备。Video4Linux向虚拟文件系统注册视频设备文件,应用程序通过操作视频设备文件实现对视频设备的访问。在嵌入式Linux的内核定制和编译阶段,已经加入了对V4L模块以及OV511设备的支持,运行Linux下的视频图像采集程序,可以通过V4L提供的编程接口(API)从OV5n设备中获取图像帧。Linux下与Video4Linux相关设备及用途如表所示设备名称Minor range功能/dev/video0-

39、63视频捕捉接口/dev/radio64-127AM/FM音频接口/dev/vtx193-224文字电视广播/dev/vbi224-239原始VBI数据这里主要针对设备文件/dev/video进行视频捕捉方面的程序设计。将一个usb hub接到开发平台的usb host上,运行cat/proc/devices可以知道video capture device的主设备号是81,再运行ls -l/dev看到video0的次设备号是0。为摄像头建立设备号,mknod /dev/video0 c 81 0。V4L模块的视频采集接口设备为/dev/video,而USB摄像头加载后生成的设备文件为/dev/

40、v4l/video0,为了和V4L模块相协调,使用In -s/dev/v4l/video0 /dev/video0为V4L模块的默认设备video与物理设备video0建立连接。采集程序打开该接口并扫描以寻找需要的数据。5.2 基于v4l的编程5.2.1Video4linux中主要的数据结构Video4linux支持的数据结构及其用途(1) video_capability 包含设备的基本信息(设备名称、支持的最大最小分辨率、信号源信息等)包含的分量:name32 /设备名称maxwidth ,maxheight,minwidth,minheightChannels /信号源个数type /是

41、否能capture,彩色还是黑白,是否能裁剪等等。值如VID_TYPE_CAPTURE等具体实现函数如下:Int camere_get_capability(camera_device*vd)if(ioctl(vdfd,VIDIOCGCAP,&(vdcapability)0)Permr(“camer_get_cability:”):Return -1;Return 0; (2)video_picture 读 video-picnire中信息,成功后可读取图像的属性,包括视频图像的亮度、色度、对比度等。 Int camere_get_picture(camere_device*vd)if(ioe

42、tl(vdfd,VIDIOCGPICT,&(vdPicture)0)Perror(“camera _get_picture:”)Return -1;Return 0;(3) 设置video-picture中分量的值,先为分量赋新值,再调用VIDIOCGPICT。VdPicture.colour=65535;if(ioctl(vdfd,VIDIOCGPICT,&(vdpicture)0)Perror(“camere_get_pIcture:”):Return -1;(4) 初始化channel。必须先得到vdc即ability中的信息。实现过程如下:for(i=0 :I vdcapability

43、.channels: i+)Vdchanneli.channel=i:if(ioetl(vdfd,VIDIOCGCHAN,&(vdchanneli)videombuf),0,sizeof(vd-videombuf)来清零缓冲区。然后使用函数vd-map=(unsigned char*)mmap(0,vd-mbuf.size,PROT_READ|PROT_WRITE,MAPSHARED,vd-fd,ff_t offset)使设备内容映射到内存区,其中第一个参数为共享内存的起始地址,一般设为0,表示由系统分配;第二个参数为映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节丌始算起

44、;第三个参数指定共享内存的访问权限(PROT_READ(可读),PROT_WRITE(可写),PROT_EXEC(可执行);第四个参数可以是MAP_SHARED或者MAP_PRIVATE;第五个参数为设备描述符。mmap()成功调用后返回系统实际分配的起始地址。内存映射方式下真正进行视频截取的是ioctl系统调用的VIDIOCMCAPTURE命令,若函数成功调用,再用VIDIOCSYNC命令来判断图像截耿是否已经完毕,若该函数调用成功,则表明一帧图像的截取己完成,便丌始下一帧图像数据的截取,并将当前截耿的帧号按缓冲区总帧数的模加上1。5.3在LCD上显示视频图像在USB摄像头被驱动后,只需要再

45、编写一个对视频流采集的应用程序就可以了。根据嵌入式系统开发特征,先在宿主机上编写应用程序,再使用交叉编译器进行编译链接,生成在目标平台的可执行文件。宿主机与目标板通信采用打印终端的方式进行交叉调试,成功后移植到目标平台。首先打开视频设备,摄像头在系统中对应的设备文件为/dev/video0。在类初始化里面完成,其调用函数fd = open (/dev/video0, O_ RDWR); fd是设备打开后返回的文件描述符(打开错误返回一1)。以后的系统调用函数就可使用它来对设备文件进行操作了。接着,利用ioct1 ( fd, VIDIOCGCAP, & vid_caps)函数读取struct video capability中有关摄像头的信息。该函数成功返回后,这些信息从内核空间拷贝到用户程序空间vid_caps各成员分量中。用ioctl(fd, VIDIOCGPICT, & vid_tic)函数读取摄像头缓冲中voideo_picture信息,在用户空间程序中可以改变这些信息。完成以上初始化设备工作后,就可以对视频图像截取了。在LCD上的显

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com