第一篇:【学士论文】智能视频监控(视频敏感区域入侵检测报警)的设计与实现
摘要
摘要
随着对社会公共安全的需求提高,结合发展的现代计算机技术,安防产品向PC化靠拢。基于图像识别的智能视频监控以其突出的轻、巧、小、一体化等特点,逐渐取代传统监控手段。
而智能视频监控的关键技术则是依赖于视频内容的入侵检测。此课题在完成系统分析、设计的基础上,进行了系统的实现,在基于RGB颜色处理检测入侵对象的同时,提供色差、限差两个参数设定提高系统适应性,还特别开发了发送报警邮件的功能,实现了远程实时监控。
关键词:智能视频监控报警系统,图像对比,RGB色差模式,SMTP
I
ABSTRACT
ABSTRACT With the increasing demand for social and public security, combined with the development of modern computer technology, security products are more closer to the PC.Intelligent video monitoring based on image recognition is gradually replacing the traditional monitoring measures with prominent characteristics,such as its handiness, subsize, strong move to integration and so on.The key technology of intelligent video surveillance, intrusion detection depends on the video content.This subject intrusion detection based on video content analysis, the integration of real-time alarm monitoring technology.This project implements the system based on the integration of intrusion detection of video content,the analysis, real-time alarm monitoring technology.Keywords: Intelligent Video Surveillance and Alarm System,image contrast,RGB color mode,SMTP
II
目录
目 录
第一章 引言....................................................................................................................1 1.1 1.2 研究背景..........................................................................................................1 视频监控发展历史和国内外研究现状..........................................................1 1.2.1 视频监控发展历史......................................................................................1 1.2.2 国内外研究现状..........................................................................................2 1.3 1.4 2.1 2.2 论文的主要内容及意义..................................................................................2 论文组织..........................................................................................................3 需求分析..........................................................................................................4 总体设计..........................................................................................................5 第二章 需求分析与总体设计........................................................................................4 2.2.1 视频监控系统各模块设计..........................................................................7 2.2.2 关键数值设定说明......................................................................................8 2.3 3.1 本章总结..........................................................................................................9 智能视频监控技术.........................................................................................11 第三章
关键理论及技术.............................................................................................11 3.1.1 背景减除(Background Subtraction)..........................................................12 3.1.2 时间差分(Temporal Difference)................................................................12 3.1.3 光流(OpticalFlow).....................................................................................13 3.1.4 运动向量检测法........................................................................................14 3.2 3.3 RGB色彩模式...............................................................................................14 SMTP和名称空间简介.................................................................................15 3.3.1 SMTP简介.................................................................................................15 3.3.2 名称空间简介............................................................................................16 3.4 VFW体系结构简介......................................................................................17 3.4.1 VFW下AVICap基本功能.......................................................................18 3.4.2 常用的数据结构........................................................................................19 3.4.3 回调函数....................................................................................................20
III
目录
3.5 3.6 4.1 4.2 WINDOWS API简介........................................................................................21 本章小结........................................................................................................22 软件总体实现................................................................................................23 软件各模块说明............................................................................................23 第四章 软件实现..........................................................................................................23 4.2.1 视频内容捕获实现....................................................................................23 4.2.2 视频内容识别实现....................................................................................27 4.2.3 报警功能的设计与实现............................................................................33 第五章 测试..................................................................................................................42 5.1 5.2 5.3 系统测试相关理论........................................................................................42 摄像头监控程序软件描述............................................................................43 功能测试........................................................................................................44 5.3.1 启动摄像头功能测试................................................................................44 5.3.2 监控对比图形的设置测试........................................................................44 5.3.3 视频敏感区入侵测试................................................................................45 5.3.4 邮件发送测试............................................................................................46 5.4 各项参数性能测试........................................................................................51 5.4.1 色差设定测试............................................................................................51 5.4.2 限差设定测试............................................................................................54 5.4.3 延迟时间设定测试....................................................................................56 5.4.4 监控间隔设定测试....................................................................................56 5.5 测试结果分析及说明....................................................................................56 第六章 总结和展望......................................................................................................57 参考文献........................................................................................................................58 致谢................................................................................................................................59 外文资料原文................................................................................................................60 外文资料译文................................................................................................................62
IV
第一章 引言
第一章 引言
1.1 研究背景
一直以来,各类违法违规事件的发生猝不及防。同时随着科技的发展,违法违规的手段也趋于复杂,给正常的维护侦破工作带来诸多不便。社会的进步对安全防范的要求和规范也更高。依赖于传统的侦破人员勘察现场的手段已经不能满足当今社会的发展需求。
因此,智能视频监控系统进入了人们的视线,也将是未来安全防范主要依赖的工具和手段。首先认识一下智能视频监控的概念。智能视频监控是利用计算机视觉技术对视频信号进行处理、分析和理解,在不需要人为干预的情况下,通过对序列图像自动分析对监控场景中的变化进行定位、识别和跟踪,并在此基础上分析、判断目标的行为。
随着计算机网络技术、计算机图形技术、多媒体处理技术、通信技术的普及和快速发展,视频监控系统的数字化、网络化、智能化程度得到进一步得加强。也就意味着视频敏感区域的入侵检测也向着多维度的方向发展,并且具备了更多功能。在视频监控系统不断发展的今天,越来越多的视频监控产品向轻、巧、小的方向发展。
1.2 视频监控发展历史和国内外研究现状 1.2.1 视频监控发展历史
随着监控行业的飞速发展,视频监控系统的发展大致经历了三个阶段。第一代模拟时代:视频是以模拟方式进行处理,视频信号由同轴电缆进行传输,其控制方式也以模拟信号的形式进行处理;第二代为半数字式时代:则仍采用视频信号由同轴电缆进行传输,而控制主机或硬盘录像机(DVR)则进行数字处理与存储;第三代是全数字式时代:视频信号从采集开始即为数字信号,以网络系统为传输媒介,基于网络TCP/IP协议,采用流媒体计算机控制技术,具有多
电子科技大学学士学位论文
路复用传输,以网络虚拟矩阵控制方式,实现强大的视频监控管理控制平台。[1]
摄像机1运动目标分割运动目标分割运动目标检测运动目标检测运动目标跟踪运动目标跟踪行为分析与理解行为分析与理解多路数据融合及警报信息发布摄像机2 图1-1 视频监控系统处理流程
1.2.2 国内外研究现状
国外的研究主要有[2]:在美国国防高级研究计划局(DARPA)资助下,卡内基梅隆大学、戴维SARNOFF研究中心等几家著名研究机构合作,研制了视频监视与监控系统VSAM。VSAM的目标是为未来城市和战场监控应用开发的一种自动视频理解技术,用于实现未来战争中人力监控费用昂贵、非常危险或者人力无法实现等场合下的监控。英国的雷丁大学(University of Reading)开展了对车辆和行人的跟踪及其交互作用识别的相关研究;IBM与Microsoft等公司也正逐步将基于视觉的手势识别接口应用于商业领域中;Maryland大学的实时视觉监控系统W4不仅能够定位人和分割出人的身体部分,而且通过建立外观模型来实现多人的跟踪,可以检测和跟踪室外环境中的人并对他们之间简单的交互进行监控。
国内的研究机构主要有:中科院北京自动化研究所下属的模式识别国家重点实验室,他们对交通场景的视觉监控(基于三维线性模型定位、基于扩展卡尔曼滤波器的车辆跟踪算法)、人的运动视觉监控(基于步态的远距离身份识别)和行为模式识别(提出了对目标运动轨迹和行为特征的学习的模糊自组织神经学习算法)进行了深入研究,取得了一定的成果。此外,国内还有一些高校也进行了这方面的研究,如上海交通大学、北京航空航天大学、北京理工大学等。
1.3 论文的主要内容及意义
智能视频系统要解决的问题有两个:一个是将安防操作人员从繁杂而枯燥的长时间观察屏幕的任务重解脱出来,由机器来完成这部分工作,减少人力投入;另外一个是为在海量的视频数据中快速搜索到想要找的的关键数据,大大降低不报、误报、错报的概率。
意义可以从以下几方面来说:
第一章 引言
一是基于人们对安防产品越来越高的要求。对于愈加复杂的社会环境,人们需要更快速、高效、可靠的手段维护自身、社会的安全。
二是在硬件和软件基础越发夯实的条件下,很好地将传统的视频监控和软件设备衔接到一起,发挥两者的长处,触发了视频监控系统性能从根本上提高。
三是视频监控的一体化要求,从根本上简化设备,降低成本,减少人力、物力、财力等各方面的投入。
本文需着重考虑并解决的问题有以下三个大方面:1.视频内容的获取;2.视频内容的识别;3.报警方式的实现。最终实现小型一体化摄像头监控程序,完成对视频监控中异常行为的智能识别、提前发现和自动报警的目标,将在下面的章节中详细论述。
1.4 论文组织
本文以建立一个基于视频敏感区入侵检测的一体化智能视频监控系统为目标,实现对侵入视频敏感区物体的检测与跟踪,并根据所得到的判断结果启动实时的报警信息。提供单个色差、总色差值两种维度的入侵物体辨识,增加系统针对不同环境的可移植性。
本文共分为六章,各章节的主要内容如下:
第一章 引言。论述了本文的研究背景、目的、意义等,分析了目前国内外的发展和研究状况,并提出了相应的解决方案。随后给出了本文的主要研究内容和各章节的安排。
第二章 需求分析与总体设计。主要介绍了软件的需求分析与总体设计,以流程图的方式展现了软件相关的实现流程。
第三章 关键理论技术。主要论述了设计与实现摄像头监控软件涉及到的一些相关理论与关键技术。
第四章 软件实现。在VFW下,提供视频数据连接、视频内容捕获、并实现从视频上捕获并保存图像文件的功能,完成集监控、识别、报警为一体的小型视频监控系统软件的设计。
第五章 软件测试及应用。提供关于本系统开发的基本的性能要求、初步设计和系统基本功能需求的信息,以及软件总体测试的依据。
第六章 总结和展望。
电子科技大学学士学位论文
第二章 需求分析与总体设计
2.1 需求分析
视频监控是一个很广泛的概念,那么其中涵盖的知识点和信息点也是非常丰富的。作为现代安防的主要手段之一,视频监控有着非常良好的发展前景。本视频敏感区域的入侵检测系统只是视频监控中很小的一个部分,实现的功能也相较初级。本系统从最基本的功能入手,在结合现代计算机技术,实现了基于颜色的视频内容入侵检测、识别。因为是基于实时的检测报警,此系统由于时间和能力各方面的限制,暂不提供对视频内容的录制功能。
智能化、数字化、网络化是视频监控发展的必然趋势,智能视频监控的出现正是这一趋势的直接体现。智能视频监控分析是计算机视觉领域一个新兴的应用方向和备受关注的前沿课题,结合了计算机科学、机器视觉、图像处理、模式识别、人工智能等多学科。智能视频监控将一改传统监控的被动监视、事后查录像的尴尬境地,可以为用户提供更多高级的视频分析功能,可以极大的提高视频监控系统的能力,并使视频资源能够发挥更大的作用[3]。
2.1.1 功能需求
传统的视频监控系统仅仅提供了捕获、存储和发布视频的功能,监控的任务大部分是由人来完成的。通常,人工监控是枯燥和乏味的工作,需要安保人员投入比如常工作更高的注意力。如果监控的事件不经常发生,由于人不能长期集中注意力,易疲劳的原因,这种事件往往容易被疏忽。同时,数据资源的存储问题也尤为突出,随着时间的推移,视频数据也与日俱增,存储和查找变得尤为困难。
而智能视频监控作为一个新型的监控系统,在传统视频的优势上保持外,还需要克服传统视频监控存在的诸多问题,软件需要考虑的问题如下:
1)监控前端:用于采集被监控点的监控信息,并可以配备报警设备。
2)管理中心:承担所有前端设备的管理、控制、报警处理、录像、用户管理等工作。各部分功能分别由专门的服务器各司其职。
3)监控中心:用于集中对所辖区域进行监控,包括电视墙、监控客户终端群组
第二章 需求分析与总体设计
成。系统中可以有一个或多个监控中心。智能识别入侵对象,大大降低漏报、误报的概率。
4)PC客户端:在监控中心之外,也可以由PC机接到网络上进行远程监控。提高设备的可移植性,对复杂环境的适应性,避免多次开发的成本投入。
2.1.2 开发环境
此次设计在Windows XP sp2操作系统下采用Microsoft Visual Studio 2010进行开发,所选用的开发语言是C#,并结合MFC 进行编程, 目标框架是.NET Framework。这种开发工具和开发语言是当今比较流行的[4]。
Visual Studio是微软公司推出的开发环境。是目前最流行的Windows平台应用程序开发环境。Visual Studio 2010同时带来了 NET Framework 4.0、Microsoft Visual Studio 2010 CTP(Community Technology Preview--CTP),并且支持开发面向Windows 7的应用程序。除了Microsoft SQL Server,它还支持 IBM DB2和Oracle数据库。
支持 Windows Azure,微软云计算架构迈入重要里程碑。Visual Studio 2010有如下特点:
1.助力移动与嵌入式装置开发,三屏一云商机无限。
2.实践当前最热门的 Agile/Scrum 开发方法,强化团队竞争力。
3.升级的软件测试功能及工具,为软件质量严格把关。
4.搭配 Windows 7,Silverlight4 与 Office,发挥多核并行运算威力,5.创建美感与效能并重的新一代软件。
开发语言C#:C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
2.2 总体设计
研究和分析了目前视频监控系统的特点和针对目前用户对视频监控在功能上的相关需求,本文设计了一款实时视频监控软件。该软件主要实现了视频数据连
电子科技大学学士学位论文
接、视频内容识别、从视频上捕获并保存图像文件的功能,完成集监控、识别、报警为一体的任务。主要涵盖以下功能:
视频显示与控制部分:对视频图片的显示与控制。 控制摄像头的开启 打开摄像头监控视窗 启动摄像头监控
视频内容识别:识别视频内容的参数设置,是视频内容识别的主要手段。 色差 限差 监控间隔
报警部分:入侵检测报警联动 发出警音 发送邮件
邮件部分:邮件相关设置。 设置邮件信息 发送入侵邮件
系统结构图如下图所示:
摄像头监控程序前台显示部分报警方式选择后台部分数值设定操作项发出警号发出邮件监控对比图形保存设置邮件信息关于程序色差设定限差设定监控间隔延迟时间启动摄像头保存当前截图对设比置图监形控发送测试邮件开始监控 图2-1 系统结构图
第二章 需求分析与总体设计
2.2.1 视频监控系统各模块设计
视频监控系统主要分为两个功能模块:视频监控、报警联动。主要由以下四部分组成:
1、产生图像的摄像机或成像装置(前端设备);
2、图像的传输与转换设备(传输设备);
3、图像的处理与控制装置(主控设备);
4、终端图像显示记录装置(显示记录设备)。
监控端包括PC机、麦克风、摄像头。PC机用于控制采集设备,接受采集信息,编码压缩后传输到服务器,同时接受客户端的控制信息、图像信息,并传送给PC机进行编码后传送给服务器。由于是微型一体化的实时报警系统,图像传输与转换设备就忽略掉了,大大节省了视频监控系统的成本投入。
产生图像的摄像机或成像装置是基于笔记本自带的摄像头。服务器为一台连接到Internet网的高性能计算机,用于接受监控端发过来的图片信息、响应客户端的请求,并将监控端的视频截图实时传送给客户端。传输网络为Internet,提供客户及与服务器之间额信息通路。客户端为连接到Internet的普通计算机,通过网络与服务器进行通信,便于用户随时上网查看现场监控的情况。
本系统设计应用于无人监管的远程网络监控,具有视频移动报警功能,即在所连接的任何一个摄像头的监控区中,若出现物体的移动变化即可启动报警、发送入侵邮件等报警设备。用户可以获得服务器验证通过后的任何一台联网PC机上进行监控区域的查看,还可以多个合法用户同时查看。当用户在报警结束后查看系统,则可从录像的图片文件中得到异常情况发生时监控区域的状况。
电子科技大学学士学位论文
进入系统成功加载动态链接库Y成功打开视频设备Y注册回调函数NN错误处理入侵目标检测与跟踪退出系统发生异常事件Y报警操作及发送报警信息N 图2-2 系统处理流程图
2.2.2 关键数值设定说明
在程序主界面,从提高监控系统的整体性能、提高对环境的适应能力出发,提供了四个参数的设置,分别为色差、限差、监控间隔和监控延迟。下面就这四个数值做简单的分析。
色差设定:主要是为了防止因为细微的环境变化而导致误报的现象。因为我们日常所处的情况,很容易受到天气和时段的影响。一天的不同时间段以及不同的天气状况,摄像头内的画面是会在一定范围内波动的。可以根据用户的需要,灵活设定这些参数,能更好地为用户服务。增大色差容差能力,将更模糊外界不可抗因素对视频内容的影响。当图像变化的颜色差值大于该色差值时,判断有可
第二章 需求分析与总体设计
能出现变化,该值越小则要求图像变化越小,即要求越严格。色差是该视频监控系统稳定性和灵敏性的关键指标。因为考究到该系统将会用到各种复杂的环境中,用户可以根据自身的需求设定合适的数值。同时,由0-100的变化指标,对环境变化要求不高的用户就可以将数值调大,避免画面因微小的污染造成误报。而对环境纯度要求较高的用户,对于微小的画面污染也要纠察出来的话,可以适当将数值调小。
限差设定:限差用于控制图像中变化比率ratio,当超过该值时开始报警,即当图像出现ratio%的变化时程序认为出现异常,该值越小要求图像变化越小。限差设定主要是用于防止一些细微的变化引发不必要的误报发生。适当提高限差值,能过滤掉一些无关紧要的画面污染。
监控间隔设定:即每隔多长时间进行一次监控分析。最小值为100ms,值越小,其监控分析的频率越高,同时CPU使用率越高。用户可以根据自己的需求设定相应的间隔值。
延长时间设定:延长时间值表示点击“开始监控”按钮后延长多少时间后开始监控。如果设置延长时间为0,则表示点击“开始监控”按钮后马上开始进行监控。设置该参数主要是用于一些延长监控的情况,如现在开启监控,但是人要出门,出门大概需要30s,则设置延长时间为30s,30s后程序自动进入监控状态。
同时在主程序界面还有两个选项需要用户选择:单个色差、总体色差。因为该监控系统主要是基于RGB值来实现对入侵物体的识别。因此就存在两个维度的对比,单个色差指分别比较RGB颜色差值,总色差值指比较RGB的总差值。
图2-3 相关参数设置
2.3 本章总结
本章研究和分析了视频监控系统的相关需求,对该程序的开发环境做了简单
电子科技大学学士学位论文 的介绍。本章的重点在于设计和介绍摄像头监控软件的主要功能模块与总体设计。用框图的形式展示了系统的整体结构,并对在设计软件中发挥重要作用的关键数据如色差限定、限差设定、监控间隔设定进行了简单的分析。并针对软件设计过程中遇到的问题,提出了相应的解决方案。
基于对此次课题的需求分析重新整合梳理,为下面课题的实现打下了良好的基础。
第三章 关键理论及技术
第三章
关键理论及技术
3.1 智能视频监控技术
IEEE在图像的智能分析等方面有比较大的成果,比如运动检测、人脸识别、目标跟踪等。运动检测是指在指定区域能识别图像的变化,检测运动物体的存在并避免由光线变化带来的干扰。由于背景图像的动态变化,如天气、光照、影子及混乱干扰等的影响,使得运动检测成为一项相当困难的工作。早期的运动检测是对编码后产生的I帧进行比较分析,通过视频帧的比较来检测图像变化。目前常用的方法有背景减除(Background Subtraction)、时间差分(Temporal Difference)、光流(OpticalFlow)、运动向量检测法等[5]。
智能监控系统各组成部分的说明如下:
(1)监控前端:用于采集被监控点的监控信息,并可以配备报警设备。监控前端可分为两类:
①普通摄像头+视频服务器。普通摄像头可以是模拟摄像头,也可以是数字摄像头。原始视频信号传到视频服务器,经视频服务器编码后,以TCP/IP协议通过网络传至其他设备。
②网络摄像头。网络摄像头是融摄像、视频编码、Web服务于一体的高级摄像设备,内嵌了TCP/IP协议栈。可以直接连接到网络。
(2)管理中心:承担所有前端设备的管理、控制、报警处理、录像、录像回放、用户管理等工作。各部分功能分别由专门的服务器各司其职。
(3)监控中心:用于集中对所辖区域进行监控,包括电视墙、监控客户终端群组成。系统中可以有一个或多个监控中心。
(4)PC客户端:在监控中心之外,也可以由PC机接到网络上进行远程监控。
(5)无线网桥:无线网桥用于接入无线数据网络,并访问互联网。通过无线网桥,可以将IP网上的监控信息传至无线终端,也可以将无线终端的控制指令传给IP网上的视频监控管理系统。目前常用的无线网络为CDMA网络[6]。
运动目标检测(Moving-Objectives Detecting)作为智能视频监控系统重要的组成部分,是指从视频流图像序列中实时提取目标运动变化的区域,检测出图像序列中目标的运动信息,滤除与运动目标无关的背景的过程。运动目标检测的算
电子科技大学学士学位论文
法依照目标与摄像机之间的关系可以分为静态背景下运动检测和动态背景下运动检测。下面就背景减除(Background Subtraction)、时间差分(Temporal Difference)、光流(OpticalFlow)、运动向量检测法这四种方法做简单的介绍。
3.1.1 背景减除(Background Subtraction)背景减除方法是目前运动检测中最常用的一种方法,它是利用当前图像与背景图像的差分来检测出运动目标的一种技术。它一般能够提供相对来说比较全面的运动目标的特征数据,但对于动态场景的变化,如光线照射情况和外来无关事件的干扰等也特别敏感。
实际上,背景的建模是背景减除方法的技术关键。最简单的背景模型是时间平均图像,即利用同一场景在一个时段的平均图像作为该场景的背景模型。由于该模型是固定的,一旦建立之后,对于该场景图像所发生的任何变化都比较敏感,比如阳光照射方向,影子,树叶随风摇动等。大部分的研究人员目前都致力于开发更加实用的背景模型,以期减少动态场景变化对于运动目标检测效果的影响[9]。
首先,为背景中每个像素点进行统计建模。最简单的背景模型是时间平均图像,即利用同一场景在一个时段的平均图像作为该场景的背景模型。由于该模型是固定的,一旦建立之后,对于该场景图像所发生的任何变化都比较敏感,比如阳光照射方向、影子、树叶随风摇动等。大部分的研究人员目前都致力于开发更加实用的背景模型,以减少动态场景变化对运动目标检测效果的影响。
其次,用当前图像与己知背景图像比较,找出在一定阈值限制下当前图像中的背景像素点。定义当前图像为F(i, j,t),背景图像为B(i, j,t)。则差分图像可以表示为:d(i, j,t)=| F(i,j,t)−B(i,j,t)|
最后,对图像进行二值化处理,从而得到前景图像(运动目标)的集合。设x(i,j)为差分图像中任何一点,Th为灰度阀值,二值化过程可描述为:要保证一个视频监控系统长期稳定的运行,背景差分法就要具备很强的鲁棒性。背景差分法的难点在于如何建立背景模型和保持背景模型更新,用以弥补由动态场景中的光线变化等因素带来的不利影响[7]。
3.1.2 时间差分(Temporal Difference)时间差分(Temporal Difference 又称相邻帧差)方法充分利用了视频图像的特征,从连续得到的视频流中提取所需要的动态目标信息。
第三章 关键理论及技术
在一般情况下采集的视频图像,若仔细对比相邻两帧,可以发现其中大部分的背景像素均保持不变。只有在有前景移动目标的部分相邻帧的像素差异比较大。时间差分方法就是利用相邻帧图像的相减来提取出前景移动目标的信息的。让我们来考虑安装固定摄像头所获取的视频。我们介绍利用连续的图像序列中两个或三个相邻帧之间的时间差分,并且用阈值来提取出视频图像中的运动目标的方法。我们采用三帧差分的方法,即当某一个像素在连续三帧视频图像上均有相当程度的变化(及大于设定的阈值时),我们便确定该像素属于运动目标。时间差分运动检测方法对于动态环境具有较强的自适应性,但一般不能完全提取出所有相关的特征像素点,在运动实体内部容易产生空洞现象,只能够检测到目标的边缘。而且,当运动目标停止运动时,一般时间差分方法便失效[8]。
3.1.3 光流(OpticalFlow)基于光流方法(Optical Flow)的运动检测采用了运动目标随时间变化的光流特性,如Meyer 等作者通过计算位移向量光流场来初始化基于轮廓的跟踪算法,从而有效地提取和跟踪运动目标。该方法的优点是在所摄场所运动存在的前提下也能检测出独立的运动目标。然而,大多数的光流计算方法相当复杂,且抗噪性能差,如果没有特别的硬件装置则不能被应用于全帧视频流的实时处理。
当物体与背景发生相对运动时,运动物体在被观测图像上对应点的亮度模式也在运动,这种像素点运动的瞬时速度场就是光流。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。由光流的定义可以引申出光流场,它是指图像中所有像素点构成的一种二维(2D)瞬时速度场,其中的二维速度矢量是景物中可见点的三维速度矢量在成像表面的投影。所以光流不仅包含了被观察物体的运动信息,而且还包含有关景物三维结构的丰富信息。对光流的研究成为计算机视觉及其相关研究领域中的一个重要部分。[8]
光流法的基本原理可描述如下:赋予图像中的每个像素一个速度矢量,形成一个图像运动场,根据各个像素的速度矢量特征,可以对图像进行动态分析。如果图像中没有运动目标,则光流矢量在整个图像区域是连续变化的,当物体和图像背景存在相对运动时,运动物体所形成的速度矢量必然和区域背景速度矢量不同,从而检测出运动物体的位置。
电子科技大学学士学位论文
3.1.4 运动向量检测法
运动向量检测法适合于多维变化的环境,能消除背景中的振动像素,使某一方向的运动对象更加突出的显示出来。但是,运动向量检测法也不能精确地分割出对象。动态视频目标跟踪技术在传统监控系统中,目标跟踪是由监控人员手工操作来完成。由于所有的目标的运动特性是非线性的,其速度和方向都在随时发生改变。即使目标的速度、方向不变,但它与摄像机的距离也在变化,从而引入很强的非线性因素,因而用人工操作的方法来实现控制非常困难。智能化视频监控技术提供有效的目标自动跟踪的工具,在用计算机自动处理视频流的过程中,如发现和跟踪感兴趣的目标,就提示监控人员加以关注,并可以控制灵巧快球摄像机,对移动目标实现自动跟踪。
3.2 RGB色彩模式
在一个典型的多媒体计算机系统中常常涉及到用几种不同的色彩空间表示图形和图像的颜色,以对应于不同的场合和应用。因此数字图像的生成、存贮、处理及显示时对应不同的色彩空间需要作不同的处理和转换。
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色。RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0-255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216(256 * 256 * 256)种颜色。其中任何参数发生改变,颜色也与之对应的变化。因此可以用RGB模型实现此次入侵检测的功能。
人的眼睛通过三种可见光对视网膜的锥状细胞的刺激来感受颜色。这种理论就是使用红、绿、蓝三种基色来显示彩色的基础,称之为RGB色彩空间模型。以R、G、B三个参数为坐标,我们可以得到如下的一个单位立体方体描述RGB颜色模型。红、绿、蓝是相互正交的坐标轴,每个坐标轴都量化为0[9]。
第三章 关键理论及技术
Y黄(0,0,1)灰度红(0,1,1)绿(1,0,1)白(0,0,0)黑(1,1,1)M品红(0,1,0)青(1,0,0)C蓝(1,1,0)
图3-1 RGB颜色模型
3.3 SMTP和名称空间简介 3.3.1 SMTP简介
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务 器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再尝试建立该连接。这个连接建立之后,SMTP客户和服务器先执行一些应用层握手操作。在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后,客户发出邮件消息。SMTP可以指望由 TCP提供的可靠数据传输服务把该消息无错地传送到服务器。如果客户还有其他邮件消息需发送到同一个服务器,它就在同一个TCP连接上重复上述过程,否则,它就指示TCP关闭该连接。
电子科技大学学士学位论文
SMTP通常有两种工作模式:发送SMTP和接收SMTP。具体工作方式为:发送SMTP在接到用户的邮件请求后,判断此邮件是否为本地邮件,若是直接投送到用户的邮箱,否则向dns查询远端邮件服务器的MX纪录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答即可。
用户发送SMTP文件系统图3-2 SMTP使用模型
SMTP命令,应答和邮件内容接受SMTP文件系统 3.3.2 名称空间简介
名称空间(Namespace)System.Web.Mail类库里所提供的邮件发送的对象、属性和方法它有三个类:SmtpMail、MailMessage和MailAttachment。
(1)MailMessage:提供属性和方法来创建一个邮件消息对象。(Provides properties and methods for constructing an e-mail message.)(2)MailAttachments:提供属性和方法来创建一个邮件附件对象。(Provides properties and methods for constructing an e-mail attachment.)
(3)SmtpMail:提供属性和方法通过使用windows 2000 CDOSYS 的消息组件的联合数据对象来发送邮件消息)。(Provides properties and methods for sending messages using the Collaboration Data Objects for Windows 2000(CDOSYS)message component)。
各个类的属性简介:
From发送邮件的地址;To接受邮件的地址;Subject邮件的标题;Priority邮件的优先级(有效值为High ,Low ,Normal);Attachments返回一个集合,代表附件;Bcc密送地址;Cc抄送地址;获取或是设置电子邮件消息的内容。BodyFormat
第三章 关键理论及技术
获取或是设置Mail Format的枚举值,此值指定消息体邮件的格式(Html格式、Text格式);Bodyencoding指定消息的编码方式编码(主要有Base64,UUencode)。
SmtpMail类的Send方法,它的目的就是发送邮件,有两个重载方法。(1)SmtpMail.Send(“发送邮件的地址”,“接受邮件的地址”,“邮件的标题”,“邮件消息的内容”)这个方法很简单,不适合发送带附件的邮件。
(2)SmtpMail.Send(MailMessage)此方法复杂、灵活,适合发送附件,而且可以设置MailMessage对象的各种属性值。如果我们用ASP.NET写一个邮件发送的程序,那么首先应该如何得到SMTP。有两种方法:第一种方法调用目前知名的邮件服务提供商的SMTP,比如新浪、搜狐、网易的免费电子邮箱的SMTP;第二种方法是自己装一个SMTP虚拟服务器,这个在安装IIS时一起装上去的。
3.4 VFW体系结构简介
与技术在Wondows平台下开发的视频应用程序一般采用两种主要形式:
一、基于视频采集卡附带的二次软件开发包SDK(Software Development Kit)进行。这种方式的优点是方便、容易上手,适于初学者;缺点是对硬件的依赖性较强、灵活性差,且功能参差不齐,不能充分满足各种视频应用程序的开发需求。
二、另一种基于VFW(Video for Windows)进行。VFW 是Microsoft公司为开发Windows平台下的视频应用程序提供的软件工具包,提供了一系列应用程序编程接口(API),用户可以通过这些接口很 方便地实现视频捕获、视频编辑及视频播放等通用功能,还可利用回调函数开发比较复杂的视频应用程序。该技术的特点是播放视频时不需要专用的硬件设备,而且 应用灵活,可以满足视频应用程序开发的需要。Windows操作系统自身就携带了VFW技术,系统安装时,会自动安装VFW的相关组件。
VFW技术主要由六个功能模块组成,下面进行简单说明。
(1)AVICAP32.DLL:包含执行视频捕获的函数,给AVI文件的I/O处理和视频,音频设备驱动程序提供一个高级接口;
(2)MSVIDEO.DLL:包含一套特殊的DrawDib函数,用来处理程序上的视频操作;
(3)MCIAVI.DRV:包括对VFW的MCI命令解释器的驱动程序;(4)AVIFILE.DLL:包含由标准多媒体I/O(mmio)函数提供的更高级的命令,用来访问.AVI文件;
电子科技大学学士学位论文
(5)ICM:压缩管理器,用于管理的视频压缩/解压缩的编译码器;(6)ACM:音频压缩管理器,提供与ICM相似的服务,适用于波形音频。
采集程序编辑程序回放程序AVICAP.DLLAVICAPACMMCIAVI.DVRAVICAPMSVIDEO.DLLMCIWndMSVIEO.DLL视频输入通道AVIFILE.DLL视频输入通道图3-3 VFW各模块间联系图
AVICAP.DLLAVICAP3.4.1 VFW下AVICap基本功能
选择摄像头捕获的画面为视频源,使用AVICap窗口类来实现视频的采集。AVICap窗口类是VFW的一个重要的组成部分,它实现的主要功能是视频的捕获。AVICap提供给应用程序一个简单的、基于消息的接口去访问视频设备和录音设备,并且可以控制处理视频流的捕获,满足了此次课题的需求,并且很容易加入到应用程序中,适于二次开发。
AVICap支持实时视频流捕获和单帧捕获。此外,AVICap使程序员可以控制视频源的开始和结束位置,并加入了如序列帧捕获等功能。
使用AVICap生成的捕获窗具有以下功能:(1)将音频和视频流捕获到AVI文件;(2)动态地连接或断开音频和视频输入设备;
(3)以叠加(overlay)或预览(preview)模式显示输入的实时视频信号;(4)指定捕获所用的文件,并可将捕获文件的内容拷贝到另一个文件;(5)设置捕获速率;
(6)显示控制视频源和视频格式的对话框;(7)创建,保存和载入对话框;(8)将图像和调色板拷贝到剪贴板;(9)捕获和保存DIB格式单帧图像。
通过检查CAPDRIVERCAPS结构来获取捕获驱动器的能力,并通过AVICap
第三章 关键理论及技术
提供的Video Source,Video Format,Video Display对话框来对捕获参数进行设置。
AVICap在显示视频时提供的两种模式:
预览(Preview)模式:该模式使用CPU资源,视频帧先从捕获硬件传到系统内存,接着采用GDI函数在捕获窗中显示。在物理上,这种模式需要通过VGA卡在监视器上显示。
叠加(Overlay)模式:该模式使用硬件叠加进行视频显示,叠加视频的显示不经过VGA卡,叠加视频的硬件将VGA的输出信号与其自身的输出信号合并,形成组合信号显示在计算机的监视器上。只有部分视频捕获卡才具有视频叠加能力。
基于VFW实现C#控制摄像头需要手动另起一个线程。定义一个叫AviCapture.cs的类,用于引入avicap32.dll以及相关的内容。在avicap32.dll中,CAPTUREPARMS结构里有一个fYield,表示另起线程标志位,如果为真,则程序重新启动一个线程用于视频流的捕获,默认值是假。在AviCapture这个类的基础上定义一个叫Video的类,实现如打开摄像头、关闭摄像头、开始录像、结束录像、拍照片等操作。
3.4.2 常用的数据结构
用VFW编写的视频捕捉程序,往往要用到以下四个与视频捕捉相关的数据结构:
(1)CAPSTATUS:定义捕获窗口的当前状态,如图像的宽、高等;(2)CAPDRIVERCAPS:设置捕获设备所拥有的功能能,如有无视频叠加能力、有无控制视频源、视频格式的对话框等;
(3)CAPTUREPARMS:包含控制视频流捕获过程的参数,如捕获帧频、指定键盘或鼠标键以种植捕获,捕获的时间限制等;
(4)VIDEOHDR:定义视频数据块的头信息,在编写回调函数时常用到其数据成员lPData(指向数据缓存的指针)和dwBuferLength(数据缓存大小)。其中,前三种结构都有相应的函数来设置和获取该结构包含的信息。
设置视频设备的属性
CAPTUREPARMS数据结构包括了视频流的控制参数,通过设置captureParms结构变量的各个成员变量,可以控制设备的采样频率、中断采样按键、状态行为等。它允许完成以下任务:
电子科技大学学士学位论文
(1)指定帧速度(Frame Rate);(2)指定视频分配的内存大小;(3)关闭或打开音频捕获;(4)设定捕获的时间间隔;
(5)指定捕获设备(MCI设备、VCR或者影碟);(6)指定结束捕获的键盘或鼠标操作;(7)指定使用的视频类型。
向视频捕获窗体发送WM_CAP_GET_SEQENCE_SETUP消息或者使用宏函数capCaptureGetSetup,可以获得一个CAPTUREPARMS数据结构的对象,当前连接的视频设备信息就保存在这个结构体对象里面,此对象的成员变量可以根据系统需要进行修改。修改完毕后,发送WM_CAP_SET_SEQUENCE_SETUP消息给捕获窗体,并把这个CAPTUREPARMS对象作为传送参数,或者使用宏capCaptureSetSetup,就可使修改的设置生效。之后还可以用capPreviewScale、capPreviewRate等函数设置预览的比例与速度,直接使用设备的默认值也能满足大部分的系统需求。
3.4.3 回调函数
对采集的视频数据进行实时处理时需要用到回调函数。在窗口过程、钩子过程、异步过程都需要调用回调函数,在整个回调过程中自始至终地使用回调方法。回调函数是一类特殊的函数,其功能类似于中断函数,其调动过程由系统完成,而回调函数的具体内容则由用户自己设定。开发者可以注册回调函数方法以获得加载/卸载通知,未处理异常通知、数据库/窗口状态修改通知、文件系统修改通知、菜单项选择、完成的异步操作通知、过滤一组条目等。在系统中,当每一回调函数被设定后,并且满足某一特定条件时,系统将自动调用该回调函数。VFW的回调函数主要包括状态回调、错误回调和视频回调。两个宏函数简要介绍如下:
(1)capSetCallbackOnFranme(hWnd,fpFrameProc),注册帧回调函数。只要一启动视频捕获,当一帧结束后它就理科产生同步动作,而究竟是哪一个回调函数响应,则由登记在设置宏函数中的fpFrameProc参数来决定。此响应是一帧一帧地在同一个缓冲区内进行刷新。另外回调函数要提前定义,即在程序头部进行定义。
(2)capSetCallbackonVideoStream(hwnd,fpVideoProc)。与capSetCallbackOnFranme不同的是,它要和capCaptureSequenceNoFile(hWnd)或
第三章 关键理论及技术
capCaptureSequence(hwnd)配合使用,当其中一个被执行后,回调动作才会产生。此想听同样是一帧结束后边产生回调,但每次数据都追加在上一帧数据的后面,知道所分配的数据缓冲区用完为止。
3.5 Windows API简介
C#开发Windows应用程序的两种主要方法为:使用Windows API(Application Programming Interface,应用程序编程接口)函数,利用MFC(Microsoft Foundation Class,微软基础类库)类库。
Windows API 就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的 API 而使操作系统去执行应用程序的命令(动作)。Windows API是一套用来控制Windows的各个部件的外观和行为的预先定义的Windows函数。用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么。API函数包含在Windows系统目录下的动态连接库文件中[10]。
应用程序接口为:“„计算机操作系统(Operating system)‟或„程序库‟提供给应用程序调用使用的代码”。其主要目的是让应用程序开发人员得以调用一组例程功能,而无须考虑其底层的源代码为何、或理解其内部工作机制的细节。API本身是抽象的,它仅定义了一个接口,而不涉入应用程序如何实现的细节。Windows API所提供的功能可以归为七类:
1.基础服务(Base Services),提供对Windows系统可用的基础资源的访问接口。比如象:文件系统(file system)、外部设备(device)、进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。这些功能接口位于,16位Windows下的kernel.exe、krnl286.exe或krnl386.exe系统文档中;以及32位Windows下的 kernel32.dll和advapi32.dll中。
2.图形设备接口(GDI),提供功能为:输出图形内容到显示器、打印机以及其他外部输出设备。它位于16位Windows下的gdi.exe;以及32位Windows下的gdi32.dll。
3.图形化用户界面(GUI),提供的功能有创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。接收鼠标和键盘输入,以及其他与GUI有关的功能。这些调用接口位于:16位Windows下的user.exe,以及32位Windows下的user32.dll。从Windows XP版本之后,基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32.dll中。
电子科技大学学士学位论文
4.通用对话框链接库(Common Dialog Box Library),为应用程序提供标准对话框,比如打开/保存文档对话框、颜色对话框和字体对话框等等。这个链接库位于:16位Windows下的commdlg.dll中,以及32位Windows下comdlg32.dll中。它被归类为User Interface API之下。
5.通用控件链接库(Common Control Library),为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。这个链接库位于:16位Windows下的commctrl.dll中,以及32位Windows下comctl32.dll中。它被归类为User Interface API之下。
6.Windows外壳(Windows Shell),作为Windows API的组成部分,不仅允许应用程序访问Windows外壳提供的功能,还对之有所改进和增强。它位于16位Windows下的shell.dll中,以及32位Windows下的shell32.dll中(Windows 95则在 shlwapi.dll中)。它被归类为User Interface API之下。
7.网络服务(Network Services),为访问操作系统提供的多种网络 功能提供接口。它包括NetBIOS、Winsock、NetDDE及RPC等。
3.6 本章小结
本章主要介绍了软件设计过程中运用到的相关理论与技术。先是对视频监控系统做了简单的介绍再针对现下较为流行的视频监控技术手段做了简单的介绍,有背景减除法、时间差分法、光流法。并简要分析了这几种算法的优缺点。同时对RGB颜色空间和SMTP邮件的基础知识进行了解,为后面的软件的设计与实现提供了一定的依据。
第四章 软件实现
第四章 软件实现
4.1 软件总体实现
课题主要的任务为开发一套基于视频场景分析的敏感区域入侵检测软件,主要功能包括:检测参数设置、场景图像采集、异常场景元素提取、场景元素判别、异常入侵报警等功能。
充分考虑到课题的需求,笔者将分为以下三个环节介绍软件具体的实现过程。1.视频内容捕获的实现;2.视频内容识别的实现;3.报警功能的设计与实现。
4.2 软件各模块说明 4.2.1 视频内容捕获实现
视频捕获是指由专用的视频采集卡捕获视频、图像等信息,再将获得的视频数据进行数字化操作,然后可以针对这些数据进行保存、修改、传输、回放等各项操作。视频的捕获并显示是此次课题实现的关键步骤,关系到后续关于视频处理的一系列操作。能否准确有效地捕获指定的监控敏感区,进而实现精确的数据获取、分析和处理。在此次课题中,由于资金有限,将采取在本地直接调用笔记本摄像头的开闭实现视频的捕获[11]。
根据不同的应用需求,可以将视频帧采集到文件中或者缓存直接加以处理。利用VFW获取实时视频数据时,通常使用回调机制来获得实时数据缓冲区的首址和长度,从而获得视频数据,实现视频的实时处理。在此次课题中,由于是实现实时的入侵监控和报警,并且提供邮件发送的功能,邮件附带入侵的视频数据截图,那么考虑到文件传输的速度和稳定性,将主要以捕获视频图像为主。
电子科技大学学士学位论文
创建视频捕获窗口①获取视频采集设备的能力及状态信息注册系统回调函数⑤设置窗口显示模式④获取有关视频捕获窗口缺省参数捕获图像到缓存或文件并进行相应处理设置捕获窗口参数③中止视频捕获并断开与视频采集设备的连接与视频捕获设备连接②
图4-1 视频捕获软件实现流程
具体实现过程如下:(1)创建视频捕获窗口
捕获窗口是所有捕获操作的基础,其构造要调用:
public CameraClass(IntPtr handle, int left, int top, int width,int height)
{
mControlPtr = handle;
mWidth = width;
mHeight = height;
mLeft = left;
mTop = top;
}(2)将捕获窗口与视频捕获驱动相连 BOOL fOK;fOK = capDriverConnect(ghWndCap, 0);
if(!fOK){ //无法将指定的视频捕获驱动连接到捕获窗
第四章 软件实现
//在此加入错误处理 }(3)获得捕获驱动器的能力
capDriverGetCaps(hwndCap, &gCapDriverCaps, sizeof(CAPDRIVERCAPS));其中, gCapDriverCaps是由CAPDRIVERCAPS gCapDriverCaps;定义的。CAPDRIVERCAPS 结构定义了捕获驱动器的能力,如有无视频叠加能力,有无控制视频源、视频格式的对话框等。
执行capDriverGetCaps语句后,gCapDriverCaps中就获得了与当前捕获窗相连的捕获驱动的各项能力,要根据该捕获驱动的能力来实现视频的显示和捕获。
(4)显示视频
由于叠加模式只被部分视频捕获卡支持,而大部分视频捕获设备都支持预览模式,我们用预览(preview)模式显示视频:
capPreviewRate(ghWndCap,66);
//设置显示帧率
capPreview(ghWndCap,TRUE);
//开始预览显示
要停止预览可用:capPreview(ghWndCap,FALSE);用叠加模式显示视频的方法相似,只是所用函数应为capOverlay。(5)进行视频捕获
视频捕获主要有两种模式,连续视频流捕获和单帧捕获。在进行视频捕获之前要指定捕获文件名并为捕获文件分配存储空间。public void SaveImage(string path)
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
SendMessage(hWndC,WM_CAP_SAVEDIB,0,hBmp.ToInt32());
}(6)结束,将捕获窗同驱动断开连接 public void Stop()
{
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
bStat = false;
}
这一步在结束视频捕获程序时是必须的,否则将导致视频驱动无法释放,其它程序将不能使用捕获设备。
电子科技大学学士学位论文
利用函数capOverlay选择采用叠加模式预览,从而减小系统资源的占用率,加快了视频的加载速度。之后使用capPreview启动预览功能,这时就可以在屏幕上显示出整个界面窗口,并可以看到指示灯亮摄像头被打开,屏幕上显示摄像头摄入的视频内容。
一个程序可以为捕获窗口登记多个回调函数,以便在以下几种情况发生时通知程序作出相应的应对操作:(1)状态改变;(2)错误发生;
(3)视频框架缓冲区变为可用;
(4)应用程序在捕获视频流过程中接收到数据。
通过以上几个步骤就可以建立一个基本的视频捕获程序,之后需要使用捕获窗口的回调函数,获取每一帧的视频数据,以供之后进行视频内容的操作处理。至此,视频数据显示、采集功能已基本实现[12]。
打开后的视频捕获窗口如下图所示:
图4-2 启动摄像头监控程序
第四章 软件实现
4.2.2 视频内容识别实现
此次课题是基于视频敏感区内容的识别,目标的检测与跟踪就是把物体提取出来,对其进行识别并获取其相关信息的过程。在智能视频监控系统中,物体检测和跟踪是提高系统智能性的关键技术。
因此此次课题的重点则是实现视频内容的识别,笔者在综合考虑各方面的因素之后,采取了通过对比视频当前画面和背景画面的颜色变化的方式来判别是否为有害入侵。确定了基于颜色的敏感入侵检测,设定了色差、限差两个参数的维度来判断入侵是否有害,这两个参数取值范围均为0—100区间,用户可以根据自身的需求自定义。
(1)设置监控对比图形
首先用户需在摄像头开启状态下,通过点击“设置监控对比图形”来设置背景图像。用户可以根据自身的需求设定监控对比图形,这一功能的开放,使得该摄像头监控程序可运用的范围大大增加。
图4-3 CaptureScreenClass类图
CaptureScreenClass类包含三个参数,BitBlt、CreateDC、GetScreenImage。其中GetScreenImage是捕捉当前屏幕图像的关键类,也是设置监控对比图形的基础。
public static Bitmap GetScreenImage(Point point01, Point point02, bool full)
{
//创建显示器的DC
IntPtr dc1 = CreateDC(“DISPLAY”, null, null,(IntPtr)null);
//由一个指定设备的句柄创建一个新的Graphics对象
Graphics g1 = Graphics.FromHdc(dc1);
Bitmap MyImage;
int width, height;
if(full)
{
电子科技大学学士学位论文
width = Screen.PrimaryScreen.Bounds.Width;
height = Screen.PrimaryScreen.Bounds.Height;
}
else
{
width = point02.Xpoint01.Y;
}
//根据指定的宽度和高度创建一个与之相同大小的Bitmap对象
MyImage = new Bitmap(width, height, g1);
//获得屏幕的句柄
Graphics g2 = Graphics.FromImage(MyImage);
//获得位图的句柄
IntPtr dc3 = g1.GetHdc();
//把当前屏幕捕获到位图对象中
IntPtr dc2 = g2.GetHdc();
//把当前屏幕拷贝到位图中
BitBlt(dc2, 0, 0, width, height, dc3, point01.X, point01.Y, 13369376);
//释放屏幕句柄
g1.ReleaseHdc(dc3);
//释放位图句柄
g2.ReleaseHdc(dc2);
return MyImage;
} 设置好监控对比图形之后,程序自动将图形保存在debug文件目录下,命名为BASE。实现语句如下:
private void 设置监控对比图形button_Click(object sender, EventArgs e)
{
camera.SaveImage(“BASE.bmp”);
}
第四章 软件实现
(2)色差、限差、监控间隔、延迟时间等参数设定。
设置好监控对比图形之后,可以就自身需求设定参数值,以期达到最佳的监控效果。参数的设定给出了监控的弹性范围,降低系统因过度敏感发生误报,或是敏感度不够造成漏报的现象。
①色差设定。为了防止因为细微的环境变化而导致误报的现象,因此需要一定的阈值范围来判断画面是否发生变化。当图像变化的颜色差值大于该色差值时,判断有可能出现变化,该值越小则要求图像变化越小,即要求越严格。
string tempStr;
tempStr = ini.ReadValue(“Values”, “色差”);
int tempInt;
if(int.TryParse(tempStr, out tempInt))
{
LimitedValue = tempInt;
colorTrackBar.Value = tempInt;
limitedColorlabel.Text = tempInt.ToString();
} ②限差设定。限差用于控制图像中变化比率ratio,当超过该值时开始报警,即当图像出现ratio%的变化时程序认为出现异常,该值越小要求图像变化越小。
tempStr = ini.ReadValue(“Values”, “限差”);
if(int.TryParse(tempStr, out tempInt))
{
LimitedRatio =(double)tempInt/100;
ratioTrackBar.Value = tempInt;
ratiolabel.Text = tempInt.ToString();
}
③监控间隔设定。监控间隔即每隔多长时间进行一次监控分析。最小值为100ms,值越小,其监控分析的频率越高,同时CPU使用率越高。private void monitortrackBar_Scroll(object sender, EventArgs e)
{
MonitorTime = monitortrackBar.Value;
monitorlabel.Text = monitortrackBar.Value.ToString();
电子科技大学学士学位论文
if(ini!= null)
ini.WriteValue(“Values”, monitortrackBar.Value.ToString());
monitorTimer.Interval = monitortrackBar.Value * 100;
} ④延迟时间设定。
private void delaytrackBar_Scroll(object sender, EventArgs e)
{
delaylabel.Text = delaytrackBar.Value.ToString();
if(ini!= null)
ini.WriteValue(“Values”, “延迟”, delaytrackBar.Value.ToString());
}(3)视频内容变化识别
即时捕获图像保存为TEMP文件,则是为了实现入侵对象的抓取。该程序自动将监控对比图形赋值到firstMap中,而摄像头捕获的图形赋值到secondMap中。color1和color2分别作为firstMap和secondMap的两个参数。GetPixel是用于获取像素的一个主要函数,除了宽destWidth高destHeight之外,还有三个参数tempR,tempG,tempB,分别用于存储图形的红、绿、蓝的颜色信息。那么通过比对这三对数值,若发生了改变,说明出现了色差,则证明了视频监控的范围内有可能遭到了入侵。
而比对三对R、G、B三对数值的方法有两种,一是基于单个色差,对R、B、G的数值进行一一对比。
tempR = Math.Abs((int)color01.R(int)color02.G);tempB = Math.Abs((int)color01.B(int)color02.R);
tempG = Math.Abs((int)color01.G(int)color02.B);
if(colorType)
{
if(tempR > LimitedValue)
“色差方式”,电子科技大学学士学位论文
{
tempCount++;
}
else if(tempG > LimitedValue)
{
tempCount++;
}
else if(tempB > LimitedValue)
{
tempCount++;
}
}
else
{
if(tempR + tempG + tempB > limitedValue3)
tempCount++;
}
}
}(4)开始监控
设置好以上参数,点击“开始监控”后,系统立即进入监控状态。如果之前没有设置对比监控图形,将会弹出相应的窗口提醒用户进行设置。
private void 开始监控button_Click(object sender, EventArgs e)
{
if(monitorTimer.Enabled)
{
开始监控button.Text = “开始监控”;
if(mp3!= null)
mp3.StopT();
monitorTimer.Enabled = false;
}
else
第四章 软件实现
{
if(System.IO.File.Exists(“BASE.bmp”))
{
int tempInt = delaytrackBar.Value * 1000;
System.Threading.Thread.Sleep(tempInt);
baseImage = new Bitmap(“BASE.bmp”);
开始监控button.Text = “停止监控”;
mp3 = new MP3Class();
mp3.FileName = “Alarm.mp3”;
monitorTimer.Enabled = true;
}
else
{
MessageBox.Show(“还没有设置监控对比图形!n请先设置监控对比图形!”,“MessageBoxIcon.Warning);
}
}
}
提
示
”,MessageBoxButtons.OK, 4.2.3 报警功能的设计与实现
本文在前面给出了关于基于视频内容敏感区入侵检测的方案,使得监控设备能准确而有效地追踪到进入到监控区域的异常物体,并能做出反应。但是对于背景画面受到污染,监控人员必须通过肉眼观察屏幕是否有异常入侵,在报警方式上缺乏主动性和实时性。为了防止事后需要监控人员查阅大量的视频数据,因此监控系统还应该具备相应的实时报警功能,这也是智能视频监控相对于传统监控系统较先进的方式。
下面就报警功能的需求分析、两种报警方式的实现做具体说明。
电子科技大学学士学位论文
4.2.3.1 报警功能的需求分析
报警系统作为视频监控系统的重要组成部分,发挥着至关重要的作用,特别是针对本课题的一体化监控系统。目前的报警系统多为一台报警主机和一些前端报警设备组成。前端报警器能够快速、准确地检测出现场的异常状态,经分析后将分析得到的结果及时有效地传送到系统控制主机。系统控制主机可自动判别报警信号来源,自动生成报警并响应。系统还可以通过视频、音频设备接收现场视频的图像和声音信号,全面了解视频敏感区的现状。综合这些信息可以为监控人员提供判断报警信号的可靠性和严重性提高了必要的依据。
报警系统在设计过程中应该考虑到以下功能需求:
1)系统具备自检功能,前端报警器或传输线路发生故障时应产生报警信号,并自动通报给控制主机;
2)系统可按设定的报警规则自动产生报警响应,如打开或关闭警报设备(包括警铃、现场辅助光源等),自动拨打110或119报警,避免由于人为延误造成的损失;
3)系统应支持人工手动方式的报警响应,对那些需要经过多方核实后方可采取行动的报警信号,操作人员可采取手动报警响应模式;
4)系统需要将前端设备的响应记录在案(包括响应的方法、日期时间)、生成日志文件,以备日后查询。
本系统实现的是一个简易的智能视频监控报警系统,因此在报警功能的设计的功能实现比较简单。当视频监控区域有侵入行为发生时,记录下被监视场所的视频图像的同时,实现了两种形式的报警,一是通过监控主机直接发出警报声,另外是通过发送入侵相关邮件到指定邮箱,实现远程实时监控。以下就两种监控方式分别做说明。
4.2.3.2 发出报警铃音的功能设计
该程序主要设置了三个枚举变量play、pause、StopT,分别定义报警信号的播放、暂停、停止,用MP3Class类来控制。在收到控制主机发送过来的信号后,做出相应的操作。
第四章 软件实现
图4-4 MP3Class类
关键的实现代码如下:
//播放
public void play()
{
TemStr = “";
TemStr = TemStr.PadLeft(127, Convert.ToChar(” “));
APIClass.mciSendString(”play media“, TemStr, TemStr.Length, 0);
mc.state = State.mPlaying;
}
//停止
public void StopT()
{
TemStr = ”“;
TemStr = TemStr.PadLeft(128, Convert.ToChar(” “));
ilong = APIClass.mciSendString(”close media“, TemStr, 128, 0);
ilong = APIClass.mciSendString(”close all“, TemStr, 128, 0);
mc.state = State.mStop;
}
///
/// 暂停
///
public void Pause()
{
TemStr = ”“;
TemStr = TemStr.PadLeft(128, Convert.ToChar(” “));
电子科技大学学士学位论文
ilong = APIClass.mciSendString(”pause media“, TemStr, TemStr.Length, 0);
mc.state = State.mPuase;
}
private string GetCurrPath(string name)
{
if(name.Length < 1)return ”“;
name = name.Trim();
name = name.Substring(0, name.Length-1);
return name;
} } 4.2.3.3 发出报警邮件的功能设计
该课题发出报警邮件的功能,主要是通过SMTP邮件传输报警信号到指定邮箱实现的。SMTP 独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。SMTP 重要特性之一是其能跨越网络传输邮件,即“SMTP 邮件中继”。通常,一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非 TCP传输层协议组成。使用 SMTP,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。所以符合该视频监控系统的各方面需求。
TCP/IP Internet背景更新目标分割视频编码及传输背景图像摄像头目标模板生成截图存储t帧图像运动区域检测报警处理
图4-5 基于视频的入侵检测系统框图
第四章 软件实现
(1)SMTP发送邮件过程
SMTP的命令和响应都是基于文本,以命令行为单位,换行符为CR/LF。响应信息一般只有一行,由一个3位数的代码开始,后面可附上很简短的文字说明。
SMTP要经过建立连接、传送邮件和释放连接3个阶段。具体为: 1)建立TCP连接。
2)客户端向服务器发送HELLO命令以标识发件人自己的身份,然后客户端发送MAIL命令。
3)服务器端以OK作为响应,表示准备接收。4)客户端发送RCPT命令。
5)服务器端表示是否愿意为收件人接收邮件。
6)协商结束,发送邮件,用命令DATA发送输入内容。7)结束此次发送,用QUIT命令退出。
SMTP服务器基于DNS中的邮件交换(MX)记录路由电子邮件。电子邮件系统发邮件时是根据收信人的地址后缀来定位邮件服务器的。SMTP通过用户代理程序(UA)完成邮件的编辑、收取和阅读等功能;通过邮件传输代理程序(MTA)将邮件传送到目的地。
初始化摄像头程序摄像头程序初始化成功N退出摄像头监控程序Y有待发送的报警信息Y发送报警邮件N
图4-6 邮件报警系统处理流程
(2)SMTP邮箱信息设置
报警邮件包含MailInfo和MailForm两个类。其中MailInfo是邮件基本信息的设置,包括发件人邮箱、发件人邮箱密码、收件人邮箱、邮件SMTP主机选择、邮件内容等。SMTP主机可选择smtp.163.com、smtp.qq.com、smtp.gmail.com三种形式。
电子科技大学学士学位论文
图4-7 邮件类信息
设置邮件基本信息。①设置邮件主题
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(19, 22);
this.label5.Name = ”label5“;
this.label5.Size = new System.Drawing.Size(41, 12);
this.label5.TabIndex = 6;
this.label5.Text = ”主题:“;②设置邮件内容
this.groupBox1.Controls.Add(this.mailBodyrichTextBox1);
this.groupBox1.Controls.Add(this.mailSubjecttextBox4);
this.groupBox1.Controls.Add(this.label5);
this.groupBox1.Location = new System.Drawing.Point(3, 124);
this.groupBox1.Name = ”groupBox1“;
this.groupBox1.Size = new System.Drawing.Size(258, 179);
this.groupBox1.TabIndex = 22;
this.groupBox1.TabStop = false;
this.groupBox1.Text = ”邮件内容:“;③设置发件人邮箱
this.label1.AutoSize = true;
第四章 软件实现
this.label1.Location = new System.Drawing.Point(22, 9);
this.label1.Name = ”label1“;
this.label1.Size = new System.Drawing.Size(77, 12);
this.label1.TabIndex = 14;
this.label1.Text = ”邮箱用户名:“;④设置发件人邮箱密码
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(27, 37);
this.label2.Name = ”label2“;
this.label2.Size = new System.Drawing.Size(65, 12);
this.label2.TabIndex = 17;
this.label2.Text = ”邮箱密码:“;⑤设置收件人邮箱
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(22, 90);
this.label4.Name = ”label4“;
this.label4.Size = new System.Drawing.Size(77, 12);
this.label4.TabIndex = 19;
this.label4.Text = ”收件人邮箱:“;⑥设置邮件SMTP主机
this.SMTPAddresscomboBox1.FormattingEnabled = true;
this.SMTPAddresscomboBox1.Items.AddRange(new object[] {
”smtp.163.com“,”smtp.qq.com“,”smtp.gmail.com“});
this.SMTPAddresscomboBox1.Location System.Drawing.Point(105, 61);
this.SMTPAddresscomboBox1.Name = ”SMTPAddresscomboBox1“;
this.SMTPAddresscomboBox1.Size = new System.Drawing.Size(142, 20);
this.SMTPAddresscomboBox1.TabIndex = 15;
this.SMTPAddresscomboBox1.Text = ”smtp.163.com“;
= new
电子科技大学学士学位论文
邮件内容设置好后,将会查看到如下邮件设置信息。
图4-8 邮件设置信息
(2)SMTP发送邮件的实现
在设置好邮件信息后,勾选主界面“发送邮件”选项,则实现了发送报警邮件的功能。其中,TEMP2是监控状态下,监控画面发生异常时捕获的视频图像。在监控区域发生入侵时,若主机在联网状态下,系统将自动将入侵图片TEMP2发送到关联邮箱。若是没有将邮件的信息填写完整,将对应弹出对话框提醒用户。private void 设置邮箱button_Click(object sender, EventArgs e)
{
MailForm form = new MailForm();
if(form.ShowDialog()== DialogResult.OK)
{
EmailInfo = form.emailInfo;
EmailInfo.AttachFilePath ”TEMP2.bmp“;
}
}
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if(ini!= null)
ini.WriteValue(”Values“, checkBox2.Checked.ToString());
= Application.StartupPath +
”发送邮件“,第四章 软件实现
}
private void button3_Click(object sender, EventArgs e)
{
if(EmailInfo!= null)
EmailInfo.Send();
else
MessageBox.Show(”没有设置邮箱!请先设置邮箱!“, ”提示!",MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
本章主要介绍了软件各模块的具体实现代码,实现了摄像头监控系统的视频监控并实时报警的功能。选择基于RGB颜色的内容识别方式,并提出色差、限差两个维度来控制监控识别的效果,提高了系统对复杂环境的适应能力。在报警方式上,除了由监控主机发出报警铃音外,还新增了发送报警邮件的功能,进一步实现了该系统的实时性。
电子科技大学学士学位论文
第五章 测试
5.1 系统测试相关理论
(1)系统测试的目标和任务
按照系统开发的总思路,在系统各模块及相应接口等软件设计完成后,有必要对系统的完整性、有效性、可操作性及正确性进行测试,以确保软件投入运行后能充分体现其先进性。软件测试是确保软件开发质量的重要手段,它也是对开发需求能否完整实现的检验,它也是对系统总体设计及相关编码正确性的最后复核。
系统软件开发的目的是为用户提供满足使用要求,确保使用质量的高性能产品。监督和管理信息系统的开发是与系统安全性密切结合的,是一个复杂的系统工程。在开发过程中,各模块的开发难免会存在一些接口问题,在操作实施过程中也不可避免地会产生错误,为解决这些问题和错误必须对已开发完成的系统软件进行实地运行与测试,真正实现系统投用后的正确性和可操作性,真正使系统功能的发挥,达到设计的目的。
(1)测试的方法
软件测试的方法一般有两种,即功能测试和结构测试两种。功能测试采用完全不考虑程序的内部结构和处理过程,以开发的程序是否能适时地接收输入数据并产生正确的输出信息,完成设计规定的功能。结构测试必须完全了解程序的结构和处理过程,了解与相关工艺的相互衔接,按照已编程序内部的逻辑测试程序检验程序中每个通路,是否按预先的设置正确工作。
(3)测试的原则
1)软件测试一般应遵行以下一些原则: 2)必须与现场的系统操作员相结合; 3)测试应编制好详细的测试工作计划; 4)测试应分块、分阶段进行; 5)测试应考虑相关数据的误输入;
6)测试必须有输入数据和预输出结果两部分;
7)所有测试必须都应追溯到现场工作完成后预期功能,以确保整个系统处于
第五章 测试
安全、正常运转状态;
5.2 摄像头监控程序软件描述
(1)软件描述
软件名称:摄像头监控程序。
实现目标:为用户提供简单、方便、一体化的视频敏感区入侵检测报警体系,便于实时报警和远程管理。
软件使用领域:本软件适用于本地用户,暂不适合网络应用。(2)一般约束
本项目开发过程中的约束如下:
1)管理方针:严格贯彻加强项目开发过程管理的指导思想,文档撰写和程序设计执行《计算机软件开发工程规范2003》相关的国家标准。
2)软件约束:系统平台为WindowsXP sp2,开发平台使用Visual Studio 2010,目标框架.NET Framework,开发语言使用C#。3)使用环境假设:本地计算机。4)与其它应用间的接口:无。
5)并行操作:服务器端均提供并行操作的能力。6)控制功能:提供图形界面对系统进行控制管理。7)所需开发语言:C#。(3)假设和约定
软件客户端假定为Windows系统和安装了Visual Studio 2010的系统,所开发的客户端只能在此系统下安装运行,暂不支持其他操作系统。
(4)软件功能
摄像头控制:包括启动摄像头,关闭摄像头,启动监控系统等。摄像头显示:摄像头摄入内容显示,界面的控制。
输出:包括保存当前图像,发出入侵报警音,发送入侵邮件等。
远程监控实现:发送入侵邮件到指定邮箱。
电子科技大学学士学位论文
5.3 功能测试
5.3.1 启动摄像头功能测试
此次课题将测试地点定为教学楼C区108教室,从多个角度测试该视频监控系统的性能。如设定不同的色差、限差值来测试系统的灵敏度。
启动程序后笔记本电脑的摄像头自动打开,并跳转到程序主界面。
图5-1 启动摄像头
如图显示摄像头成功启动,并能准确捕获视频图像显示在荧幕上。屏幕不闪,画面固定,性能稳定。选定好一个角度之后,接下来就可以开始实现具体的监控环节。
5.3.2 监控对比图形的设置测试
点击界面上的“设置监控对比图形”的控件之后,系统默认将当前摄像头摄入的图形为监控对比图形,并存储在debug下,命名为BASE。这个操作是设定背景图形。该系统提供给用户自定义背景图形的功能,使得该系统的移植性和适应性大大增强。用户可以根据自己的需求,在需要的场合安装好摄像头,开启该程序之后就可以立即启动监控。
第五章 测试
图5-2 保存当前截图图片
测试成功。设置好监控对比图形之后,就可以对视频区域进行监控了。
5.3.3 视频敏感区入侵测试
根据需要设定好色差、限差、监控间隔、监控延迟之后,点击“开始监控”之后,程序处于监控状态。测试人员要小心不要走入到监控画面内即可。
测试时,设定初始色差为4,限差为10,监控间隔为50ms。以单个色差方式对入侵物体进行捕获。
(1)在没有入侵的情况下,监控画面正常,没有发出警报。系统稳定性测试成功。
电子科技大学学士学位论文 图5-3 没有入侵情况
(2)入侵发生测试
为了方便测试,笔者在监控区域内放置了一个棕绿相间的书包。
系统检测到异常情况,程序很快启动,在窗口界面弹出“监控发现异常!”的提醒外,也发出报警信号音报警。铃音正常作响,警铃报警方式测试成功。
图5-4 发生入侵情况
5.3.4 邮件发送测试
分别对邮件的各方面填写不完全进行测试,查看系统在应对各种不同状况时给出的反应。于是分为以下四种:未填写发件人邮箱、未填写发件人邮箱密码、未填写收件人邮箱、控制主机未联网状态分别进行测试。
1.当未填写发件人邮箱时:
第二篇:防盗报警与视频监控系统联动
防盗报警系统
安防报警主机接收分析各无线探测器发送过来的触发信号,并可智能化地进行报警工作:启动摄像头进行拍照、发送报警短信和彩信、拨打用户报警电话和中心报警电话、联动相应开关、联动监控设备进行录像。
以下为系统各个组件的功能:
·报警主机:接收分析各无线探测器发送过来的触发信号,并可智能化地进行报警工作:启动摄像头进行拍照、发送报警短信和彩信、拨打用户报警电话和中心报警电话、联动相应开关。
·无线红外探测器:安装在室内需要监控位置,当人非法进入时,红外探测器触发主机报警。
·无线气感探测器:安装在厨房或浴室,一旦有燃气泄漏,即触发主机报警。
·无线烟雾探测器:安装在客厅或厨房位置,当住户发生火灾时,探头探测到烟雾,即触发主机报警。
·无线紧急按钮:当家中有紧急事情发生如重病,或有盗贼闯入,需要求助时按动紧急按钮,即触发主机报警。
·无线门磁探测器:安装在需监控的门框或窗户上,当有人非法打开大门或窗门时,即触发主机报警。
·摄像头:与主机有线连接,安装在室内需视频监控的位置,当主机报警或视频移动侦测启动时,立即拍摄现场图片。
安防联网中心系统
系统报警时,主机拨打设置好的主人电话外,还拨打夜狼安防联网中心电话和派出所110接警监控中心,夜狼安防联网中心可显示用户的资料及触发报警的探测器信息,并在监控显示屏上弹出显示用户详细地理位置的地图,以便接警中心快速获得最准确的信息。本系统有如下特征:
·接收、识别、记录报警信号
·强大的用户数据库管理功能
·电子地图及万能显示板
·完善的操作员权限、数据维护功能
·多媒体功能特征
报警联动视频监控系统
系统特点
·广泛性:非常适合现代家庭安全防范的需求,系统集防盗、防火、视频监控于一体,使每个家庭都能得到保护。
·实用性:系统能在实际可能发生受侵的情况及时自动报警,并且操作简便,环节少,易学易用,不需要增加更多设备。
·系统性:在案情发生时,除能现场报警外,能自动进行录像,能发送报警短信和现场图片的彩信,同时联动报警器还自动拨打用户的指定手机,固定电话或将警情传到小区的保安报警中心。
·可靠性:该系统结构设计合理,产品耐用、质量可靠、并实现报警后通过现场视频验证。
·移动性:系统中报警部分采用GSM无线移动网络进行数据传输,可安装在家中任何可以接收GSM网络信号的位置,不受布线的限制,而且移动更方便;视频监控只需接入家中的宽带网络即可。
·功能强大:系统不但可以远程视频监控、录像,还可以远程监听,异地布防撤防、遥控启动家用电器开关等功能、兼容性强、可兼容各类型有线、无线探头,集防盗、紧急求助、防煤气泄漏、火灾自动报警于一体。
防盗报警联动视频监控系统的现实意义
1.满足客户对报警服务业的期望
家庭的安全,是每个人都重点关心的话题。在以往外出收到警情,却不知道具体发生什么事情的时候,人们都会感到极其担心,都希望第一时间赶回家处理。而如今夜狼安防提供报警联动视频监控系统,在外的人收到警情后,可以远程实时视频监控,实时掌握家里现场的情况,为温馨的家庭又增添了一份关怀。
2.对报警服务单位的工作进行优化
对于报警服务单位来说,这将是一个重大的技术升级,极大地提升了工作效率和监控效果。从以往的电话拨号形式,到现在实时的视频监控现场。报警服务单位即可有效地掌握警情的处理过程,同时可以高效地安排资源。通过报警触发录像功能,将现场的警情记录起来,作为破案的有力证据。通过产品系统的升级,更能显现报警服务业的重要性和必要性,这将是推动行业高速发展的助力器。
3.达到政府对特殊行业的要求
国务院在前年就颁发了《娱乐场所管理条例》,明确规定:歌舞娱乐场所应当在营业场所的出入口、主要通道安装闭路电视监控设备,并保证闭路电视监控设备在营业期间正常运行,不得中断。
对于其他相关在公共场所经营的行业,也有相应条例要求安装视频监控。因此,作为报警服务单位,在提供防盗报警、视频监控的同时,还提供警情协管的支持,为人民群众提供了一个安全的活动环境,让经营管理者安心无忧。
第三篇:基于A8的嵌入式Linux远程视频监控系统的设计与实现
基于A8的嵌入式Linux远程视频监控系统的设计与实现
摘 要:将网络技术和嵌入式技术相结合的远程视频监控系统是视频采集技术的发展趋势,文中提出了一种基于对等网络模型的嵌入式远程视频监控系统的设计方案。该方案将嵌入式系统和Web开发技术相结合,再利用USB摄像头作为视频监控系统的终端进行图像采集,并使用网络TCP协议将其远程发送给服务器终端。相较于传统的Client/Server网络模型,本系统实现采用对等网络模型,即确定发送命令的控制程序既可以是客户端,又可以是服务端。文中选择嵌入式开发平台ARM系列A8处理器进行研究和设计,并采用PC机下的Linux系统作为主机开发环境。
关键词:嵌入式;视频监控;网络远程控制;对等网络
中图分类号:TP39 文献标识码:A 文章编号:2095-1302(2016)05-00-03
0 引 言
网络远程控制(Network Remote Control,NRC)是利用计算机网络对远程计算机进行操作的一种控制方式。计算机技术和网络技术目前都在高速发展,现在监控系统已经发展到网络视频监控系统[1]。网络视频监控具有数字视频监控和网络传输技术的优点,其具有不受地理位置约束、扩展方便简单、信息处理较容易等特点,可以使远程的管理和维护变成现实,只要是网络覆盖的地方,就能实现网络监控[2]。嵌入式系统向网络发展已成必然趋势,目前嵌入式系统对网络协议如TCP/IP协议和HTTP协议的支持也越来越广泛。系统硬件设备选择与配置
系统硬件设备选择凌阳嵌入式A8教学实验系统进行设计与实现。该实验箱基于ARM CortexTM-A8内核的处理器S5PV210,该芯片又名“蜂鸟”(Hummingbird),是三星公司推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器[3]。本系统使用了人机交互模块的USB接口、多媒体模块摄像头接口及通信模块以太网接口。
1.1 USB摄像头
摄像头属于视频类设备。在目前的Linux核心中,视频部分的标准是Video for Linux(简称V4L)。这个标准其实定义了一套接口,内核、驱动、应用程序以这个接口为标准进行交流。目前的V4L涵盖了视、音频流捕捉及处理等内容,USB摄像头也属于它支持的范畴。
本系统所采用的嵌入式Linux操作系统如果需要使用USB摄像头则必须在内核配置时添加Video4Linux驱动和对USB摄像头驱动模块的支持。本系统的设计与实现采用静态加载以上驱动。首先进入Linux源代码所在的目录,在终端输入make menuconfig命令,在基于Ncurses内核配置图形界面进行内核选项的配置。选中多媒体设备选项“Multimedia device->”,进入多媒体设备配置界面,选中“Video For Linux”,加载Video4Linux模块,就可以使内核实现对Video4Linux驱动的支持,为视频采集设备提供编程接口。在内核配置主界面,选中USB支持选项“USB support―>”,选中“USB Multimedia device”选项下的“USB OV511 Camera support”,使内核中加入OV511接口芯片的USB数字摄像头的驱动支持。OV511 USB 摄像头驱动配置界面如图1所示。
图1 OV511 USB 摄像头驱动配置界面
1.2 开启帧缓冲设备
帧缓冲(Frame Buffer,FB)是Linux为显示设备提供的一个接口,是把显存抽象后的一种设备,它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。由于FB设备驱动为受限驱动,因此必须进行设备开启。本系统开发环境采用发行版Linux操作系统Ubuntu10.10,Ubuntu下启用FB设备的一般步骤如下所示:
安装v86d和hwinfo两个包查看显卡是否支持,并设置本机支持模式。
修改启动文件/etc/default/grub,如图2所示。
图2 修改启动文件图
修改modules文件/etc/initramfs-tools/modules,如图3所示。
图3 修改modules文件
更新以上两个文件并重启系统,即可查看到FB设备,具体如图4所示。
图4 查看FB设备系统软件设计
本系统软件由摄像头驱动模块、图像采集模块、网络传输模块和网络服务器模块组成[4]。摄像头驱动模块使得摄像头为应用程序编写提供系统编程接口。功能主要包括摄像头设备信息的获取与设置、设备的打开和关闭、信号通道选择、窗口初始化等。图像采集模块的作用是使用编程接口获取摄像头采集来的图像信息并进行暂时存储。服务器通过网络传输模块与远程监控PC机端进行信息交流。
2.1 V4L图像信息采集流程
V4L图像信息采集流程分为如下几步:
(1)打开摄像头设备
int vd->fd = open(“/dev/video0”,O_RDWR);
(2)读video_capability 中的信息,成功后可读取vd->capability各分量ioctl(vd->fd,VIDIOCGCAP,&(vd->capability));
(3)读video_picture中的信息,成功后可读取图像的属性ioctl(vd->fd,VIDIOCGPICT,&(vd->picture));
(4)初始化channel
int i;
for(i = 0; i capability.channels; i++){
vd->channel[i].channel = i;
第四篇:数字图像课程设计 监控视频中道路车流量检测系统设计
山东建筑大学
课 程 设 计 说 明 书
题
目:
课
程:
院(部):
专
业:
班
级:
学生姓名:
学
号:
指导教师:
完成日期:
监控视频中道路车流量检测系统设计
数字图像处理课程设计
信息与电气工程学院
电子信息工程
电信
2013年6月
山东建筑大学信息与电气工程学院课程设计说明书
目录
摘要································································································II 1 设计目的························································································1 2 设计要求············
··················································1 3 设计内容························································································2 3.1运动车辆检测算法比较································································ 2 3.2形态学滤波·················································································5 3.3车辆检测···················································································6 3.4车辆计数···················································································9 3.5软件设计····················································································9 总结与致谢·························································································10 参考文献····························································································11 附录···································································································12
I 山东建筑大学信息与电气工程学院课程设计说明书
摘 要
获得实时的交通信息是当前各种检测方式的前提,但是现有的信息采集方式并不能满足交通管理与控制的需求。随着计算机技术的快速发展,基于视频的检测技术在交通中得到了广泛的应用,同其它检测方式相比,它具有检测范围大、设置灵活、安装维护方便、检测参数多等优点。基于图像处理的视频检测方式近年来发展很快,已成为当今智能交通系统的一个研究热点。本论文对视频交通流运动车辆检测的内容进行了深入地研究。结合视频图像详细的介绍了视频检测中的背景更新、阴影去除、车辆分割等关键技术和算法,介绍了视频检测的方法。最后在MATLAB的平台上进行了系统实现设计。实验结果表明,该算法具有一定的可行性,能够快速的将目标参数检测出来
关键词:MATLAB;帧间差法;车辆检测
II 山东建筑大学信息与电气工程学院课程设计说明书 设计目的
随着经济的发展,人民生活水平的提高,汽车保有量大幅增加,怎样安全高效地对交通进行管理,就显得非常重要.解决这一问题的关键是建立智能交通系统(ITS),其中车辆检测系统是智能交通系统的基础.它为智能控制提供重要的数据来源
作为ITS的基础部分,车辆检测系统在ITS中占有很重要的地位,目前基于视频的检测法是最有前途的一种方法,它是通过图像数字的方法获得交通流量信息,主要有以下优点:(1)能够提供高质量的图像信息,能高效、准确、安全可靠地完成道路交通的监视和控制工作.(2)安装视频摄像机破坏性低、方便、经济.现在我国许多城市已经安装了视频摄像机,用于交通监视和控制.(3)由计算机视觉得到的交通信息便于联网工作,有利于实现道路交通网的监视和控制.(4)随着计算机技术和图像处理技术的发展,满足了系统实时性、安全性和可靠性的要求 设计要求
通过对视频流中的车辆进行检测和跟踪,准确地统计每个车道流量、平均车速、平均车道占有率、车队长度、平均车间距等信息为交通规划,交通疏导和车辆动态导航领域提供一系列指导。
设计车辆检测与识别方法和车流量统计方法,实现监控视频中道路车流量检测。通过实验验证检测精度。山东建筑大学信息与电气工程学院课程设计说明书 设计内容
3.1运动车辆检测算法比较
目前,大多数的运动目标检测的方法或是基于图像序列中时间信息的,或是基于图像序列中空间信息的。常见的方法有如下3种:(1)光流法
当目标运动时,图像上对应目标的亮度信息(光流)也相应的运动。这样,根据时间上相邻的几帧图像可以计算出各像素点运动的大小和方向,从而利用运动场来区分背景和运动目标。其主要优点在于能检测出独立的运动目标,而不需预知场景的任何信息,对变化的复杂背景情况有较好的适应。但其缺点也很明显,由于要依赖光流估计的准确程度,大多数计算方法相当复杂并且计算量特别大,所以除非有特殊的硬件支持,否则很难实现实时检测。(2)背景减法
将实时视频流中的图像像素点灰度值与事先已存储或实时得到的视频背景模型中的相应值比较,不符合要求的像素点被认为是运动像素。这是视频监控中最常用的运动检测方法。这种方法虽然能较完整的提取运动目标,但对光照和外部条件造成的环境变化过于敏感,常常会将运动目标的阴影错误的检测为其自身的一部分。同时由于时间流逝,实际场景的多种因素都会发生变化,比如停留物的出现、光线等的变化、运动目标对背景的遮挡等等,背景需要得到实时地更新,这是影响其检测效果的一个重要因素。背景差分算法的实质是:实时输入的场景图像与背景图像进行差分,可以较准确的分割出运动目标。但是背景差分算法也有其天然的缺陷,随着时间的推移,场景的光线、树叶的遮挡、或者运动物体滞留都会很大程度的破坏已经建立好的背景图像。为了解决这些问题,最好的方法便是使用背景建模和背景更新算法来弥补。前面已经讨论过相关问题,因此,本文假设背景处于理想情况下进行背景差分算法的研究。基于背景减法的MATLAB仿真,如图 山东建筑大学信息与电气工程学院课程设计说明书
Surendra算法计算出背景图像,左图为原始输入图像,中图为背景图像,右图为背景差分法得出的二值化图像。实验结果表明:背景差分算法也可以有效地检测出运动目标。由于背景建模算法的引入,使得背景对噪声有一定的抑制作用,在差分图像中“雪花”较帧间差分算法有所减少。同时,使用背景差分算法检测出的运动物体轮廓,比帧间差分法的检测结果更清晰。因此,在背景建模与背景更新处于比较理想的状态下,背景差分算法得到的结果略好于帧间差分的结果。(3)帧间差法
帧间差法是根据当前图像与参考图像的差别来获得运动目标轮廓的方法。这种方法对于场景中的光线渐变不敏感,适于动态变化的环境,且运算量相对较小。但一般不能完整的提取运动目标,且在运动实体内易产生空洞现象,从而不利于下一步的分析和处理。
2.2.1 帧间差法运动目标检测
基于帧间差分的运动检测即帧差法,它根据相邻帧或隔帧图像间亮度变化的大小来检测运动目标,选取T=20,仿真结果如下图: 山东建筑大学信息与电气工程学院课程设计说明书
由上面的仿真实验可以得出:运用帧间差分方法进行运动目标的检测,可以有效的检测出运动物体。右子图中,可以比较清晰地得到运动物体的轮廓。但是,这种算法虽然可以使背景像素不随时间积累,迅速更新,因此这种算法有比较强的适应场景变化能力。但是帧差法表示的是相邻两帧同位置的变化量,因此很有可能将比较大的运动目标,或者运动目标内部颜色差异不大的像素判断错误,在实体内部产生拉伸、空洞现象。而且当前景运动很慢且时间间隔选择不合适时,容易出现根本检测不到物体的情况。在差分图像中,有很多“雪花”般的噪声,这些是由于图像局部的干扰造成的。使用帧间差分法,需要考虑如何选择合理的时间间隔,这一般取决于运动目标的速度。对于快速运动的目标,需要选择较短的时间间隔,如果选择不当,最坏情况下目标在前后两帧中没有重叠,被检测为两个分开的目标;对于慢速运动的目标,应该选择较长的时间间隔,如果选择不当,最坏情况下目标在前后两帧中几乎完全重叠,根本检测不到目标。此外,在场景中由于多个运动目标的速度不一致也给时间间隔的选取带来很大麻烦。山东建筑大学信息与电气工程学院课程设计说明书
3.2形态学滤波
由于刮风、气流等原因,背景中部分物体小幅度晃动;光线的变化等不确定因素,会使得视频图像产生大量噪声,当差值图像二值化后,仍然有很多无用的噪声斑点,因此,需要采用数学形态学方法,对分割后的二值图像进行形态学滤波。数学形态学的主要用途是获取物体拓扑和结构信息。它通过物体和机构元素相互作用的某些运算,得到物体更本质的形态。其基本思想是:利用一个成为结构元素的“探针”收集图像信息。这种基于探测的思想与人的视觉特点有类似之处:总是关注一些感兴趣的物体或者结构,并有意识地寻找图像中的这些结构。数字形态学在本文所涉及到的图像处理中,主要作用包括利用形态学的基本运算,对图像进行观察和处理,从而达到改善图像质量的目的。形态学的基本运算包括:腐蚀(Erosion)、膨胀(Dilation)、开(Opening)和闭(Closing)运算。用这些算子及其组合来进行图像形状和结构的分析及处理,包括图像分割、特征提取、边界检测、图像滤波、图像增强与恢复等方面的工作。形态学一般以二值图像为处理对象,但也可以用在某些灰度图像的应用中。(1)结构元素
结构元素被形象的称为刷子或探针,是膨胀和腐蚀操作中最基本的组成部分。它用于测试输入图像,通常比待处理图像小得多。本文使用3×3的结构元素,经开运算处理后,可提取出移动物体。二维结构元素由一个数值为0或1矩阵组成。结构元素的原点指定了图像中需要处理的像素范围,结构元素数值为1的点决定结构元素的领域像素在腐蚀或膨胀操作是需要参与计算。(2)腐蚀和膨胀
腐蚀和膨胀是许多形态学算法的基础。腐蚀操作会去掉物体的边缘点,细小物体所有的点都会被认为是边缘点,因此会整个被删去。再做膨胀时,留下来的大物体会变回原来的大小,而被删除的小物体则永远消失了。膨胀操作会使物体的边界向外扩张,如果物体内部存在小空洞的话,经过膨胀操作这些洞将被补上,因而不再是边界了。再进行腐蚀操作时,外部边界将变回原来的样子,而这些内部空洞则永远消失了。山东建筑大学信息与电气工程学院课程设计说明书
(3)开启和闭合
开启就是相对图像进行腐蚀,然后膨胀其结果。闭合就是先对图像进行膨胀,然后腐蚀其结果。开启一般使对象的轮廓变得光滑,断开狭窄的间断和消除细的突出物。闭合同样使轮廓线变得光滑,但是开启相反的是,它通常消除狭窄的间断和长细的鸿沟,消除小的孔洞,并填补轮廓线中的断裂开启。
3.3车辆检测
(1)车辆检测新算法流程 山东建筑大学信息与电气工程学院课程设计说明书
(2)截取检测带
为了提高数字系统处理的实时性的要求,我们只取检测图像中的一部分来进行处理,这个过程我们叫做截取检测带,但是检测带内要包含足够的车辆信息,以满足检测精度的需要.检测带的宽度和高度可以根据需要进行设置,从而保证了算法的通用性和灵活性.检测带的高度:车辆前后间距在图像上大约为40-50个像素,因此检测带高度应小于40-50行,否则会引起误判.又考虑到检测带的高度决定其内包含的总像素数,将直接影响计算量,因此检测带高度不应过高.另一方面,检测带的高度又不能过小,否则带内包含的车辆信息量太少,易受噪声影响,引起误判.综合考虑以上因素,取高度为20行.如下图 山东建筑大学信息与电气工程学院课程设计说明书
(3)提取检测带的数据流以及对数据流的校正
检测带内留下了车辆的信息,如何对这些车辆进行计数?如何判断相邻两帧的车辆信息是否是同一辆车? 以图像宽度为800个像素为例,为了减少数据的运算量以及所需存储器的数目,可选取每10个像素宽的信息生成数据流的一个信息位.为此,定义3个长度为80的一维数组a、b、c,分别表示前一帧数据流、当前帧数据流、两帧数据流之差.若检测带的高度为20个像素,则把每个宽10个像素、高20个像素的浮动窗内像素的灰度值进行累加(∑∑g,g为灰度值),如果累加值大于某个设定的阈值,就将对应的数组元素赋值为‘1’,否则赋值为‘0’.这样就得到了当前图像的反映车辆运动信息的数据流
由于邻域比较可能会造成车辆的一部分信息丢失,甚至产生断带,使获得的数据流在有车辆信息的连续‘1’中,会产生毛刺‘0’.因此需要修正数据流,消除毛刺,得到尽可能连续的‘1’
(1)填1:在两个连续的‘1’段中间产生的毛刺‘0’,其数目与没有车的‘0’数目相比还是很少的,并且与‘1’之间的距离比较小.根据这些特征我们对数据流进行“填1”处理.(2)填0:如果上一帧车头部分进入检测带,邻域比较的结果所提取的车辆信息的‘1’的个数不足判断有新车过来,而当前帧车体进入了检测带,虽然邻域比较的结果所提取的车辆信息的‘1’的个数表明有车辆在,但与上一帧相减的结果始终不足计数,从而造成该车漏检.为了解决这种车辆头部小尾部大造成的车辆误判的问题以及有效消除车前灯的影响,可将这些不足判别车辆信息的‘1’抹‘0’.对于有些车辆由于情况比较复杂,会使相邻两帧的信息变化出现忽多忽少情况,这样就可能出现漏计或误计的现象.为了克服这种现象,利用前后两帧图像相关信息进行修正.笫27帧信息流: ***************00000 第28帧未修正信息流: ***************00000 山东建筑大学信息与电气工程学院课程设计说明书
第28帧修正信息流: ***************00000 第29帧未修正信息流: ***************00000 第29帧修正信息流: ***************00000 3.4车辆计数
由于窗口浮动,这给车辆计数带来一定的困难.为此,笔者提出了用检测带内车辆信息的变化规律进行
计数的方法.其原理如下:如果用当前帧的数据流减去上一帧的数据流则只可能出现4种情况和3种结果:(1)上一帧某一位置没有车,当前帧对应位置也没有车:0减0,结果为0;(2)上一帧某一位置有车,当前帧对应位置也有车:1减1,结果为0;(3)上一帧某一位置没有车,当前帧对应位置有车:1减0,结果为1;(4)上一帧某一位置有车,当前帧对应位置没有车:0减1,结果为-11 显然,结果为‘1’,表示有新车辆到来:结果为‘-1’,表示车辆已离开.利用该结果就可以方便地进行车辆的计数和车速的估算了.其方法如下:(1)利用数据流上升沿‘1’来进行车辆的计数.(2)利用上升沿‘1’
和下降沿‘-1’之间的帧数,根据摄像头的拍摄速度和车辆的长度进行车速的估算.(3)由于噪声的存在,数组c里可能会出现较短的连续‘1’段,为此可根据车辆的最小宽度来选取一个阈值,如:车辆的最小宽度为100个像素,即占数据流信息为10位,就可以选取连续的‘1’段长度大于9计为一辆车.共有多少个连续的、长度大于该选定阈值的‘1’段,就表示新到来了多少辆车.3.5软件设计
据摄像头的本设计采用MATLAB进行程序编写,部分程序见附录 山东建筑大学信息与电气工程学院课程设计说明书
总结与致谢
本次设计设计的系统具有准确率高的特点,该设计能够正确判断有无车辆的信息,在交通拥塞状况不十分严重、车速不太快(车速≤70km/h)的情况下,该算法对车辆计数的准确率很高。但该算法要求车辆速度不是太快。
通过本次课程设计,使我对MATLAB有了更深的掌握和理解,巩固了我在《数字图像处理》课程中所学的基本理论知识和实验技能,使我对《数字图像处理》课程有了更深入的了解,进一步激发了我对所学专业学习的兴趣;
在设计的过程和设计说明书的撰写过程中,指导老师给予了我热心的帮助和大力的支持,给我提了诸多的宝贵意见,拓宽了我的思路。在此我向老师致以崇高的敬意和衷心的感谢!山东建筑大学信息与电气工程学院课程设计说明书
参考文献
[1] 许志影,李晋平.MATLAB及其在图像处理中的应用[J].计算机与现代化,2003(4)[2] 罗军辉,冯平.MATLAB710在图像处理中的应用[M].北京:机械工业出版社,2005.[3] 董长虹,赖志国,余啸海.MATLAB图像处理与应用[M].北京:国防工业出版社,2004.[4] 王家文,李仰军.MATLAB710图形图像处理[M].北京:国防工业出版社,2006 山东建筑大学信息与电气工程学院课程设计说明书
附录1 % Moving object detection ver1.0 2012-10-23 clear all;close all;clc;% read a avi file information, 'cartest.avi' 为待处理的视频文件,格式为.avi fileinfo = aviinfo('cartest.avi');
numFrames = fileinfo.NumFrames;% To avoid consuming too much memories, read only a clip of 200 frames each time clipframes = 200;Clips = floor(numFrames/clipframes);% Read the first frame in the video sequence as the reference background image %在matlab2010 版本中,可采用函数mmreader,详见matlab2010 help Fref = aviread('cartest.avi',10);Iref =Fref.cdata;
% predefine the threshold Threh = 15;% Define a structure element se=strel('disk',3);for m = 1:Clips
% Calculate the start and end frame index of the m-th movie clip
startframe =(mstartframe +1)
Icurr = movclip(k).cdata;
% Calculate the absolute differrence image between the current frame Icurr, % and the referrence frame Iref.Idiff = abs(double(rgb2gray(Iref))-double(rgb2gray(Icurr)));
% motion segment,detection moving object by threholding Idiff
Ifg = Idiff >Threh;% morphological filtering by using IMOPEN ,to remove noise region
% in the segmented result image
Ifg2 = imopen(Ifg,se);
figure(1);山东建筑大学信息与电气工程学院课程设计说明书
subplot(2,2,1), imshow(Icurr),title('Current Image ');
subplot(2,2,2), imshow(Ifg), title('Foreground Image(moving object)');
subplot(2,2,3), imshow(Ifg2), title('filtered by morphological opening operation ');
pause(0.01);
end end山东建筑大学信息与电气工程学院课程设计说明书
附录2
第五篇:基于ARM的视频采集系统的设计与实现
基于ARM的视频采集系统的设计与实现
摘要
本文根据家庭视频采集系统的要求,提出一种基于ARM的网络视频采集方案。方案要求视频的实时传输、实时监控。本系统以Intel Xscale 芯片和嵌入式Linux系统为平台,在平台中搭建网络视频服务器,并以它为中介,负责将USB摄像头采集到得视频数据传输到网络服务器中,最后发送到申请监控的远程PC机中,远程PC只需在网页中便能实时的看到监控端的视频图像。
论文首先阐述了嵌入式网络视频采集技术的发展、现状和前景,然后介绍了嵌入式硬件系统结构和嵌入式Linux操作系统的特点,阐述了嵌入式硬件整体结构,使大家大体的完整的对系统硬件有详细的了解,实际记录了嵌入式操作系统内核的编译和移植,介绍了Bootloader的基本原理和启动过程,实现了视频采集程序的编译和移植,研究了嵌入式一般驱动程序的使用。随后,本文详细描述了视频采集程序的整体结构框图和具体功能代码块、网络通信编程技术、图像编解码、嵌入式视频服。
关键词:ARM;嵌入式;Linux;视频采集
I
目录
摘 要.............................................................................................................................I 第1章 引言.................................................................................................................1
1.1 课题的背景和来源..........................................................................................1 1.2本文的内容及主要工作..................................................................................1 第2章 嵌入式ARM系统硬件结构简介..................................................................3
2.1 视频监控系统结构简介..................................................................................3 2.2 ARM处理器简介.............................................................................................3 2.3 XSCALE体系结构............................................................................................4 2.4 主要硬件电路说明..........................................................................................7 第3章 嵌入式ARM系统软件结构..........................................................................9
3.1 LINUX操作系统简介.......................................................................................9 3.2 交叉编译环境的建立....................................................................................10 3.3 嵌入式LINUX操作系统移植........................................................................11 3.3.1 BootLorder移植...................................................................................11 3.3.2 Linux 内核移植...................................................................................12 3.3.3 嵌入式文件系统.................................................................................13 3.4 LINUX下的程序调试.....................................................................................14 第4章 USB设备驱动程序设计...............................................................................15 4.1 设备驱动程序简介........................................................................................15 4.2 LINUX下驱动程序的实现.............................................................................18 4.3 USB摄像头驱动程序设计............................................................................20 第5章 视频采集功能的设计...................................................................................23 5.1 基于V4L的编程...........................................................................................24 5.1.1 摄像头相关数据结构.........................................................................24 5.1.2 摄像头基本功能实现.........................................................................25 5.1.3 视频数据采集.....................................................................................29 5.2 图像编解码....................................................................................................32 5.2.1 编解码介绍.........................................................................................32 5.2.2 系统压缩技术.....................................................................................33
第1章引言
1.1课题的背景和来源
二十一世纪的网络化、数字化让人们的生活每天都发生着翻天覆地的变化,获取信息的方便和快捷可以使人们在信息化的今天领先一步创造出巨大的利益,而获取信息的重要途径就是眼睛。据统计,人类采集信息的80%来自视觉。图像和视频是对客观事物生动、形象的描述,是一种最直观的表现方式。而视频监控技术因为它方便快捷、生动形象、信息丰富等特点日益受到人们的青睐,并在各行各业得到广泛的应用。与此同时,现代网络和数字技术的快速发展也为视频监控技术的发展奠定了坚实的基础。
二十一世纪,嵌入式技术、多媒体处理技术进一步发展,为视频监控系统的发展提供了新的出路——嵌入式视频监控系统。嵌入式系统是以应用为中心,软硬件可以剪裁,具有高稳定、低成本、功耗低、速度快、实时好的专用计算机系统,它由嵌入式微处理器,配以周边硬件设备,接口电路组成。嵌入式系统内部使用嵌入式操作系统,安装专用的功能软件。嵌入式技术把硬件和软件集于一体,独立工作。嵌入式视频监控系统比其他视频采集系统在布局区域范围上要广泛;由于使用IP技术,嵌入式视频监控技术比其他视频采集系统更具紧密的结合度,能够充分利用现代网络技术的成果,并能构成复杂的视频监控网络;性能上,嵌入式视频采集系统继承了嵌入式技术的优点,非常适合自动化的环境。
因此,嵌入式视频采集技术正在我国快速的发展,积极的研究会加强我们在这方面技术的学习,也会为视频监控技术的发展贡献力量。
1.2本文的内容及主要工作
根据毕业设计的初衷,我们需要设计基于ARM的网络视频采集系统。在监控系统中,视频采集、传输、播放的功能不是由专门视频处理芯片完成,而是由软件实现。
论文首先介绍了嵌入式ARM系统的硬件结构和软件结构,方便大家熟悉ARM和Linux系统,包括嵌入式设备的硬件结构,逻辑框图和Linux的基本操作、安装方法;第二,研究了嵌入式的一些驱动程序,主要是摄像头驱动程序
V4L,系统中选用的摄像头芯片——中星微301;第三,研究了视频监控的具体流程和实现方式,让大家在总体上对整个系统有一个大概的认知。
本次设计的目的只有一个,就是实现视频的实时监控。围绕它,不管是硬件结构还是软件流程,都需要学习和研究,不断调试,决不放弃。
总之,论文的内容都是围绕如何建立一个视频采集系统。无论是从哪个方面,我们都是为这个目标而努力。2
第2章嵌入式ARM系统硬件结构简介
2.1视频监控系统结构简介
网络视频监控系统是基于嵌入式技术设计的。嵌入式并没有统一的定义,但目前有一个广泛而又被认可的规范:将软件产品固化到硬件平台上,完成应有的功能既是嵌入式。
基于嵌入式ARM技术的视频监控系统服务器端采用摄像头不断的采集图像,压缩成视频流,然后通过网络发送到申请监控的客户端。监控系统的使用者可以在远程实现网页上的实时监控和一些简单的功能操作。系统整体结构如图2.1所示[1]。
LCDJTAG摄像头ZC301CPU单元Intel Xscale以太网控制器远程PC客户端SDRAMFLASH
图2.1 系统整体结构图
该系统中CPU采用基于ARM的PXA270微处理器,通过在其上运行Linux操作系统,执行Boa视频服务器,接受并处理来自摄像头的图像信号,通过以太网控制器发送至远端,实现视频数据的远程传输和接受,达到视频监控的目的[2]。
2.2ARM处理器简介
ARM,既是一个公司的名字,也是对一类微处理器的通称。ARM嵌入式微处理器是全球领先的16/32位RISK处理器芯片知识产权设计供应商ARM(AdvancedRISKMachines)公司的产品。ARM公司本身不直接从事芯片生产,而是依靠转让设计许可,由合作公司生产各具特色的芯片。
ARM处理器以其完整的体系结构,极小的体积、极低的功耗、极低的成本、极高的性能,及时根据嵌入对象的不同进行功能上的扩展的优势,在众多种类的嵌入式微处理器中脱颖而出。基于ARM技术的微处理器应用占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。
采用RISC架构的ARM微处理器一般具有如下特点:
(1)采用固定长度的指令格式,指令规整、简单、基本寻址方式有2~3种;(2)使用单周期指令,便于流水线操作执行;
(3)大量使用寄存器,数据处理指令只对寄存器进行操作,以提高指令的执行效率;
(4)所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率;
(5)可用加载/存储指令批量传输数据,以提高数据的传输效率;(6)可在一条数据处理指令中同时完成逻辑处理和移位处理;(7)在循环处理中使用地址的自动增减来提高运行效率。
目前,ARM处理器有ARM7、ARM9、ARM9E、ARM10、ARM10E、SecurCore、StrongARM和XScale等系列。每个系列除了具有ARM体系结构的共同特点以外,都有各自的特点和应用领域。
2.3XScale体系结构
Xscale核是采用ARM V5TE架构的处理器,是Intel公司的StrongARM的升级换代产品,它具有高性能、低功耗等特点,并在流水线设计、DSP处理和指令设计中有很大改进[3]。ARM的体系结构是基于RISK的,XScale是ARM处理器的一种,所以XScale具有RISK的基本特性。而且针对嵌入式系统,XScale构架还引入了Pentium处理器工艺和系统结构技术,实现了Pentium微处理器体系结构的一系列高性能技术,达到了高性能、低功耗和小体积等嵌入式系统要求的特性。它的特点有:超流水线、高主频、存储体系、分支预测和指令集体系结构。本设计采用的就是基于英特尔Xscale构架的一种32位嵌入式处理器,它除了应用于掌上电脑之中外,还可以应用于智能手机、网络存储设备、骨干网路由器等电子设备。
PXA27x系列处理器是英特尔当前最新推出的嵌入式处理器。它的时钟频率从312到624MHz不等,并内建64MB的堆栈型Intel StrataFlash内存。内置了英特尔的无线MMX技术,能够显著提升多媒体性能。
OURS-PXA270-EP是一款基于INTEL XSCALE PXA270处理器,针对高效
嵌入式系统教学和实验科研的平台。这款设备主要包括核心板与底版两个部分,核心板主要集成了高速的PXA270 CPU,配套的存储器,网卡等设备;底版主要是各种类型的接口与扩展口。
核心板(8层PCB电路)系统包括:
CPU: INTEL PXA270(520M),支持GDB调试; SDRAM: 64M 工作在104M外频上; FLASH: 32M INTEL Nor FLASH;Net: 10/100M Ethernet controller(LAN91C111);SUPERIO: WINBOND 83977;CPLD: XILINX 95144(117USER IO);总线驱动器: 若干;核心板正面如图2.2所示,核心板背面如图2.3所示。
SDRAMCPUdrvdrvCPLDdrvFLASHdrvdrvFLASHLDOdrv 图2.2 核心板正面图
SDRAMdrvEthernetdrvdrvdrv100PIN CONNECTORSuperIOLDO 图2.3 核心板背面图
底版(4层PCB电路)如图2.4所示。包括: Ethernet: 10/100接口1个
UART: 6个(包括RS232,RS485,IRDA,全功能串口)USB1.1:2个(1个host 一个device)PS2:2个(KEYBOARD&MOUSE)标准并口:1个 PCMCIA: 1个 IDE:1个 SD/MMC: 1个 SMC:1个 CAMERA:1个 96PIN功能扩展口:2个 4X5 小键盘
CPU_JTAG CPLD_JTAG LED SHARP LQ080V3DG01 8寸真彩LCD
640X480 VGA 640X480 LED 8X8点阵
一组7段LED数码管
4个
串口irda串口串口串口LCD接口LCD接口并口VGALED点阵音频1音频2音频3PCMCIA 卡LED数码管SMC 卡核心板SDPSPSUSBUSB485NET键盘 图2.4 底版图
2.4主要硬件电路说明
嵌入式设备除了以ARM芯片为主要控制单元,也有很多周边电路和外围设备,它们有的帮助ARM处理信号、有的负责存储数据、有的进行网络连接、有的用来数据通信,这些周边设备缺一不可,不能替代。
首先介绍CPU核心总线[4],总线是CPU和其他设备的桥梁。CPU是通过总线信号来控制SDRAM ,FLASH,网卡,SUPERIO等外部设备的,无论是低速还是高速,只要是与总线相关的芯片,都要和CPU总线信号有关。其次,研究嵌入式系统内存——SDRAM。SDRAM是嵌入式系统的内存,具有单位空间存储容量大和价格便宜的优点,已广泛应用在各种嵌入式系统中。当系统启动时,CPU首先从复位地址0x0处读取启动代码,在完成系统的初始化后,程序代码一般应调入SDRAM中运行,以提高系统的运行速度。同时,系统及用户堆栈、运行数据也都放在SDRAM中。SDRAM的存储单元可以理解为一个电容,总是倾向于放电,为避免数据丢失,必须定时刷新(充电)。因此,要在系统中使用SDRAM,就要求微处理器具有刷新控制逻辑,或在系统中另外加入刷新控制逻辑电路。PXA270芯片在片内具有独立的SDRAM刷新控制逻辑,可方便地与SDRAM接口。除了SDRAM,FLASH也是一种存储媒介。FLASH一般具有NOR型和NAND型。NAND型FLASH单元密度高,写入和擦除速度非常快,而且一般NAND型FLASH的存储容量很大。NOR型FLASH的优点是芯片内执行命令,这样应用程序可以直接在FLASH内运行,不用进入内存,使得它的传输效率很高。嵌入式设备最大的优点就是网络功能强大,它能像PC一样方便地连接到互联网上,这些功能都是网络控制器的作用。也就是Ethernet Controller,本系统采用SMSC公司的单芯片的网络控制器,LAN91C111。它可以工作在两种速度下,10M以太网或者100M以太网。LAN91C111的工作流程是,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,LAN91C111会自动把数据包转换成物理帧格式在物理信道上传输;反之芯片收到物理信号后自动将其还原成数据,并按指定格式存放在芯片RAM中以便主机程序取用。就是LAN91C111完成数据包和电信号之间的相互转换。最后,说明一下串口电路,在嵌入式视频监控系统中,串口起到了很重要地作用,嵌入式系统启动的信息都可以通过串口传到PC上,极大地方便了系统的移植和软件的调试。大多数情况下,嵌入式CPU的串口0会作为CPU的一个终端,为用户与CPU交互提供基本的输出输入信息。当CPU运行BOOT代码时,通常只有这个终端 ;运行LINUX内核时,如果有LCD显示,串口0与LCD终端会同时有效。串口0终端的交互
方式是命令行的模式,在BOOT阶段,支持简单的BOOT命令。8
第3章嵌入式ARM系统软件结构
3.1Linux操作系统简介
Linux是一个类似Unix的操作系统,它起源于芬兰一个名为LinusTorvaldS的业余爱好者,现已成为最流行的一款开放源代码的操作系统。Linux从问世至今,短短时间内已发展成为一个功能强大、设计完善的操作系统。Linux系统不仅能够运行于PC平台,还在嵌入式系统方面大放光芒。由于Linux的源码开放,内核精简且性能强悍,不依赖于具体厂商,能广泛适用于各种硬件设备,系统二次开发成本极低,因此在IT业界已经达成共识,即采用嵌入式Linux作为嵌入式操作系统是大势所趋[5]。
嵌入式Linux是目前嵌入式系统领域中发展势头非常迅猛的系统。嵌入式Linux是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几M字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用操作系统。目前正在开发的嵌入式系统中,49%的项目选择嵌入式Linux作为操作系统。嵌入式Linux现已成为嵌入式操作系统的理想选择[6]。目前基于嵌入式Linux的应用已经遍布很多领域,比如移动多媒体设备、手持设备、车载导航系统、机械控制等。嵌入式Linux分为两种类型:在没有使用MMU的平台上(无内存虚实地址转换和映射)的一般为uCLinux;而在有MMU平台上,则使用原本地嵌入式Linux版本。由于在目前的主流嵌入式ARM中大多不具有MMU,因此只用IM左右的内核就能实现网络功能和任务调度的Linux系统就可以适用于从高端服务器到嵌入式应用的各级平台。ARM技术和Linux成功地结合,应用于数以千计的商业产品中。从便携式消费品、网络和无线设备,到自动化设备、医疗设备和存储产品,这一应用列表与日俱增。ARM和Linux的结合充分满足了各类应用对嵌入式平台高性能、低功耗和低价格的要求,通过开发环境、开源社区和ARM的商业伙伴的优势为嵌入式开发提供了更灵活的选择。
本次设计的开发环境为redhat9.0系统,在Windows XP 下安装虚拟机,在虚拟机中安装Linux系统,这样可以屏蔽底层差别,避免硬件驱动带来的麻烦,而且还能方便的使用串口、并口、USB接口,快速的进入实验环境。图3.1为虚拟机下Linux系统启动后的情况。
图3.1 虚拟机下Linux操作系统
3.2交叉编译环境的建立
通常嵌入式系统的软件编译和执行是在两个不同平台上进行的。编译是在宿主机,一般为装有Linux的pc;执行是在目标机,即嵌入式系统的硬件平台。一般是在宿主机上通过跨平台交叉编译器把源文件编译成目标平台上可执行的文件,再通过串口、并口或者网络下载至目标平台上的FLASH或者其它存储介质,然后由目标机来运行这些软件。这里所说的跨平台编译器和一般的编译器功能类似,都是把源代码通过编译器编译成目标文件,然后通过链接器、可重定位器程序和定位器把目标文件重新定位成可执行文件。和通用的编译器之间最大的差别就在于跨平台编译器编译出来的可执行程序通常只能在特定CPU所属平台上运行。所以一般来说每种CPU都对应有不同的跨平台编译器。
本系统采用基于XScale的PXA270,可以使用常用的ARM-LINUX-GCC交叉编译器。要成功构建完整的交叉编译环境需要在宿主机上创建一系列的工具包括C/C++编译器、汇编器、链接器、嵌入式系统的标准C库和GDB代码级调试器。成功建立好开发环境后便可以运用这些工具进行嵌入式系统开发[7]。
3.3嵌入式Linux操作系统移植 3.3.1BootLorder移植
BootLoader是系统加电后运行的第一段代码。一般只是在启动时运行很短的时间,然而对一个嵌入式系统来说,这一部分却是整个系统的一个无比重要的组成部分,不可缺少。在一般嵌入式系统中,系统复位或者加电后通常从地址0x00000000处开始执行,而这个地址一般正是存放的BootLoader启动代码。通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终加载操作系统内核准备好正确的环境。
BootLoader一般情况下需要包含以下几个必备的功能 :(l)初始化处理器。这个动作都是用汇编语言完成的,称为重置码(resetcode)或者称为bootcode,而且对于每个CPU都不一样的,当电源接通后就会执行这个动作,通常只有两三个汇编指令,目的是将CPU的控制权转给硬件初始化的程序。
(2)初始化一些必要的硬件。这个动作也大都由汇编语言来完成,主要是初始化CPU、SDRAM等,其他的硬件,例如串口,可以由c语言等比较高级的程序语言来完成后续动作。
(3)设置处理器的寄存器以及内存,关掉所有的输入管脚(包括中断管脚),以防止突然有信号进入妨碍接下来的硬件初始化动作。然后初始化串口,以便后续运行的程序能够同HOST端进行通信,便于调试。
(4)从特定的位置把操作系统和文件系统调入内存,并设置一些操作系统所必需的参数,然后把CPU控制权交给操作系统。有的BootLoader会先从串口或者网络等其他途径得到内核的映像文件,然后把这些文件写入目标系统的FLASH或者其它存储介质,最后再把内核载入RAM执行,交出控制权。
一般BootLoader都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载模式的区别。
(l)启动加载(Bootloading)模式:这种模式也称为“自主”(Autonomous)模式,即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时候,BootLoader显然必须工作在这种模式下。
(2)下载(Downloading)模式:在这种模式下,目标机上的BootLoader将通过串
口连接或者网络连接等通信手段从主机(HOST)下载文件,比如下载内核映像和根文件系统映像等。从主机下载的文件通常首先被BootL0ader保存到目标机的RAM中,然后再被BootLoader写到目标机上的FLASH类固态存储设备中。BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用,此外,以后的系统更新也会使用BootLoader的这种工作模式。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。
BootLoader的实现依赖于CPU的体系结构,一般来说启动过程分为两个阶段。
第一阶段依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在第一阶段中,而且通常都用汇编语言来实现,运行效率比较高。这个阶段完成的任务一般如下:(l)硬件设备初始化(屏蔽所有的中断、关闭处理器内部的指令/数据cache);(2)为第二阶段准备RA.M空间;(3)复制BootLoader的第二阶段代码到RAM空间中;(4)设置好堆栈并跳转到第二阶段的C程序入口点。
第二阶段则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。这个阶段主要任务有:(l)初始化本阶段要使用的硬件设备;(2)检测系统内存映射;(3)将内核映像和根文件系统从FLASH读到RAM中;(4)为内核设置启动参数;(5)调用内核文件运行。
本设计中的Bootloader采用Blob,Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。Blob最初是由Jan-Derk Bakker和Erik Mouw两人为一块名为LART(Linux Advanced Radio Terminal)的开发板写的,该板使用的处理器是StrongARM SA-1100,现在Blob已经被成功移植到许多基于ARM的CPU上了。本设计中的Intel Xcale就是采用Blob作为Bootloader[8]。
3.3.2Linux 内核移植
选用嵌入式Linux作为目标机操作系统,一方面由于Linux是一款免费的操作系统,能很好的降低成本,同时Linux的开发应用现在已经成为热门,有大量的资源可用于学习与重复应用,并且Linux系统具有良好的可移植性和可裁剪性,能自动支持多任务管理。一般常用的GUI如QT/E,MiniGUI等都支持Linux。
Linux的开发工具也都可以很方便的免费获得。
系统采用的嵌入式Linux内核为随实验平台光盘中的Linux内核,它是针对这套实验平台所配置的Linux内核,内核版本为Linux2.4.20[9]。在实验过程中,只需要在这个内核的基础上进行添加和删减所需要和不需要的功能,编译后就可以使用了。
在编译内核之前,需要对内核进行必要的配置,通过虚拟机进入/pxa270_linux/linux/目录后在终端执行make menuconfig[10]命令,就可以可视化的配置内核需要的功能和要求,本次试验,主要是针对视频方面,选择了对V4L的静态加载、对spca5xx摄像头驱动的动态加载,这样就结束了对内核的配置。编译内核需要创建内核依赖关系、创建内核镜像文件和创建内核模块。首先执行makedep命令,读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而哪些不需要;接着需要makeclean删除前面步骤留下的文件,以避免出现一些错误;然后便可以生成所需要的内核文件了,用make zlmage来实现得到可移植的内核。内核文件通过并口下载线烧写入开发板中,便可以通过BootLoader加载运行。
3.3.3嵌入式文件系统
嵌入式Linux操作系统一般采用FLASH作为存储介质。FLASH具有独特的物理特性,所以必须使用专门的嵌入式文件系统。嵌入式系统对文件的操作是通过层次结构实现的。对于用户程序来说,文件是有结构的文件,用户程序通过对文件IO函数操作文件。嵌入式文件系统是嵌入式操作系统的一部分,它的任务是对逻辑文件进行管理,其工作包括提供对逻辑文件的操作(复制、删除、修改等)接口,方便用户操作文件和目录。在文件系统内部,根据存储设备的特点,使用不同的文件组织模式来实现文件的逻辑结构。此外,文件系统要对管理文件的安全性负责。文件系统不能直接控制物理设备,它是通过FLASH驱动实现控制的[11]。
目前FLASH支持的文件系统技术主要有JFFS2,YAFFS2,TrueFFS,FTL/NTFL,RAMFS,CRAMFS和ROMFS等等。本系统采用的是JFFS2文件系统。
JFFS2文件系统是专门为NAND闪存设计的嵌入式文件系统,根据NAND闪存以页面为单位存取的特点,将文件组织成固定大小的数据段。利用NAND闪存提供的每个页面16B的备用空间来存放ECC(ErrorCorrectionCode)和文件系统的组织信息、,不仅能够实现错误检测和坏块处理,也能够提高文件系统的加
载速度。JFFS2采用一种多策略混合的垃圾回收算法,结合了贪心策略的高效性和随机选择的平均性,达到了兼顾损耗平均和系统开销的目的。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。JFFS2文件系统是按层次结构设计的,分为文件系统管理层接口、JFFS2内部实现层和NAND接口层,这样就简化了其与系统的接口设计,可以方便地集成到系统中去。与YAFFS相比,它增加了一些功能,因此功能更强。
3.4Linux下的程序调试
调试是程序开发过程中必不可少的一个重要环节,通用PC机的程序调试与嵌入式操作系统的调试环境上有着明显的区别,前者调试器和被调试的程序往往是运行在同一台机器上,是相同操作系统下的两个不同的进程,调试器通过操作系统专用调用接口控制被调试进程,后者通常为远程调试,调试器一般运行于桌面操作系统上,而被调试的程序则运行在嵌入式系统之上,因此需要协调这两个程序之间的通信。Linux下的调试工具非常的少,gdb是Linux下最著名的调试工具,它是GNUC自带的调试工具,它可以使开发人员了解程序运行的详细细节,从而消除程序的错误,达到调试的目的,gdb还具有远程调试功能,可以满足嵌入式系统调试的要求,在调试过程中PC机也称为宿主机和嵌入式系统通过串口协议或者TCP/IP协议连接起来,远程主机上运行被gdb规范断点改造过的内核,当条件成立时,断点被激活,然后等待本地宿主机的连接命令,一旦连接成功,宿主机就可以向远程嵌入式系统发送调试命令了。在调试过程中gdb通过调试stub来完成通信功能,调试stub是嵌入式操作系统中的一小段代码,它提供了运行gdb的宿主机和嵌入式系统进程之间交互的一个媒介。
除了使用调试器外还可以直接在程序中使用printf()或printk打印函数,这种方法功能比较弱,效率低下,但在内核模块调试时这是唯一的方法。14
第4章USB设备驱动程序设计
4.1设备驱动程序简介
Linux系统中,设备驱动程序扮演着特殊的角色。它就像一个独立的黑盒子一样,使某个特定的硬件可以相应一个定义良好的内部编程接口并且完成隐藏设备的作用。用户只需调用一组标准化的函数完成操作,而且这些操作与特定的驱动程序无关。驱动程序的任务就是将这些函数映射到作用硬件的具体操作上。这样的模块化的驱动程序结构使得Linux系统中的驱动程序可以独立于内核的其他部分,可以在需要使用的时候将驱动“插入”内核。
从系统运行顺序来看,硬件平台启动运行Linux后,启用了MMU单元即内存管理单元,在这种模式下系统不能直接对物理地址进行访问。若要对某一硬件外设进行读写,需要通过内核调用该硬件的驱动来实现。
上面已经说过,驱动程序的作用在于向应用程序提供访问硬件设备的接口,驱动程序屏蔽了硬件实现上的细节操作,于是应用程序可以像操作普通文件一样对硬件设备进行操作。Linux以模块的形式加载设备类型,通常是一个模块对应实现一个设备驱动。模块是内核的一部分,它们没有被编译到内核中,而是分别被编译并链接成一组目标文件。可以根据用户的需要在不需要对内核进行重新编译的情况下动态载入正在运行的内核,或从正在运行的内核中卸载。利用这种机制,内核尺寸可以保持在最小,并具有最大的灵活性,也便于检验新的内核代码,而不需要重新编译内核并重新引导。设备驱动程序一般需要完成以下功能:(l)对设备初始化和释放;(2)把数据从内核传送到硬件和从硬件读取数据;(3)读取应用程序传送给设备文件的数据和回送应用程序的请求数据;(4)检测和处理设备出现的错误。
在Linux操作系统下有两类主要设备文件类型:块设备、字符设备。用户进程正是通过设备文件来与硬件打交道。每个设备文件都有其文件属性,表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的设备号一致,否则用户进程将无法访问驱动程序。
Linux驱动程序可以分为三个主要部分: 15
(l)自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其他必需的条件位口中断、DMA通道)进行申一请并初始化。这部分驱动程序仅在初始化时被调用一次。
(2)服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,但仍具有进行此系统调用的用户程序的运行环境,因而可以在其中调用与进程运行环境相关的函数。
(3)中断服务子程序,又称为驱动程序的下半部分。在Linux操作系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务子程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备。
在系统内部,I/O设备的存取通过设备驱动程序提供的一组固定的入口点来进行,这组入口点在驱动程序初始化时向系统进行登记,以便在系统适当的时候调用。一般来说,字符型设备驱动程序能够提供如下几个入口点:(1)open入口点:打开设备准备I/O操作,对字符特别设备进行打开操作,都会调用设备的open入口点。open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备的状态。
(2)close入口点:关闭一个设备,当最后一次使用设备结束后,调用dose子程序。独占设备必须标记设备可再次使用。
(3)read入口点:读取设备,对于有缓冲区的I/0操作,一般从缓冲区里读取设备数据。
(4)write入口点:向设备写数据,对于有缓冲区的I/O操作,一般向缓冲区里写入数据。
(5)ioctl入口点:执行读写之外的操作。
USB(Universal Serial Bus)即“通用串行外部总线”,用途广泛,可以外接硬盘、键盘、鼠标、打印机等多种设备,USB能够使用尽可能少的接口支持尽可能多的外设,尤为适合在嵌入式设备中使用,是嵌入式接口标准的一个很好的选择。
USB总线规范有1.1版和2.0版。USB1.1支持两种传输速率:低速1.5Mbit/s、全速12Mbit/s,这样的速率完全满足鼠标、键盘、CD-ROM等设备,但是在嵌入式视频监控系统中,这样的速度还是很慢。所以,USB2.0提供了一种更好的传输速率:高速,它可以达到480Mbit/s。USB2.0向下兼容USB1.1,可以将遵循USB1.1规范的设备连接到USB2.0控制器上,也可以把USB2.0的设备链接到USB1.1控制器上。
USB总线的硬件拓扑结构[12]如图4.1所示。
USB主机控制器USB设备根集线器USB设备USB设备集线器USB设备集线器USB设备集线器USB设备USB设备USB设备USB设备 图4.1 USB总线硬件拓扑图
USB主机控制器通过根集线器与其他USB设备相连。集线器也属于USB设备,通过它可以在一个USB接口上扩展出多个接口。除根集线器外,最多可以层叠5个集线器,每条USB电缆的最大长度是5m,所以USB总线的最大距离为30m。一条USB总线上可以外接127个设备,包括根集线器和其他集线器。整个结构图是一个星状结构,一条USB总线上所有设备共享一条通往主机的数据通道,同一时刻只能有一个设备与主机通信。
通过USB主机控制器来管理外接的USB设备,USB主机控制器共分3种:UHCI、OHCI和EHCI。在配置Linux内核的时候,看到的“HCD”字样表示“Host Controller Drivers”,即主机控制器驱动程序。
USB驱动程序分为两类:USB主机控制器驱动程序(Host Controller Drivers)、USB设备驱动程序(USB device drivers)。它们在内核中的层次如图4.2所示。
UserUSB Device DriversUSB Host Controller DriversHardware 图4.2 USB驱动程序层次结构
在试验中,教学平台上的Linux嵌入式内核已经配置了USB主机控制器驱动程序,只需要添加需要的USB设备驱动程序,就能实现USB设备的正常使用。
4.2Linux下驱动程序的实现
Linux操作系统下对硬件设备进行驱动开发的一般步骤如下:(l)注册设备
在系统启动时或者在模块加载的时候需要将设备和重要的数据结构登记到内核的设备数组中,并确定该设备的主次设备号。在Linux系统中,对于字符设备一般通过调用register_chrdev向系统注册设备驱动程序,register_chrdev在fs/deviees.c文件中的定义如下:int register_chrdev(unsigned int major,const char*name,struct file_operations fops)定义中的major是设备驱动程序向系统申请的主设备号,如果major为O,则系统为该驱动程序动态的分配一个主设备号,不过此设备号是临时的;name是设备名:fops是各个调用入口点的说明。函数返回O表示注册成功,返回-INVAL表示申请的主设备号非法,返回-EBUSY表示申请的主设备号正在被其它设备驱动程序使用。
以后对设备驱动程序的file_operations的操作都可以通过该主设备号的索引来完成。register_chrdev函数操作成功后,设备名便出现在/proc/devices文件目录中,使用命令cat/proc/devices可以查看设备的工作状态。
(2)定义操作集
驱动程序中要通过一系列函数完成对设备的不同操作,这些操作在面向对象编程术语中也称为方法,该操作集通过数据结构file_operations实现。内核内部通过file结构识别设备,通过file_operations数据结构提供的文件系统的入口点函数访问设备。
file_operations定义在
int(*release)(struct inode*, struct file*);int(*fsync)(struct file*, struct dentry*, int datasync);int(*fsyne)(int, struct file*, int);int(*lock)(struct file*,int, struct file_lock*);ssize_t(*readv)(struct file*, const struct iovec*, unsigned long, loff_t*);ssize_t(*writev)(struct file*, const struct iovec*, unsigned long, loff_t*);ssize_t(*sendpage)(struct file*, struct page*, int, size_t, loff_t*, int);unsigned long(*get_unmapped_area)(struct file*, unsigned long, unsigned long,unsigned long, unsigned long);}
这个结构的每一个成员的名字对应一个系统调用,在用户程序利用系统调用对设备文件进行诸如读/写操作时,系统调用会通过设备文件的主设备号找到相应的驱动程序,然后读取这个数据结构的相应函数指针,把控制权交给该函数。对于具体的设备驱动并不需要实现结构中所有的例程,只要完成设备功能就可以了。例如对于一个常见的字符设备驱动来说,可能只有操作open(),write(),read(),ioctl()和close(),当用户程序通过系统调用访问设备时,最终要通过这些操作集来完成。
(3)卸载模块
当不再需要使用一个模块或设备时,需要将其从内核中卸载下来,这时会动态调用模块中的module_exit()函数,并需要在该函数中调用modul_unregister_chrdev()或module_unregister_blkdev()释放挂入内核的数据结构同时释放该设备号。
4.3USB摄像头驱动程序设计
摄像头属于视频设备,在Linux内核中,VideoforLinux(简称V4L)是关于视频设备的驱动标准。这个标准为应用程序定义了一系列的接口函数,内核、驱动和应用程序都是依靠这个标准来进行交流。本系统所使用的USB摄像头正是基于该标准来编写驱动和应用程序的。
Linux内核是依据设备号来操作设备文件的,在内核中,摄像头对应的设备文件名为/dev/video0,主设备号是81,次设备号根据摄像头数目来确定,本系统中仅使用一个摄像头,所以可以通过mknod/dev/video0 c 81 0来创建节点。USB摄像头驱动程序实现原理如图4.3所示。
USB摄像头的驱动和通用设备的驱动准则一样,但需要与内核提供的视频驱动挂钩。即首先在驱动中声明一个 video_device结构,并为其指定文件操作函数指针数组fops,向系统注册。在应用程序发出文件操作的相关命令时,核心根据这些指针调用相应函数,并将该结构作为参数传递给它们。这样,就完成了驱动和核心之间的通信。
例如: Static struct video_devie vdev_template={……};
声明 video_deviee,指出挂接驱动
用户进程系统调用摄像头驱动文件操作接口接收缓冲区发送缓冲区中断服务程序摄像头 图4.3 摄像头驱动实现框图
Static Struct file_operation spcasxx_fops= {……};
声明本驱动的文件操作函数指针 Struct video_device*vdev=video_devdata(file);从文件指针中提取出 video_deviee结构
在video_deviee结构中,有一个私有指针priv,可以将它指向一块保留内存。在这块内存中,保存着本驱动、本设备的相关初始化信息。这块内存的申请、初始化、指针指向等工作都是在USB驱动的枚举函数probe中完成。这样,在枚举函数将控制权返还给系统后,因为内核不销毁保留内存,所以驱动仍然保留着自己的信息。在驱动卸载函数中需要将申请的各块内存全部释放。
Linux系统中任何USB传输都通过URB实现。为提高速度,可以考虑扩大URB的缓冲,这样可以降低每个USB事务中握手信息所占比例,提高有效数据的输速度。但是受限于总线带宽和具体的USB设备芯片,单纯扩大URB的缓冲不能无限制地解决问题。USB在操作系统中每次传输都要包括URB的建立、发出、回收、数据整理等阶段,这些时间不产生有效数据。因此可以建立两个URB,在等待一个URB被回收时,也就是图像正在被传感器采集时,处理、初始化另一个URB,并在回收后立刻将其发出。两个URB交替使用,大大减少了额外时间。
由于嵌入式平台上运行的Linux2.4.20内核,内部已经集成了对USB2.0的支持,所以无需移植相应的USB驱动。
在设计中,摄像头芯片采用中星微的Z301系列芯片,Linux2.4内核并不支持这种芯片,所以我们通过移植芯片驱动程序来达到目的。芯片的驱动程序是spca5**系列,如果不重新编译内核的话,将驱动程序动态加载就可以正常使用。设计中动态加载的命令使用insmod命令,它和modprobe命令在使用上有所不同,modprobe在加载模块时不用指定模块文件的绝对路径,也不用带模块文件的后缀.o或.ko;而insmod需要的是模块的所在目录的绝对路径,并且一定要带有模块文件名后缀的.o或者.ko。但是在功能上,它们所达到的效果基本相同[13]。22
第5章视频采集功能的设计
视频采集程序是基于V4L开发的,包括摄像头的初始化、打开/关闭、参数设置和数据读取等操作,视频采集程序流程图如图5.1所示[14]。
开始初始化摄像头init_videoIn()打开摄像头open_v4l()获取摄像头参数icotl(int->vd,int cmd,..)设置摄像头参数ioctl()获取一帧图像N一帧是否截取完毕Y存储并准备传输N是否终止视频采集Y关闭摄像头终止 图5.1 视频采集程序流程图
5.1基于V4L的编程 5.1.1摄像头相关数据结构
摄像头的组成部分是传感器、DSP、镜头、外壳、USB连线、电路板和周边电路构成,其中最重要的是传感器和DSP(数字信号处理器)。本系统选用的摄像头采用了CMOS传感器和中星微301处理器。
V4L[15]提供了一系列的接口应用程序,可以利用这些程序实现对摄像头的调用,其中有read、open、ioctl等。V4l同时将这些函数和参数封装成一个数据结构vdIn。struct vdIn {
int fd;char *videodevice;struct video_mmap vmmap;struct video_capability videocap;int mmapsize;struct video_mbuf videombuf;struct video_picture videopict;struct video_window videowin;struct video_channel videochan;struct video_param videoparam;
int cameratype;char *cameraname;char bridge[9];int sizenative;int sizeothers;int palette;int norme;int channel;int grabMethod;unsigned char *pFramebuffer;unsigned char *ptframe [4];
};int framelock [4];pthread_mutex_t grabmutex;int framesizeIn;volatile int frame_cour;int bppIn;int hdrwidth;int hdrheight;int formatIn;int signalquit;
int fd :打开摄像头时,open函数返回的文件描述符,其他函数使用这个描述符对摄像头进行操作。
struct video_mmap vmmap: 用于内存映射的结构体。
struct video_capability videocap :描述摄像头基本信息,如设备名称、支持的最大分辨率、信号源信息、信道数等。
struct video_mbuf videombuf :在进行内存映射时读取帧的信息,实际上是输入到摄像头存储缓存中的帧信息。
struct video_picture videopict :摄像头采集图像的属性,如亮度、色调、对比度、色度、深度等。
struct video_window videowin :表示采集窗口参数,如分辨率等。struct video_channal videochan :关于信号源的属性。
5.1.2摄像头基本功能实现
(1)初始化摄像头参数
在对摄像头进行操作之前,要对摄像头进行初始化,即对vdIn这个结构进行初始化。使用init_videoIn 函数。
int init_videoIn(struct vdIn *vd, char *device, int width, int height, int format, int grabmethod){
int err =-1;int i;if(vd == NULL || device == NULL)return-1;
} if(width == 0 || height == 0)return-1;grabmethod = 1;//read by default;if(grab method < 0 || grabmethod > 1)// check format
vd->videodevice = NULL;vd->cameraname = NULL;vd->videodevice = NULL;vd->videodevice =(char *)realloc(vd->videodevice, 16);vd->cameraname =(char *)realloc(vd->cameraname, 32);snprintf(vd->videodevice, 12, “%s”, device);if(debug)printf(“video %s n”,vd->videodevice);memset(vd->cameraname, 0, sizeof(vd->cameraname));memset(vd->bridge, 0, sizeof(vd->bridge));vd->signalquit = 1;vd->hdrwidth = width;vd->hdrheight = height;vd->formatIn = format;
vd->bppIn = GetDepth(vd->formatIn);vd->grabMethod = grabmethod;vd->pFramebuffer = NULL;err = init_v4l(vd);for(i = 0;i < OUTFRMNUMB;i++){
} vd->frame_cour = 0;pthread_mutex_init(&vd->grabmutex, NULL);return err;vd->ptframe[i] = NULL;(unsigned char *)realloc(vd->ptframe[i], sizeof(struct frame_t)+(size_t)vd->framelock[i] = 0;vd->framesizeIn);
(2)打开摄像头
在Linux中,类似摄像头的设备是作为文件来看待的,叫做设备文件。我们可以使用open函数来对设备进行打开操作,open带有两个参数,第一个为设备文件名称,本实验的摄像头设备名称是/dev/video0,第二个则是打开的类型。
在使用open函数打开摄像头之前,要判断是否有摄像头设备,即检查参数videodevice是否为空。Open函数执行结束后会返回摄像头的文件描述符,如果返回值为-1,则说明打开设备出错。
int open_v4l(char *vd->videodevice){
if(!vd->videodevice){
printf(“No device file, ERROR opening V4L interface”);
return-1;}
if((vd->fd=open(vd->videodevice, O_RDWR))==-1){
printf(“ERROR opening V4L interface”);
return-1;} return vd->fd;}(3)获取摄像头参数
成功打开摄像头后,需要获取摄像头的一些参数,利用ioctl函数控制I/O通道来实现。Ioctl函数的使用是ioctl(int->fd, int cmd,……),fd代表文件描述符,cmd表示用户对设备的控制命令,第三个参数是一个其他的参数。其中,cmd包括VIDIOCGCAP(获得video_capbility中有关摄像头的信息)、VIDIOCGPICT(获取图像信息)、VIDIOCSPICT(改变图像信息)、VIDIOCGMBUF(获取摄像头存储缓冲区帧信息)、VIDIOCAMCAPTURE(获取视频图像)、VIDIOSYNC(判断摄像头是否截取成功)等。
读取video_capability中有关摄像头的信息
if(ioctl(vd->fd, VIDIOCGCAP, &(vd->videocap))==-1){ printf(“Fail to get video_capability!/n”);return-1;} 读取video_picture中的图像信息 printf(“Fail to get video_picture!/n”);return-1;} if(ioctl(vd->fd, VIDIOCGPICT, &(vd->videopict))==-1){
读取video_window信息
if(ioctl(vd->fd,VIDIOCGWIN,&(vd->videowin))==-1){
printf(“Fail to get video_window!/n”);
return-1;}(4)设置摄像头参数
在对摄像头参数进行设置的时候,应该按照以下步骤:比如更改图像信息,首先,先给video_picture结构中所要修改的变量赋值,如vd->videopict.palette=vd->formaIn;vd->videopict.depth=GetDepth(vd->formatIn);然后通过ioctl函数的VIDIOCSPICT来设置,如if(ioctl(vd->fd,VIDIOCSPICT,&(vd->videopict))<0){ printf(Fail to set videopict params with VIDIOCSPICT!/n“);return-1;} 在设置好了之后可以通过VIDIOCGPICT命令来查询图像信息设置是否成功。(5)关闭摄像头
在Linux编程过程中,必须养成一个好的编程习惯,就是在开启一个设备后一定要关闭它,这样可以避免很多诸如内存泄露等严重的问题。
本系统支持两种读取方式来获得视频流,它们是内存映射和直接读取,所以首先需要判断视频采集的方式,如果是内存映射,则在系统任务完成后关闭内存映射,然后关闭摄像头设备。同样道理,如果采用的是直接读取,则在任务完成后关闭直接读取,然后在关闭摄像头设备。在代码中,采用了一个判断语句,判断vd->grabMethod的值来判断系统采用哪种读取方式。int close_v4l(struct vdIn *vd){
int i;if(vd->grabMethod){
} else { free(vd->pFramebuffer);vd->pFramebuffer = NULL;if(debug)printf(“unmapping frame buffern”);munmap(vd->pFramebuffer, vd->mmapsize);
} } if(debug)printf(“close video_devicen”);close(vd->fd);/* dealloc the whole buffers */ if(vd->videodevice){
} if(vd->cameraname){
} for(i = 0;i < OUTFRMNUMB;i++){
} pthread_mutex_destroy(&vd->grabmutex);if(vd->ptframe[i]){
} free(vd->ptframe[i]);vd->ptframe[i] = NULL;vd->framelock[i] = 0;if(debug)printf(“freeing output buffer %dn”, i);
free(vd->cameraname);vd->cameraname = NULL;free(vd->videodevice);vd->videodevice = NULL;5.1.3视频数据采集
视频数据的采集是系统实现的第一步,是所有工作的前提。嵌入式Linux系统支持两种视频数据采集的方式:内存映射、直接读取视频。
(1)内存映射
内存映射方式是通过mmap系统调用函数来实现的。mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间
后,进程可以像访问普通内存一样对文件进行访问,不必再调用read()、write()等操作。
首先,使用ioctl系统调用的VIDIOCSFBUF命令获得摄像头存储缓冲区的帧信息,之后初始化video_mbuf,修改video_mmap中的设置,重新设置图像信息,如帧的垂直及水平分辨率、彩色显示格式等。为了防止缓冲区的内容与有用信息叠加产生干扰,在初始化之前可以先调用memset(&(vd->videombuf),0,sizeof(vd->videombuf)来清零缓冲区。然后使用函数vd->map=(unsigned char*)mmap(O,vd->mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED,vd->fd,ff_t offset)使设备内容映射到内存区,其中第一个参数为共享内存的起始地址,一般设为0,表示由系统分配;第二个参数为映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起;第三个参数指定共享内存的访问权限(PROT_READ(可读),PROT_WRITE(可写),PROT_EXEC(可执行));第四个参数可以是MAP_SHARED或者MAP_PRIVATE;第五个参数为设备描述符。mmap()成功调用后返回系统实际分配的起始地址。
内存映射方式下真正进行视频截取的是ioctl系统调用的VIDIOCMCAPTURE命令,若函数成功调用,再用VIDIOCSYNC命令来判断图像截取是否己经完毕,若该函数调用成功,则表明一帧图像的截取已完成,便开始下一帧图像数据的截取,并将当前截取的帧号按缓冲区总帧数的模加上l。
vd->vmmap.height=vd->hdrheight;vd->vmmap.width=vd->hdrwidth;vd->vmmap.format=vd->formatln;/*判断图像截取是否完成*/ if(ioctl(vd->fd,VIDIOCSYNC,&vd->vmmap.frame)<0){ perror(„‟cvsync errn);erreur=-I;} while((vd->framelock [vd->frame_cour]!=0)&&vd->signalquit)usleep(1000);temps=ms_time();
pthread_mutex_lock(&vd->grabmutex);jpegsize=convertframe(vd->ptframe[vd->frame_cour]+sizeof(struct frame_t),vd->pFramebuffer+vd->videombuf.offsets[vd->vmmap.frame],vd->hdrwidth,vd->hdrheight,vd->formatln,vd->framesizeIn);headerframe=(struct frame_t*)vd->ptframe [vd->frame_cour];
snprintf(headerframe->header, 5,”%s”.”SPCA”);
headerframe->seqtimes=ms_time();headerframe->w=vd->hdrwidth;headerframe->h=vd->hdrheight;headerframe->size=((jpegsize<0)? 0: jpegsize);headerframe->format=vd->formatln;headerframe->nbframe=frame++;pthread_mutex_unlock(&vd->grabmutex);/*截取视频帧*/ if((ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->vmmap)))<0){ perror(“cmcapture”);
if(debug)printf(“>>cmcapture err n”);erreur=-l;} vd->vmmap.frame=(vd->vmmap.frame+1)%vd->videombuf.frames;vd->frame_cour=(vd->frame_cour+l)%OUT FRMNUMB;(2)直接读取方式
直接读取视频数据是通过read系统调用函数来实现。read是一个用来从指定的文件或设备中读取数据的系统调用。参数表为read(fd,(void*)pFramebuff,(size_t)framesizeln)。其中fd为文件描述符,pFramebuffer为指向存放数据的内存的指针,framesizeln为需要读取的数据的长度。对于摄像头设备的读取,需要先分配内存空间,用来存储从摄像头读取过来的视频数据,然后直接调用read系统调用读取视频数据,返回值为实际读取的视频帧大小,也正是在视频传输过程中发送的视频数据大小。
size=vd->framesizeln;vd->pFramebuffer=(unsigned char*)realloc(vd->pFramebuffer,(size_t)size);Len=read(vd->fd, vd->pFramebuffer, size);if(len<0){ if(debug)printf(“v41 read errorn”);
if(debug)printf(“len %d asked %dn”, len, size);return 0;}
/*是否有其他进程正在使用该视频帧*/ while((vd->framelock [vd->frame_cour]!=0)&&vd->signalquit)
headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);
usleep(1000);temps=ms_time();
pthread_mutex_lock(&vd->grabmutex);jpegsize=convertframe(vd->ptframe[vd->frame_cour]+sizeof(structframe_t),vd->pFramebuffer,vd->hdrwidth,vd->hdrheight,vd->formatln,vd->framesizeln);headerframe=(struct frame_t*)vd->ptframe [vd->frame_cour];snprintf(headerframe->header, 5,”%s”,”SPCA”);headerframe->seqtimes=ms_time();headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);headerframe->w=vd->hdrwidth;headerframe->h=vd->hdrheight;headerframe->size=((jpegsize<0)? 0: jpegsize);headerframe->format=vd->formatln;headerframe->nbframe=frame++;vd->frame_cour=(vd->frame_cour+1)%OUTFRMNUMB;pthread_mutex_unlock(&vd->grabmutex);5.2图像编解码 5.2.1编解码介绍
通过摄像头采集到数据后,还并不能把它们直接通过网卡传输,因为这样的数据很大,网络不能承担如此庞大的数据传输。所以,必须将采集到得数据进行编码,压缩数据大小。通过这样的操作,我们采集到得数据就会变得很小,然后再把这些数据通过网络传输。同样的道理,在输出端我们还要把接收到的已经压缩的数据还原回来,这就涉及到解码的内容。通过这一系列的操作,图像和视频数据就实现的远程的传输。如果没有编解码,远程传输就是实际上不可能的事情,所以图像的编解码是非常重要的。
现在普遍使用的编解码技术。对于静态图像,普遍使用静态压缩JPEG标准;对于动态视频,普遍使用动态压缩MPEG标准。
JPEG是由ISO和CCITT为静态图像压缩所建立的国际上第一个静态图像压缩标准,JPEG有着较高的压缩比,复杂度适中,既可以用硬件实现,也可以用软件实现,实用性强,被广泛使用于计算机和通信行业。
MPEG中文译名为动态图像专家组。到目前为止,MPEG标准主要有五个,32
MPEG-
1、MPEG-
2、MPEG-
4、MPEG-7和MPEG-21。它是由ISO/IEC1172压缩编码标准得出的视频压缩格式,MPEG的出现使视听传播进入数码化时代。MPEG标准的视频压缩编码技术主要利用了具有运动补偿的帧间压缩编码技术以减少时间冗余度,利用DCT技术以减少图像的空间冗余度,利用熵编码技术在信息表示方面减少了统计冗余度。通过一系列技术,极大的体现了压缩性能[16]。
5.2.2系统压缩技术
由于本系统要求实现远程视频传输,为了达到预计的设计要求,设计采用基于MJPEG算法的压缩技术进行视频压缩。MJPEG和MPEG的不同点在于MJPEG不使用帧间编码。可是MJPEG与MPEG仍然是一脉相承的,它对MEPG进行了一些改进和发展,功能更加强大,能发送高质图片、清晰视频,编码容易实现。但MJPEG也有一些缺点,由于功能的提升,MJPEG对带宽的要求很高,编码效率低。
参考文献
1.张永强,赵勇勇,李崇德.嵌入式远程视频采集系统的设计与实现[J].现代电子技术,2006,05(02):57-60.2.Jing Li, Weidong Hao.Research and Design of Embedded Network Video Monitoring System Based on Linux[C].The 2008 International Conference on Embedded Software and Systems Symposia, 2008, 1310-1313.3.陈章龙,唐志强,涂时亮.嵌入式技术与系统——Intel Xscale 结构与开发[M].北 京:北京航空航天大学出版社,2004,143.4.奥尔博公司.PXA270嵌入式实验开发系统——Linux实验指导[M],2007.5.Seon Gyu Kim and Sung Ho Cho.Implementation of an Embedded Software Modem Platform[J].Division of Electrical & Computer Engineering,2006,04(2):5-9 6.杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.7.朱珍民,隋雪青.嵌入式实时操作系统及其应用开发[M].北京:北京邮电大学出版社,2006.8.李亚峰 欧文盛.ARM嵌入式Linux系统开发从入门到精通[M].北京:清华大学 33
出版社,2007,51-54.9.李善平.Linux内核2.4版源代码分析大全[M].北京:机械工业出版社,2002.10.廖日坤.ARM嵌入式应用开发技术白金手册[M].北京:中国电力出版社,2007, 284-290.11.刘昆.Linux环境下宿主机与ARM开发板NFS服务的配置[J].科技资讯,2008,05(04):65-80.12.韦东山.嵌入式Linux应用开发完全手册[M].北京:人民教育出版社,2008.13.孙纪坤,张小全.嵌入式Linux系统开发技术详解——基于ARM[M].北京:人民邮电出版社,2006.14.李冰,孙建平,谭悦,张启勤.基于嵌入式Linux与S3C2410的网络视频监控[J].河北:华北电力大学学报,2006,2(4):15-30.15.董玲,朱宏,杨忠孝.基于ARM的嵌入式Linux应用程序开发研究[J].电子测试,2008,05(06):40-60.16.Yongqiang Zhang, Bing Zhang.Design of Embedded Audio and Video Compression System[J].Workshop on Intelligent Information Technology Application,2007,12(8):76-90.17.Xing Zhang, Li-Ming Song.Implementation of Video Data Transmission Between ARM and DSP Through Embedded Linux[C].The 2008 International Conference on Embedded Software and Systems Symposia,2008,292-295.18.张跃进,谢昕.嵌入式网络数字视频监控系统的设计[J].计算机工程与设计,2009,12(9):70-100.19.Yi Wu, Jiangyong Cai, Xiao Lin, Lianfeng Shen.The Design and Realization of the Wireless Video Monitoring System Based on Embedded Linux and CDMA1X[C].The 2008 International Conference on Embedded Software and Systems Symposia, 2008, 179-184.20.王先春,郭杰荣,胡惟文,樊希平.基于ARM_Linux的嵌入式Web服务器的设计与实现[J].微计算机信息,2007,14(7):90-95.34