收藏 分享(赏)

基于嵌入式Linux的网络视频监控系统的研究.doc

上传人:精品资料 文档编号:11033019 上传时间:2020-02-02 格式:DOC 页数:24 大小:884KB
下载 相关 举报
基于嵌入式Linux的网络视频监控系统的研究.doc_第1页
第1页 / 共24页
基于嵌入式Linux的网络视频监控系统的研究.doc_第2页
第2页 / 共24页
基于嵌入式Linux的网络视频监控系统的研究.doc_第3页
第3页 / 共24页
基于嵌入式Linux的网络视频监控系统的研究.doc_第4页
第4页 / 共24页
基于嵌入式Linux的网络视频监控系统的研究.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

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

2、With the rapid 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 surveill

3、ance system achieves 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 se

4、lect the ARM9 (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: Vide

5、o Surveillance Embedded system ARM9 Linux video for linux 3摘要 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 字符型

6、设备驱动程序 144.3Linux 下驱动程序的实现 144.4USB 摄像头选择以及驱动设计 155 Linux 下视频采集 165.1 视频采集模块的设计 165.2 基于 v4l 的编程 .175.2.1Video4linux 中主要的数据结构 .175.2.2 视频数据的读取 .185.3 在 LCD 上显示视频图像 196 视频网络传输模块研究与实现 206.1 TCPIP 协议简介 206.2 基于 webserver 的视频网络传输模块 .226.3 播放视频流 2341 绪论1.1 项目背景随着电子技术和多媒体技术的飞速发展,利用嵌入式设备进行数字处理传送成为可能。嵌入式设备具

7、有体积小、功耗低、数字化、安装方便、价格低廉等优点,因此基于嵌入式的视频采集和监控成为了当前嵌入式应用开发领域的一个热门课题。相比较传统的视频采集监控系统,它具有高可靠性、组网方便、可远程监控等优点,因而更适用于工业控制、银行、政府部门的安防系统中。本文通过建立一个适用于家庭安保、学校等应用场合的嵌入式网络视频监控系统,在实验室环境下针对网络视频监控系统的各项关键技术进行研究,包括嵌入式 Linux 技术、视频采集、视频图像网络化传输和运动目标检测等。论文工作也将为网络视频监控系统在其它领域的应用起到一定的作用。如环境与安保集中监控系统、移动监控系统等领域以及智能小区、银行、商场等场所。同时为

8、了更好的学习 Linux,熟悉 Linux 移植中的难点、要点。所以选择以 Linux 作为项目所需的操作系统。通过此项目,可以更深入的了解 Linux,熟悉驱动程序的编写等。1.2 视频监控系统的发展随着图像(视频)处理、网络通信和微电子技术的快速发展,视频以其直观、方便和内容丰富等特点,日益受到人们的青睐。然而在很多应用领域。智能视频监控是计算机视觉领域一个新兴的应用方向和备受关注的前沿课题。伴随网络技术和数字视频技术的飞速发展,监控技术正向着数字化、智能化、网络化的方向不断前进。智能视频监控系统的需求主要来自那些对安全要求敏感的场合,如银行、停车场、无人值守的变电站等。比如通过传统的多媒

9、体监控系统虽然也可实现变电站的无人值守,但它只能获取变电站的电气参数,并不能反映变电站运行的其它方面的情况,如防火防盗,变压器、开关等设备表面检查等。另外,对于异常入侵及各类故障缺乏足够的事后分析手段,所以要实现变电站综合全面的自动化管理,就需要一个功能完备的远程智能视频监控系统。智能监控技术包括运动目标检测、跟踪、目标分类和行为理解等方面。其中,处于整5个视觉系统底层的运动目标检测与跟踪是各种后续高级处理如目标分类、行为理解的基础和关键,在自动导航、机器人目标捕获等研究方向上都具有举足轻重的作用,从而更受到广泛的研究和探讨。视频监控系统大致经历了以下几个阶段,第一代模拟监控系统、第二代数字化

10、视频监控系统、第三代网络视频监控系统三个阶段。其中,第三代视频监控系统以网络为依托,以数字视频的压缩、传输、存储和播放为核心,以智能实用的图像分析为特色,引发了视频监控行业的技术革命,受到了学术界、产业界和使用部门的高度重视。1.3 论文的主要研究工作论文基于中国科学技术大学软件学院研究生的工程实践项目,在深入研究了嵌入式Linux 操作系统、视频数据的采集、压缩与流媒体实时传输技术的基础上,将上述三者有机结合起来设计了一套基于嵌入式 Linux 操作系统的网络视频监控系统。论文的研究工作主要集中在以下几个方面:(1) 系统软硬件平台的搭建;(2) Linux 系统的裁剪配置以及移植;(3)

11、USB 摄像头的选择以及 Linux 平台上驱动程序的开发 ;(4) 基于 Vidoo4Linux 的视频采集程序的研究与实现;(5) 基于 webserver 的视频网络传输模块研究与实现;(6) 客户端视频接收模块的选择与设计实现;2 视频监控系统方案设计2.1 系统硬件设计方案系统在总体布置上分为远程视频监测、现场视频采集、本地 LCD 显示三个部分。远程监测端运行于控制中心,它实时接收和显示图像数据,采用普通 PC 即可,关键要能连入以太网。现场视频采集采用 ov511 的网眼摄像头,处理器采用基于三星 s3C2410 处理器的ARM 开发系统 ,这里我们用了博创 UP-NET ARM

12、2410-S 试验箱。该试验箱提供了众多的外6设接口,特别是开发平台上的 10/l00M 自适应网络接口和 USB 接口,特别适合本项目的使用环境。本系统硬件平台集成了 ARM CPU、SDRAM 以及 FLASH,外设接口:RS-232 串口 (COM1),USB HOST 接口,自适应以太网接口,TFTLCD 接口,一个触摸屏接口。通过 RS-232 接口连接到宿主机上;通过在 USB 接口上外接一个 USB 口的摄像头,将采集到的视频图像数据输入缓冲区中,在本地 LCD 上显示,或是通过以太网传到远端。系统硬件平台如图 2-1 所示用户终端监控终端数据压缩数据传输层USB摄像头S3C24

13、10XSRAM电源及复位电路控制台NAND Flash存储设备SDRAMJtag接口图 2-1 系统硬件平台结构图2.2 软件设计方案通过对嵌入式操作系统 Linux 体系结构的分析,结合 ARM 处理器及其外围设备的的特性,本系统中将软件的体系结构分为两层:内核空间和用户空间。内核空间:Linux 内核以及视频采集、以及相关协议栈的移植。操作系统内核的主要功能是管理任务、任务排序、提供中断、系统时钟管理以及实现硬件抽象层和视频编码内核间的通信;为了使系统具有网络传输功能,必须用到嵌入式操作系统中网络协议如 TCP/IP 协议。应用程序的接口由 API来实现,API 的实现包括二个部分: 一部

14、分 API 作为库来实现与应用程序间的连接,一部分在 SOCKET 中实现。7用户空间:即应用层软件,当 USB 摄像头驱动加载之后,视频采集模块采集摄像头的视频数据,然后通过网络传送到远程客户端。如图 2-2 所示为系统的整体软件设计架构图。视频采集模块USB 摄像头驱动程序Bootloader网络视频流服务模块以太网远程网络监控端图 2-2 软件系统架构3 软件开发环境的建立基于嵌入式 Linux 开发环境一般由目标系统硬件开发板和装有 Linux 桌面版的主机平台 PC 组成。 Linux 主机上操作系统采用 Redhat9.0 版本。目标系统硬件开发板用来运行嵌入式 Linux 操作系

15、统、用户系统应用程序等,而主机平台用来进行嵌入式操作系统内核编译,文件系统的制作和系统应用程序开发和调试等。双方通过串口、并口或者以太网口等建立连接。2.1 嵌入式 LINUX 操作系统Linux 类似于 UNIX,是免费的,源代码开放的,符合 POSIX 标准规范的操作系统。近几年 Linux 在嵌入式领域获得了飞速发展,选择 Linux 作为嵌入式操作系统的嵌入式系8统占很大比例。Linux 之所以有能在嵌入式系统市场上取得如此迅速的发展,与自身的优点有着不可分割的关系。Linux 作为嵌入式操作系统的优势:Linux 正在嵌入式开发领域稳步发展,是由于其自身具有非常适合于作为嵌入式操作系

16、优点,主要表现在:使用成本低几乎所有的商业用操作系统如 Microsoft 公司的 Windows 系列,都需要为每一个拷贝支付数量的费用。但是 Limix 是免费软件,只要遵守 GPL 的规定,就可以免费获得拷贝。Linux 同样遵循 GPL 规定的 C、C+、Java 等等一系列的软件工具开发包,同时可以极大的降低开发成本。这点优势是其他商用操作系统无法比拟的。源代码公开Linux 可以随意地配置不需要任何的许可证或商家的合作关系,任何人可修改并在Linux 下发行。Linux 带有 Unix 用户熟悉的完善的开发工具,几乎所有的 Unix 系统的应用软件都己移植到了 Linux 上。其强

17、大的语言编译器 gcc、 g+等也是开源的,可以很容易得到,并在不断完善与成熟。支持多种硬件平台Linux 拥有了一个庞大的支持者群体,其中许多人都编写驱动程序和其它的更新程序并且免费的通过 Intenet 网络进行分发。现在 Linux 已经被移植到多种硬件平台,支持包括x86、Alpha、Sparc、Mips、powerPC 、ARM 等现有的绝大部分微处理器体系结构中。这对受开销和时间限制的研究与开发项目是很有吸引力的,原型可以在标准平台上开发然后移植到具体的硬件上,加快了软件与硬件的开发过程。强大的网络功能Linux 操作系统最突出的是网络部分,基本上所有的网络协议和网络接口都可以在L

18、inux 上找到,Linux 内核比标准的 UNIX 能够更加高效地处理网络协议,系统的网络吞吐性能非常好,这也是为什么 Linux 在网络服务器市场上占据越来越大市场份额的一个原因。微内核模块化体系结构Linux 操作系统本身的微内核体系结构相当简单,网络和文件系统以模块形式置于微内核的上层,驱动程序和其它部件可在运行时作为可加载模块编译到或者是添加到内核,这为构造定制的可嵌入系统提供了高度模块化的构件方法,使添加部件非常容易。9系统小巧一个功能完备的 Linux 内核要求大约 IMB 内存。而 Linux 微内核只占用其中很小一部分内存,包括虚拟内存和所有核心的操作系统功能在内,只需占用系

19、统的 100K 内存。2.2 建立交叉编译环境交叉编译是嵌入式开发过程中的一项重要技术,主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成。采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到 PC 中进行。当前交叉编译器有多种版本,本设计中使用 2.95.3 版的 arm-linux-gcc。在网上下载该版本的交叉编译器包:arm-linux-gcc2.95.3.tar.gz, ,将 arm-linux-gcc2.95.3.tar.gz 拷贝到某个目录下,然后进入该目录,执行解包命令 tar zxv arm-lin

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

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

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

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

24、 VIVi。(6)#make vivi 命令编译 VIVi 源文件。可以获得编译成功的 VIVi 二进制代码。 我们这里采用的是博创公司提供的已经编译好的适合于博创试验箱的 vivi 的二进制文件。将 Vivi 通过 JTAG 烧写在 Nandflash 的地址 Ox00 处,即完成了 Vivi 的编译和移植。3.4 Linux 内核编译与移植在对内核移植前,需要根据系统硬件资源对 Linux 内核进行配置和裁剪,以便在实现功能的前提下尽量减小内核,充分利用嵌入式系统有限的资源。在宿主机 Linux 系统终端下,进入内核源代码的目录,输入 makemenucoonfig 可以对内核进行配置,如

25、图所示。11本系统中主要需要对一下参数进行配置:处理器结构、网络功能、设备驱动、可执行文件格式等。内核配置完毕后,即可通过以下命令对内核进行编译:(1)makeclean:清除之前编译生成的文件。(2)makedep:建立内核文件之间的联系和依赖关系。(3)makezlmage:生成最终所需要的映像文件。运行以上三个命令之后,即可在二 /arch/arm/boot 目录下生成所需要的 zImage 映像文件。之后利用终端仿真程序 minicom 和 Bootloader 引导程序通过串口就可以把 Linux 内核映像移植到目标系统板的 flash 存储中了,这儿我们用的是 tftp 工具:tf

26、tp flash kernel zImage3.5 文件系统的移植在嵌入式系统中,一般采用 NANDFlash 作为代码和数据存储器。引导程序、内核以及需要保存的数据等都要放在 Flash 中,而且操作系统一般都需要在存储器上建立文件系统才能对存储器进行操作,因此需要在 Flash 上建立文件系统以满足嵌入式操作系统和实际的需要。在 Linux 里,系统对独立的文件系统不是用设备标示符来存取(比如驱动器编号或驱动12器名称),而是连接成为一个树型结构。 Linux 在安装新的文件系统时,把它安装到指定的安装目录,从而合并到这个单一的文件系统树上。Linux 的一个重要特征是它支持多种不同的文件

27、系统,文件系统将存放在系统硬盘上的文件和目录用可以理解的统一形式提供给用户,让用户不必考虑文件系统的类型或底层物理设备的特性。在嵌入式系统中,常用的文件系统有 RAMFS、JFFS2、CRAMFS 等。CRAMFS 是针对 Linux2.4 内核之后的版本所设计的一种新型文件系统,也是压缩和只读格式的。它主要优点是将文件数据以压缩形式存储,在需要运行的时候进行解压缩。由于它存储的文件形式是压缩的格式,所以文件系统不能直接在 Flash 上运行。虽然这样可以节约很多 Flash 存储空间,但是文件系统运行需要将大量的数据拷贝进 RAM 中,消耗了RAM 空间。CRAMFS 的移植过程如下:首先生

28、成 image:在 kernel/script/cramfs 有生成 image 程序的源代码,编译之后生成mkcramfs。建立一个目录,将需要放到文件系统的文件复制到这个目录。如果目录名为/mnt,要生成的 image 文件名为 root.cramfs,则命令语句为:./mkcramfs /mnt root.cramfs然后,让内核支持 CRAMFS:在 kemel 目录执行命令 make menuconfig 配置内核需求,选中 MTD(MemoryTechnologyDeviee)设备,选择直接编译到内核中去,这样就不用 insmod了。选中其中的相关选项,可以根据自己的使用情况定制,

29、多选中一些只是使启动变得慢一些,内核大一点,没有什么其他坏处。如果 CRAMFS 文件系统不是作为系统的根文件系统,要改 mtdblock0 的主设备号从 31 改为 30,这个修改在文件kernel/include/linux/mtd/mtd.h 中。然后重新编译内核,重新烧写内核和文件系统的映像。系统启动以后,就可以移植 CRAMFS 文件系统了,烧写如下 :tftp flash root root.cramfs至此本系统开发环境己经建立起来。4 设备驱动程序开发简介4.1 Linux 的驱动程序层次结构在嵌入式系统中,操作系统是介于应用程序与硬件之间的一个系统软件,其作用是为用户提供统一

30、的 API 接口。操作系统所面对的硬件设备种类非常多,不同型号不同厂家的13设备又具有各自不同的特点,因此,要支持某种设备就必须提供这种设备的控制代码,然后把它加载进内核,内核才能使用该设备。从内核的角度来看,驱动程序是一个设备的代表。当内核需要与某个设备交互时,就找到该设备的驱动程序,而后通过标准的接口调用驱动程序的相应函数,控制设备,而内核并不需要知道驱动程序如何工作,也不需要了解设备的细节,设备的细节由驱动程序掌握。驱动程序可以动态地加载和卸载,内核只包含必需设备的驱动程序。设备驱动程序一般需要完成以下功能:(1)对设备初始化和释放;(2)把数据从内核传送到硬件和从硬件读取数据;(3)读

31、取应用程序传送给设备文件的数据和回送应用程序的请求数据;(4)检测和处理设备出现的错误。在 Linux 操作系统下有三类主要设备文件类型:块设备、字符设备和网络设备。用户进程正是通过设备文件来与硬件打交道。每个设备文件都有其文件属性(cb) ,表示是字符设备还是块设备。另外每个文件都有 2 个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的设备号一致,否则用户进程将无法访问驱动程序。Linux 的设备驱动程序可分为三个主要部分:(1) 自动配置和仞始化子程序,负责检测所要驱动的硬件设备是否存在

32、和能否正常工作。如果该设备正常,则对这个设备及其他必需的条件(如中断、DMA 通道)进行申请并初始化。这部分驱动程序仅在初始化时被调用一次。(2) 服务于 I O 请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,但仍具有进行此系统调用的用户程序的运行环境,因而可以在其中调用与进程运行环境相关的函数。(3) 中断服务子程序,又称为驱动程序的下半部分。在 Linux 操作系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由 Linux 系统束接收硬件中断,再由系

33、统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务子程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备。144.2 字符型设备驱动程序在系统内部,I/O 设备的存取通过设备驱动程序提供的一组固定的入口点来进行,这组入口点在驱动程序初始化时向系统进行登记,以便在系统适当的时候调用。一般来说,字符型设备驱动程序能够提供如下几个入口点:(1) open 入口点:打开设备准备 IO 操作,对字符特别设备进行打丌操作,都会调用设

34、备的 open 入口点。open 子程序必须对将要进行的 IO 操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则 open 子程序必须设置一些标志以表示设备的状态。函数原型:int (*open)(struct innod*,struct file* )(2)close 入口点:关闭一个设备,当最后一次使用设备结束后,调用 close 子程序。独占设备必须标记设备可再次使用。函数原型:int (*release)(struct innod*,struct file* )(3)read 入口点:读取设备,对于有缓冲区的 IO 操作,一般从缓冲区罩读

35、取设备数据。函数原型:ssize_t(*read)(struet flle*,char*,size_st,loff_t*):(4)write 入口点:向设备写数据,对于有缓冲区的 IO 操作,一般向缓冲区里写入数据。函数原型:ssize_t(*write)(struet flle*,const char*,size_st,loff_t*):(5)ioctl 入口点:执行读写之外的操作。函数原型:int (*ioctl)(struct inode*,struct file*,unsighed int,unsighed long)4.3Linux 下驱动程序的实现Linux 对一个硬件设备的驱动有

36、两种方式:一种是直接加载到内核代码中,启动内核时就会驱动此硬件设备;另一种是以模块方式,编译生成一个.o 文件。模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程序,当应用程序需要它时再加载进内核空间运行。通常一个硬件的驱动程序就是指一个驱动模块。15对于任何一个硬件设备,它在/dev 下面存在一个对应的逻辑设备节点,即通常所说的设备文件。这个节点是通过 mknod 命令建立的,其中指定了主设备号和次设备号。主设备号表明了某一类设备,一般对应确

37、定的驱动程序;次设备号一般用于区分不同属性,例如不同的使用方法,不同的位置,不同的操作。这个设备号是从/proc/devices 文件中获得的,所以一般是先有驱动程序在内核中,才有设备节点在目录中。图 4-1 表明了驱动程序与系统之间的关系。通过模块的 read writ 操作Mknod 通过主次设备号相连返回主设备号Insmod 向系统注册Open read write 操作应用程序硬件设备文件驱动模块/etc/modules.conf 文件内核图 4-1 驱动程序与系统的关系4.4USB 摄像头选择以及驱动设计目前比较流行的摄像头是基于 ov511 芯片和 zc301 芯片的,已有很多关于

38、 zc301 芯片的开发文档之类,ov511 可能比较陈旧,可参考的资料不是很多,我们摄像头的选择取决于实验室配置的开发板三星 s3c2410 的开发板,选择网眼的 ov511 摄像头。摄像头属于视频设备,在 Linux 内核中,Video for Linux(简称 V4L)是关于视频设备的驱动标准。这个标准为应用程序定义了一系列的接口函数,内核、驱动和应用程序都是依靠这个标准来进行交流。本系统所使用的 USB 摄像头正是基于该标准来编写驱动和应用程序的。Linux 内核是依据设备号来操作设备文件的,在内核中,摄像头对应的设备文件名为/dev/video0,主设备号是 81,次设备号根据摄像头

39、数目来确定,本系统中仅使用一个摄像16头,所以可以通过 mknod /dev/video0 C 81 0 末创建节点。如下图 4-2 摄像头驱动的实现原理用户进程系统调用接收缓冲区|发送缓冲区文件操作接口终端服务程序摄像头图 4-2 摄像头驱动的实现5 Linux 下视频采集5.1 视频采集模块的设计视频采集模块的任务是从 USB 摄像头设备中读取视频帧数据,并将获取的视频数据压缩成一定格式保存。它是后边图像处理,视频监测的基础。Linux 系统中的视频采集子系统 Video4Linux 为视频应用程序提供了一套统一的 API,视频应用程序通过标准的系统调用即可操作各种不同的视频捕获设备。Vi

40、deo4Linux 向虚拟文件系统注册视频设备文件,应用程序通过操作视频设备文件实现对视频设备的访问。在嵌入式 Linux 的内核定制和编译阶段,已经加入了对 V4L 模块以及 OV511 设备的支持,运行 Linux 下的视频图像采集程序,可以通过 V4L 提供的编程接口(API)从 OV5n 设备中获取图像帧。Linux 下与 Video4Linux 相关设备及用途如表所示设备名称 Minor range 功能17/dev/video 0-63 视频捕捉接口/dev/radio 64-127 AM/FM 音频接口/dev/vtx 193-224 文字电视广播/dev/vbi 224-239

41、 原始 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/v4l/video0,为了和 V4L 模块相协调,使用 In -s/dev/v4l/video0

42、/dev/video0 为 V4L 模块的默认设备 video 与物理设备 video0 建立连接。采集程序打开该接口并扫描以寻找需要的数据。5.2 基于 v4l 的编程5.2.1Video4linux 中主要的数据结构Video4linux 支持的数据结构及其用途(1) video_capability 包含设备的基本信息(设备名称、支持的最大最小分辨率、信号源信息等)包含的分量:name32 /设备名称maxwidth ,maxheight,minwidth,minheightChannels /信号源个数type /是否能 capture,彩色还是黑白,是否能裁剪等等。值如 VID_TY

43、PE_CAPTURE 等具体实现函数如下:Int camere_get_capability(camera_device*vd)if(ioctl(vdfd,VIDIOCGCAP, fd 是设备打开后返回的文件描述符(打开错误返回一 1)。以后的系统调用函数就可使用它来对设备文件进行操作了。接着,利用 ioct1 ( fd, VIDIOCGCAP, & vid_caps)函数读取 struct video capability 中有关摄像头的信息。该函数成功返回后,这些信息从内核空间拷贝到用户程序空间 vid_caps 各成员分量中。用ioctl(fd, VIDIOCGPICT, & vid_t

44、ic)函数读取摄像头缓冲中 voideo_picture 信息,在用户空间程序中可以改变这些信息。完成以上初始化设备工作后,就可以对视频图像截取了。在LCD 上的显示如图所示206 视频网络传输模块研究与实现要实现监控现场,除了完成视频采集的编程,还需要把视频图像数据通过网络传输出去,因此需要在完成视频采集的基础上建立网络服务器,实现客户端和服务器之间的数据通信。本系统视频的网络传输是基于 TCP 协议来实现,前端嵌入式机作为视频服务器负责视频采集并建立好 TCP 服务器,等待客户端的连接;客户端做好一系列初始化工作后,主动连接服务器,得到应答后建立连接接收压缩视频数据并实时显示,同时可以根据

45、用户的要求进行实时或定时保存图像或者视频文件。6.1 TCPIP 协议简介TCPIP 协议是针对 NI 司 NJT-发的体系结构和协议标准,广泛地应用于组建网络中。它虽不是国际标准,但却是用户可获得的“既成事实”的标准。TCPIP 传输层有两个并列的协议:TCP 协议和 UDP 协议。其中 TCP 是面向连接的,而 UDP 是面向无连接的。它们都是建立在 IP 协议之上。TCP 提供应用程序的服务与 UDP提供的服务是不同的。(1)面向连接TCP 协议是面向连接,客户程序要与服务程序建立一个连接才能通过这个连接传输数据,并在结束时断开这个连接。21(2)可靠性TCP 协议提供了可靠性,发送的数

46、据都需要获得一个对方的确认。如果没有收到确认,TCP 会自动重发数据。(3)数据有序TCP 会为每个发送的字节分配一个序号,这样可以确保对方收到数据后能按序号重新组装,并且能识别收到的重复的数据。(4)流控TCP 提供了数据的流控,TCP 总是告知对方自己一次能接收的最大字节数。这就是TCP 的窗口(window),即当前接收缓冲区的可用大小,以保证发送方不会造成接收方的缓冲区溢出。TCP 的窗口大小是随着接收数掘而动态改变的。(5)全双工一个 TCP 的连接是全双工方式的,应用程序可以在一个连接上双向地发送和接收数据。TCP 必须能记录发送和接收的数据流的状态信息。阻塞,等待连接应答数据Se

47、nd()Listen()Recv()Accept()Socket()Bind()Close()send()Recv()recv()Socket()connect()客户端请求数据服务器图 6-1 TCP 的连接过程226.2 基于 webserver 的视频网络传输模块Webserver 又被称为 HTTP Server,它是对 HTTP 协议服务器端功能的实现。HTTP 协议是架构在 TCP/IP 协议上的应用级协议,其目的是方便和加速对分布式协同工作的超媒体信息系统的访问。HTTP 协议通过统一资源定位(Universal Resource Location,URL)来定位分布式的超媒体信

48、息。URL 通过 “通信协议+ 网络地址” 字符串来唯一标识信息位置。Linux 系统是通过提供套接字(socket)来进行网络编程的。通过 webserver 进行网络传输时涉及到的套接口操作函数主要有:socket()函数,主要功能是创建指定类型的套接口并返回套接口描述符;bind()函数,主要功能是使套接口与 IP 地址和端口号绑定;connect()函数,主要功能是用来与远端服务器建立连接;listen()函数,主要功能是当 socket 与某一端口捆绑以后,就需要监听该端口,以便对到达的服务请求加以处理;accept()函数主要功能是接受连接队列里的服务请求,并返回一个新的 sock

49、et 描述符,来供这个新连接使用。需要注意的是,服务器并不是通过监听端口来与客户连接并通信,而是产生一个新的套接口与客户通信。例如 webserver 在 80 号端口监听,当有客户向 80 号端口发出连接请求时,服务器将接受请求且由服务器进程派生出子进程和新的套接口(由 accept()的返回值指向)来与客户连接并通信。将采集格式为 YUV420P 的原始视频图像数据压缩成 JPEG 格式,并当客户端有连接时,通过子进程向客户端发送 JPEG 图像数据:if(size=(yuv420p_to_jpeg(&imagebmp,imageptr,640,480,20)Create Web Page 新建一个网页浏览页,并选中 settings,对视频浏览的相关参数进行设置。 具体设置为:Video Device 选中 Network IP Camera;Preview Frame Rate:8 framesper sec;Camera Model:Active WebCam HTTP Server;IP Adress or URL:192.168.0.115(即开发板的 IP 地址) ;Port :8888。整个设置完后,就可以搜索摄像头,找到摄像头后,就能在相应的 PC 机上动态显示摄像头

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报