基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx

上传人:b****4 文档编号:24273554 上传时间:2023-05-25 格式:DOCX 页数:34 大小:194.19KB
下载 相关 举报
基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx_第1页
第1页 / 共34页
基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx_第2页
第2页 / 共34页
基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx_第3页
第3页 / 共34页
基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx_第4页
第4页 / 共34页
基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx

《基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx》由会员分享,可在线阅读,更多相关《基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx(34页珍藏版)》请在冰豆网上搜索。

基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.docx

基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文

摘要

随着电子技术和多媒体及网络技术的快速发展,视频监控系统正向嵌入式,数字化,网络化方向发展。

嵌入式视频监控系统利用大规模集成电路和网络的科技成果。

实现体积小,性能稳定,通讯便利的监控设备。

本项目提出了在ARM微处理器平台上移植嵌入式Linux操作系统,并完成视频采集、压缩、控制等任务。

系统硬件设备选择采用实验室配备的ARM9微处理器S3C2410作为主处理器,利用USB接口的摄像头作为视频采集设备。

为降低产品成本,在此基础上,借助Linux下的开源软件,构建了整个嵌入式视频监控系统。

关键词:

视频监控嵌入式系统ARM9LinuxV4L视频采集

 

Abstract

Withtherapiddevelopmentoftheelectronictechnology,multimediatechnologyandnetworktechnology,videosurveillancesystemisgoingtotheembedded,digital,networkeddirection.TakingfulladvantageofLSIandnetworksofscientificandtechnologicalachievements,theembeddedvideosurveillancesystemachievesdelicatevolume,stableperformance,facilitatesthecommunicationofthesurveillanceequipment.

Theprojectisinarmmicroprocessorplatform,andportingembeddedlinuxsysteminit.Itcompletesvideocapturing,compression,transmissionandcontroltasks.TheharddevicesselecttheARM9(S3C2410)asthemainprocessorinthesystem;andtheUSBcameraasthedeviceofvideocapture.Inordertoreducethecostoftheproduct,Basedonthearchitectureandwiththeopensourcesoftwareinlinux,thewholeembeddedvideosurveillancesystemisimplemented.

Keywords:

VideoSurveillanceEmbeddedsystemARM9Linuxvideoforlinux

摘要1

1绪论4

1.1项目背景4

1.2视频监控系统的发展4

1.3论文的主要研究工作5

2视频监控系统方案设计5

2.1系统硬件设计方案5

2.2软件设计方案6

3软件开发环境的建立7

2.1嵌入式LINUX操作系统7

2.2建立交叉编译环境9

2.3BootLoader的移植9

3.4Linux内核编译与移植10

3.5文件系统的移植11

4设备驱动程序开发简介12

4.1Linux的驱动程序层次结构12

4.2字符型设备驱动程序14

4.3Linux下驱动程序的实现14

4.4USB摄像头选择以及驱动设计15

5Linux下视频采集16

5.1视频采集模块的设计16

5.2基于v4l的编程17

5.2.1Video4linux中主要的数据结构17

5.2.2视频数据的读取18

5.3在LCD上显示视频图像19

6视频网络传输模块研究与实现20

6.1TCP/IP协议简介20

6.2基于webserver的视频网络传输模块22

6.3播放视频流23

1绪论

1.1项目背景

随着电子技术和多媒体技术的飞速发展,利用嵌入式设备进行数字处理传送成为可能。

嵌入式设备具有体积小、功耗低、数字化、安装方便、价格低廉等优点,因此基于嵌入式的视频采集和监控成为了当前嵌入式应用开发领域的一个热门课题。

相比较传统的视频采集监控系统,它具有高可靠性、组网方便、可远程监控等优点,因而更适用于工业控制、银行、政府部门的安防系统中。

本文通过建立一个适用于家庭安保、学校等应用场合的嵌入式网络视频监控系统,在实验室环境下针对网络视频监控系统的各项关键技术进行研究,包括嵌入式Linux技术、视频采集、视频图像网络化传输和运动目标检测等。

论文工作也将为网络视频监控系统在其它领域的应用起到一定的作用。

如环境与安保集中监控系统、移动监控系统等领域以及智能小区、银行、商场等场所。

同时为了更好的学习Linux,熟悉Linux移植中的难点、要点。

所以选择以Linux作为项目所需的操作系统。

通过此项目,可以更深入的了解Linux,熟悉驱动程序的编写等。

1.2视频监控系统的发展

随着图像(视频)处理、网络通信和微电子技术的快速发展,视频以其直观、方便和内容丰富等特点,日益受到人们的青睐。

然而在很多应用领域。

智能视频监控是计算机视觉领域一个新兴的应用方向和备受关注的前沿课题。

伴随网络技术和数字视频技术的飞速发展,监控技术正向着数字化、智能化、网络化的方向不断前进。

智能视频监控系统的需求主要来自那些对安全要求敏感的场合,如银行、停车场、无人值守的变电站等。

比如通过传统的多媒体监控系统虽然也可实现变电站的无人值守,但它只能获取变电站的电气参数,并不能反映变电站运行的其它方面的情况,如防火防盗,变压器、开关等设备表面检查等。

另外,对于异常入侵及各类故障缺乏足够的事后分析手段,所以要实现变电站综合全面的自动化管理,就需要一个功能完备的远程智能视频监控系统。

智能监控技术包括运动目标检测、跟踪、目标分类和行为理解等方面。

其中,处于整个视觉系统底层的运动目标检测与跟踪是各种后续高级处理如目标分类、行为理解的基础和关键,在自动导航、机器人目标捕获等研究方向上都具有举足轻重的作用,从而更受到广泛的研究和探讨。

视频监控系统大致经历了以下几个阶段,第一代模拟监控系统、第二代数字化视频监控系统、第三代网络视频监控系统三个阶段。

其中,第三代视频监控系统以网络为依托,以数字视频的压缩、传输、存储和播放为核心,以智能实用的图像分析为特色,引发了视频监控行业的技术革命,受到了学术界、产业界和使用部门的高度重视。

1.3论文的主要研究工作

论文基于中国科学技术大学软件学院研究生的工程实践项目,在深入研究了嵌入式Linux操作系统、视频数据的采集、压缩与流媒体实时传输技术的基础上,将上述三者有机结合起来设计了一套基于嵌入式Linux操作系统的网络视频监控系统。

论文的研究工作主要集中在以下几个方面:

(1)系统软硬件平台的搭建;

(2)Linux系统的裁剪配置以及移植;

(3)USB摄像头的选择以及Linux平台上驱动程序的开发;

(4)基于Vidoo4Linux的视频采集程序的研究与实现;

(5)基于webserver的视频网络传输模块研究与实现;

(6)客户端视频接收模块的选择与设计实现;

2视频监控系统方案设计

2.1系统硬件设计方案

系统在总体布置上分为远程视频监测、现场视频采集、本地LCD显示三个部分。

远程监测端运行于控制中心,它实时接收和显示图像数据,采用普通PC即可,关键要能连入以太网。

现场视频采集采用ov511的网眼摄像头,处理器采用基于三星s3C2410处理器的ARM开发系统,这里我们用了博创UP-NETARM2410-S试验箱。

该试验箱提供了众多的外设接口,特别是开发平台上的10/l00M自适应网络接口和USB接口,特别适合本项目的使用环境。

本系统硬件平台集成了ARMCPU、SDRAM以及FLASH,外设接口:

RS-232串口(COM1),USBHOST接口,自适应以太网接口,TFTLCD接口,一个触摸屏接口。

通过RS-232接口连接到宿主机上;通过在USB接口上外接一个USB口的摄像头,将采集到的视频图像数据输入缓冲区中,在本地LCD上显示,或是通过以太网传到远端。

系统硬件平台如图2-1所示

图2-1系统硬件平台结构图

2.2软件设计方案

通过对嵌入式操作系统Linux体系结构的分析,结合ARM处理器及其外围设备的的特性,本系统中将软件的体系结构分为两层:

内核空间和用户空间。

内核空间:

Linux内核以及视频采集、以及相关协议栈的移植。

操作系统内核的主要功能是管理任务、任务排序、提供中断、系统时钟管理以及实现硬件抽象层和视频编码内核间的通信;为了使系统具有网络传输功能,必须用到嵌入式操作系统中网络协议如TCP/IP协议。

应用程序的接口由API来实现,API的实现包括二个部分:

一部分API作为库来实现与应用程序间的连接,一部分在SOCKET中实现。

用户空间:

即应用层软件,当USB摄像头驱动加载之后,视频采集模块采集摄像头的视频数据,然后通过网络传送到远程客户端。

如图2-2所示为系统的整体软件设计架构图。

图2-2软件系统架构

3软件开发环境的建立

基于嵌入式Linux开发环境一般由目标系统硬件开发板和装有Linux桌面版的主机平台PC组成。

Linux主机上操作系统采用Redhat9.0版本。

目标系统硬件开发板用来运行嵌入式Linux操作系统、用户系统应用程序等,而主机平台用来进行嵌入式操作系统内核编译,文件系统的制作和系统应用程序开发和调试等。

双方通过串口、并口或者以太网口等建立连接。

2.1嵌入式LINUX操作系统

Linux类似于UNIX,是免费的,源代码开放的,符合POSIX标准规范的操作系统。

近几年Linux在嵌入式领域获得了飞速发展,选择Linux作为嵌入式操作系统的嵌入式系统占很大比例。

Linux之所以有能在嵌入式系统市场上取得如此迅速的发展,与自身的优点有着不可分割的关系。

Linux作为嵌入式操作系统的优势:

Linux正在嵌入式开发领域稳步发展,是由于其自身具有非常适合于作为嵌入式操作系优点,主要表现在:

使用成本低

几乎所有的商业用操作系统如Microsoft公司的Windows系列,都需要为每一个拷贝支付数量的费用。

但是Limix是免费软件,只要遵守GPL的规定,就可以免费获得拷贝。

Linux同样遵循GPL规定的C、C++、Java等等一系列的软件工具开发包,同时可以极大的降低开发成本。

这点优势是其他商用操作系统无法比拟的。

源代码公开

Linux可以随意地配置不需要任何的许可证或商家的合作关系,任何人可修改并在Linux下发行。

Linux带有Unix用户熟悉的完善的开发工具,几乎所有的Unix系统的应用软件都己移植到了Linux上。

其强大的语言编译器gcc、g++等也是开源的,可以很容易得到,并在不断完善与成熟。

支持多种硬件平台

Linux拥有了一个庞大的支持者群体,其中许多人都编写驱动程序和其它的更新程序并且免费的通过Intenet网络进行分发。

现在Linux已经被移植到多种硬件平台,支持包括x86、Alpha、Sparc、Mips、powerPC、ARM等现有的绝大部分微处理器体系结构中。

这对受开销和时间限制的研究与开发项目是很有吸引力的,原型可以在标准平台上开发然后移植到具体的硬件上,加快了软件与硬件的开发过程。

强大的网络功能

Linux操作系统最突出的是网络部分,基本上所有的网络协议和网络接口都可以在Linux上找到,Linux内核比标准的UNIX能够更加高效地处理网络协议,系统的网络吞吐性能非常好,这也是为什么Linux在网络服务器市场上占据越来越大市场份额的一个原因。

微内核模块化体系结构

Linux操作系统本身的微内核体系结构相当简单,网络和文件系统以模块形式置于微内核的上层,驱动程序和其它部件可在运行时作为可加载模块编译到或者是添加到内核,这为构造定制的可嵌入系统提供了高度模块化的构件方法,使添加部件非常容易。

系统小巧

一个功能完备的Linux内核要求大约IMB内存。

而Linux微内核只占用其中很小一部分内存,包括虚拟内存和所有核心的操作系统功能在内,只需占用系统的100K内存。

2.2建立交叉编译环境

交叉编译是嵌入式开发过程中的一项重要技术,主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成。

采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到PC中进行。

当前交叉编译器有多种版本,本设计中使用2.95.3版的arm-linux-gcc。

在网上下载该版本的交叉编译器包:

arm-linux-gcc2.95.3.tar.gz,,将arm-linux-gcc2.95.3.tar.gz拷贝到某个目录下,然后进入该目录,执行解包命令tarzxvarm-linux-gcc2.95.3.tar.gz,然后编辑/etc/bash.rc文件,修改环境变量。

以后编译内核或其他应用程序均可用arm-linux-的前缀来指定交叉编译器。

2.3BootLoader的移植

图是一个典型的嵌入式应用系统固态存储设备的空间分配示意图。

Bootloader是系统一加电所执行的第一个程序,在操作系统内核或用户应用程序运行之前运行。

通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为最终调用操作系统内核或用户应用程序准备好正确的环境。

图2-1bootloader及系统各个部分所处的层次

Bootloader是依赖于硬件而实现的,特别是在嵌入式系统中建立一个通用的Bootloader几乎是不可能的,不同的体系结构需求的Bootloader是不同的。

除了体系结构,Bootloader还依赖于具体的嵌入式板级设备的配置。

也就是说,对于两块不同的嵌入式板而言,即使它们基于相同的CPU构建,运行在其中一块电路板上的Bootloader,未必能够运行在另一块电路开发板上,因此我们必须对其进行移植,这也是我们开发的第一步。

通常都是对己有的Bootloader进行移植工作,如Vivi和UBoot等。

本系统中,采用VIVi作为ARMg处理器的BootLoader。

VIVi是韩国的而mizi公司开发的BootLoader,适用于ARM9处理器。

VIVi有两种工作模式:

启动加载模式和下载模式。

启动加载模式可以在一段时间后(这个时间可更改)自行启动Linux内核,这时VIVi的默认模式。

在下载模式下,VIVi为用户提供一个命令行接口,通过接口可以使用VIVi提供的一些命令。

在VIVi代码的头文件公共目录/include中,s3c2440.h文件定义了该处理器的一些寄存器,Platform/smdk2440.h定义了与开发板相关的资源配置参数,我们只需要修改这些文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。

VIVi的嵌入式移植过程主要有以下六个步骤:

(l)从mizi公司网站获得VIVi源文件,进入vivi根目录执行vi命令修改Makefile文件。

(2)修改三个宏定义。

LINIUXINCLUDEDIR:

更改为交叉编译器的include文件夹

CROSSCOMPILE:

更改为交叉编译器的可执行文件的路径

ARMGCCLIBS:

更改为交叉编译器的lib库文件的路径

(3)修改arch/s3c2440/smdk.c,主要是修改nandflash的分区信息。

(4)修改内核启动时使用的命令行初始参数。

(5)#makemenucofig配置VIVi。

(6)#makevivi命令编译VIVi源文件。

可以获得编译成功的VIVi二进制代码。

我们这里采用的是博创公司提供的已经编译好的适合于博创试验箱的vivi的二进制文件。

将Vivi通过JTAG烧写在Nandflash的地址Ox00处,即完成了Vivi的编译和移植。

3.4Linux内核编译与移植

在对内核移植前,需要根据系统硬件资源对Linux内核进行配置和裁剪,以便在实现功能的前提下尽量减小内核,充分利用嵌入式系统有限的资源。

在宿主机Linux系统终端下,进入内核源代码的目录,输入makemenucoonfig可以对内核进行配置,如图所示。

本系统中主要需要对一下参数进行配置:

处理器结构、网络功能、设备驱动、可执行文件格式等。

内核配置完毕后,即可通过以下命令对内核进行编译:

(1)makeclean:

清除之前编译生成的文件。

(2)makedep:

建立内核文件之间的联系和依赖关系。

(3)makezlmage:

生成最终所需要的映像文件。

运行以上三个命令之后,即可在二/arch/arm/boot目录下生成所需要的zImage映像文件。

之后利用终端仿真程序minicom和Bootloader引导程序通过串口就可以把Linux内核映像移植到目标系统板的flash存储中了,这儿我们用的是tftp工具:

tftpflashkernelzImage

3.5文件系统的移植

在嵌入式系统中,一般采用NANDFlash作为代码和数据存储器。

引导程序、内核以及需要保存的数据等都要放在Flash中,而且操作系统一般都需要在存储器上建立文件系统才能对存储器进行操作,因此需要在Flash上建立文件系统以满足嵌入式操作系统和实际的需要。

在Linux里,系统对独立的文件系统不是用设备标示符来存取(比如驱动器编号或驱动器名称),而是连接成为一个树型结构。

Linux在安装新的文件系统时,把它安装到指定的安装目录,从而合并到这个单一的文件系统树上。

Linux的一个重要特征是它支持多种不同的文件系统,文件系统将存放在系统硬盘上的文件和目录用可以理解的统一形式提供给用户,让用户不必考虑文件系统的类型或底层物理设备的特性。

在嵌入式系统中,常用的文件系统有RAMFS、JFFS2、CRAMFS等。

CRAMFS是针对Linux2.4内核之后的版本所设计的一种新型文件系统,也是压缩和只读格式的。

它主要优点是将文件数据以压缩形式存储,在需要运行的时候进行解压缩。

由于它存储的文件形式是压缩的格式,所以文件系统不能直接在Flash上运行。

虽然这样可以节约很多Flash存储空间,但是文件系统运行需要将大量的数据拷贝进RAM中,消耗了RAM空间。

CRAMFS的移植过程如下:

首先生成image:

在kernel/script/cramfs有生成image程序的源代码,编译之后生成mkcramfs。

建立一个目录,将需要放到文件系统的文件复制到这个目录。

如果目录名为/mnt,要生成的image文件名为root.cramfs,则命令语句为:

./mkcramfs/mntroot.cramfs

然后,让内核支持CRAMFS:

在kemel目录执行命令makemenuconfig配置内核需求,选中MTD(MemoryTechnologyDeviee)设备,选择直接编译到内核中去,这样就不用insmod了。

选中其中的相关选项,可以根据自己的使用情况定制,多选中一些只是使启动变得慢一些,内核大一点,没有什么其他坏处。

如果CRAMFS文件系统不是作为系统的根文件系统,要改mtdblock0的主设备号从31改为30,这个修改在文件kernel/include/linux/mtd/mtd.h中。

然后重新编译内核,重新烧写内核和文件系统的映像。

系统启动以后,就可以移植CRAMFS文件系统了,烧写如下:

tftpflashrootroot.cramfs

至此本系统开发环境己经建立起来。

4设备驱动程序开发简介

4.1Linux的驱动程序层次结构

在嵌入式系统中,操作系统是介于应用程序与硬件之间的一个系统软件,其作用是为用户提供统一的API接口。

操作系统所面对的硬件设备种类非常多,不同型号不同厂家的设备又具有各自不同的特点,因此,要支持某种设备就必须提供这种设备的控制代码,然后把它加载进内核,内核才能使用该设备。

从内核的角度来看,驱动程序是一个设备的代表。

当内核需要与某个设备交互时,就找到该设备的驱动程序,而后通过标准的接口调用驱动程序的相应函数,控制设备,而内核并不需要知道驱动程序如何工作,也不需要了解设备的细节,设备的细节由驱动程序掌握。

驱动程序可以动态地加载和卸载,内核只包含必需设备的驱动程序。

设备驱动程序一般需要完成以下功能:

(1)对设备初始化和释放;

(2)把数据从内核传送到硬件和从硬件读取数据;

(3)读取应用程序传送给设备文件的数据和回送应用程序的请求数据;

(4)检测和处理设备出现的错误。

在Linux操作系统下有三类主要设备文件类型:

块设备、字符设备和网络设备。

用户进程正是通过设备文件来与硬件打交道。

每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备。

另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的不同硬件设备。

设备文件的主设备号必须与设备驱动程序在登记时申请的设备号一致,否则用户进程将无法访问驱动程序。

Linux的设备驱动程序可分为三个主要部分:

(1)自动配置和仞始化子程序,负责检测所要驱动的硬件设备是否存在和能否正常工作。

如果该设备正常,则对这个设备及其他必需的条件(如中断、DMA通道)进行申请并初始化。

这部分驱动程序仅在初始化时被调用一次。

(2)服务于I/O请求的子程序,又称为驱动程序的上半部分。

调用这部分程序是由于系统调用的结果。

这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,但仍具有进行此系统调用的用户程序的运行环境,因而可以在其中调用与进程运行环境相关的函数。

(3)中断服务子程序,又称为驱动程序的下半部分。

在Linux操作系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统束接收硬件中断,再由系统调用中断服务子程序。

中断可以在任何一个进程运行时产生,因而在中断服务子程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。

因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备。

4.2字符型设备驱动程序

在系统内部,I/O设备的存取通过设备驱动程序提供的一组固定的入口点来进行,这组入口点在驱动程序初始化时向系统进行登记,以便在系统适当的时候调用。

一般来说,字符型设备驱动程序能够提供如下几个入口点:

(1)open入口点:

打开设备准备I/O操作,对字符特别设备进行打丌操作,都会调用设备的open入口点。

open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。

如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备的状态。

函数原型:

int(*open)(structinnod*,structfile*)

(2)close入口点:

关闭一个设备,当最后一次使用设备结束后,调用close子程序。

独占设备必须标记设备可再次使用。

函数原型:

int(*release)(structinnod*,structfile*)

(3)read入口点:

读取设备,对于有缓冲区的I/O操作,一般从缓冲区罩读取设备数据。

函数原型:

ssi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1