基于OpenCv的事件检测_第1页
基于OpenCv的事件检测_第2页
基于OpenCv的事件检测_第3页
基于OpenCv的事件检测_第4页
基于OpenCv的事件检测_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘 要Opencv(Open Source Computer Vision Library)是一种用于数字图像处理和计算机视觉的函数库,由Intel微处理器研究实验室的视觉交互组(The Visual Interactivity Group)开发。采用的开发语言是C+,可以在windows系统及Linux系统下使用,该函数库是开放源代码的,能够从Intel公司的网站免费下载得到。opencv提供了针对各种形式的图像和视频源文件(如:bitmap图像,video文件和实时摄像机)的帧提取函数和很多标准的图像处理算法,这些函数都可以直接用在具体的视频程序开发项目中。 针对在给定视频中检测出特定事件

2、,本文利用opencv的事件检测的数据结构、函数以及基本框架,建立了一个由人机交互界面模式,采用了帧差分法。该方法在安防方面已经很受重视。相信在不久的将来将会得到更大的普及。 关键词:视频;事件检测;帧差分AbstractOpencv is a function library for digital image processing and computer vision, developed by Intels MicroprocessorResearch Lab and The Visual Interactivity Group.Used in the development of l

3、anguage is C + +,It can be used in the Window system and the Linux system.The library is open source,It's free to download fromthe Intel Web site.Opencv provides for various forms of image and video source files (bitmap images, video documents and real-time camera) frame extraction function and

4、a lot of standard image processing algorithms.These functions can be directly used for specific development projects in video. In order to detect specific events in a given video, this article made use of the event detection opencv data , function and function of the basic frameworkstructu

5、re to establish a model of human-computer interaction interface,using the frame difference method.This method has been very popular in security.I believe in the near future it will be used more.Key words:video, event detection, frame differenceII目录1 绪论11.1 目的及意义11.2 国内外研究现状12系统环境搭建22.1 Open CV简介22.2

6、 Open CV 环境介绍42.3 Open CV的特征42.4 开发环境的安装与配置52.4.1安装OpenCV2.4.952.4.2配置windows环境变量72.4.3配置visual C+6.0环境及全局设置92.4.4导入库文件103 Open CV的事件检测系统结构与应用113.1 数据结构体系113.2 类体系123.3 处理图像函数124 系统视频处理模块154.1视频的读写处理154.2视频文件处理155系统事件检测模块195.1运动物体检测的基本方法195.2检测算法设计与实现205.3 关键技术设计225.4 实验结果236总结与展望256.1总结256.2展望25参考文

7、献26附录(源代码)27致 谢30武汉理工大学毕业设计(论文)1 绪论1.1 目的及意义计算机视觉是研究用计算机模拟生物外显或宏观视觉功能的科学和技术。OpenCV,全名为Open Source Computer Vision Library,是Intel公司资助的开源计算机视觉库。它由一系列C函数和少量C+类构成,提供了针对各种形式的图像和视频源文件(bitmap图像,video文件和实时摄像机)的帧提取函数和很多标准的图像处理函数,实现了图像处理和计算机视觉方面的很多通用算法。作为计算机视觉研究的一个分支基于Open CV事件检测,就是对视场内的运动目标,如人或车辆等,进行实时的观测,并在

8、此基础上对被观测对象进行分类,然后分析它们的行为。近年来,计算机视觉的研究重点已经从对静态图像的研究过渡到对动态图像序列的研究上面,这方面的典型应用包括自动化的视频监控系统、视频MPEG编解码技术、人机交互的感知接口、军事上的制导、雷达视频图像中的目标分析。1.2 国内外研究现状国外的视频检测技术研究开始的较早,经过十几年的发展,技术己经相当成熟,视频检测与线圈检测技术相比具有的优越性和高性价比己得到业内人士的公认,代表了未来检测领域的发展和应用方向。视频检测技术虽然在国内研究起步比较晚,但经过这些年的迅速发展,也取得了很多研究成果, 如中国科学院自动化研究所模式识别国家重点实验室研究员从20

9、世纪90年代初就开始研究基于三维模型的智能视觉监控系统,领导视觉监控小组,针对系统中若干关键性问题像车辆检测、跟踪以及车辆行为分析,进行了深入的研究和探讨,提出了自己的见解和主张,取得了一系列的研究成果。国内产品虽然实现了视频检测的功能,但在实际的推广中并不明显,远远没有达到实际应用的要求,同国外产品还有相当的差距。因此,我们国家在此的研究还要加强,真正做出适合市场需求的产品。2系统环境搭建2.1 Open CV简介OpenCV是Intel公司资助的开源计算机视觉库。它由一系列C函数和少量C+类构成,实现了图像处理和计算机视觉方面的很多通用算法。 其重要重要特性包括: 拥有包括300多个C函数

10、的跨平台的中、高层API。它不依赖于其它的外部库尽管也可以使用某些外部库。 对非商业应用和商业应用都是免费(FREE)的。 为Intel Intergrated Perfomance Primitives(IPP)提供了透明接口。这意味着如果有为特定处理器优化的的IPP库,OpenCV将在运行时自动加载这些库。 在过去的十年,随着处理器速度和内存容量以摩尔定律增长,计算机视觉的研究和应用也得到了迅速的发展。以往传统的开发方法要求工程人员在完成的硬件设计的同时,自己编码实现所有底层的算法,所有的图像处理函数都要从头编写,既造成时间和精力上的浪费,又难以保证稳定性、实用性和通用性,越来越难以满足现

11、实的需求。为了解决理论到应用的难题,出现了众多的计算机视觉和图像处理软件包。大多数软件包是用C/C+编写的。例如,TargetJr及其后续版本VXL(the Vision something LIbrarise)就是这样一个C+库的集合,在满足的小型、快速和稳固的系统的开发要求的同时提供了多平台移植性。Gandalf提供了计算机视觉和数值计算库,适合于可移植平台的视觉应用软件的开发。Delft科学图像处理库DIPlib是另一个科学图像处理C程序库.包含了许多图像数据多维分析和处理函数。同时许多商用图像处理和计算机视觉软件包也得到相应开发。MVTec公司开发的HALCON是其中之一,它包含了C/

12、C+代码的图像处理库。LabView在Nl图像处理硬件的支持下能加速图像处理。由微软公司开发的SDK是一个底层的图像操作分析的C+库。在Matlab中的图像处理工具包以及在Mathematica中的数字图像处理软件包都是较为强大的图像处理工具,同时这两个软件包兼有许多高级数学计算功能。由Aurora公司开发的LEADTOOLS是一套商用化计算机视觉包,它包括了图像处理服务器开发工具。允许用户创建各种基于网络的图像处理服务程序。 这些软件包为计算机图像分析和机器视觉提供了极大的便利,但也存在不足之处。大多数软件包没有高级数学计算函数。并且这些软件包都不包括如目标跟踪、摄像机标定、姿态识别、脸谱识

13、别和三维重建等高层函数。 Matlab是功能较为强大的科学计算和分析平台,它提供了图像处理工具包,也提供了较为丰富的数学计算函数,但在Matlab环境下的运行速度令人担忧。虽然Matlab可以通过编译器将m文件转化为C代码。但是转换后的C代码的执行效率和可读性存在较大问题。 除Matlab和LEADTOOLS。大部分软件包不支持网络服务器结构的应用程序的开发;Matlab的网络接口机制较为复杂,且同样存在运行效率的问题。 绝大多数软件包不支持可嵌人性。 本文选取OpenCV进行视频序列图像运动分析,与上述软件包相比,OpenCV的优势在于:纯C代码,源代码开放。开放源代码(open sourc

14、e)是信息技术界从20世纪80年代开始兴起的新名词。源代码是由软件命令电脑执行指定动作的程序语句,是一个软件的核心所在,最著名的开源软件当属芬兰人林努斯·托尔瓦兹提出的Linux。开源软件之所以能够风靡世界,首先是其开源的免费特性;此外,由于有全球众多编程者的参与,开源软件一般具有简约精炼、资源占用少、功能集中和安全性好的优点。不同于以往各种由业余爱好者凭兴趣或是根据自己的项目要求而制作的源代码开发包,OpenCV是由Intel资助的开源项目,其代码规范而且具备良好的后继开发和改进能力。 丰富的函数功能,强大的图像和矩阵运算能力: OpenCV提供了数组、序列、矩阵、树等基本结构,也

15、包含了差分方程求解、傅立叶分析、积分运算、特殊函数等众多高级数学计算函数,以及各种图像处理操作和目标跟踪、摄像机校准、三维重建等高级视觉函数。 平台无关性:基于OpenCV开发的程序可以直接在Windows、Unix、Linux、MacOSX、solaris、HP等平台之间相互移植,无需对代码进行任何修改。 程序运行的实时性:完成调试的代码可以编译连接成二进制可执行文件。从而得到较快的运算速度,满足实时性运算的要求。 方便灵活的用户接口。OpenCV作为一个开放的计算机视觉函数库在使用上必然没有Matlab那样解释执行来得方便,而softhitegration将CH和OpenCV绑定起来推出的

16、CH OpenCV,解决了这一使用上的瓶颈。CH本身是一种嵌入式跨平台的C/C一脚本解释器,有自己的外壳程序,可以应用于2D/3D绘图、数值计算、分布式网络运算。CH OpenCV具有以下特性: 1.交互性:如同Matlab,CH OpenCV是交互式的。代码不需要编译就能解释执行。适合于快速建模和应用程序开发。同时为游动代码的计算机视觉提供了可能。2.强大的扩展功能:通过Ch SDK。可以使现在所有的C/C+动态库、静态库和模块成为Ch函数库的一部分.因此Ch函数库的扩充潜能几乎是无限的。先前提及的所有计算机视觉软件包都能成为CH OpenCV补充部分。 3.Web实现性:类似于ASP和Ja

17、va服务程序。Ch提供了CGI通用网关接口。为CH OpenCV提供了基于web的计算机视觉服务器的开发手段。 4.可嵌入性:与C/C+一编译器不同。Ch能嵌在C/C+应用程序和硬件的机器脚本中。它为用户减轻了开发维护应用程序庞大机器代码的沉重负担。 统一的结构和功能定义,基于Intel处理器指令集开发的优化代码。 可见,作为一个基本的图像处理、计算机视觉和模式识别的开源项目OpenCV可以直接应用于很多领域,作为二次开发的理想工具。本设计用OpenCV的版本为OpenCV2.4.9。2.2 Open CV 环境介绍Visual C+是Microsoft 公司开发的基于Windows操作系统的

18、编程工具。像其他的可视化开发环境一样,VC+集程序的代码编辑、编译、链接和调试于一体,给编程人员提供了一个完整而又方便的开发环境,和许多有效的辅助开发工具。同时,因为VC+是微软的产品,用它来编写Windows程序有强大的程序接口和丰富的开发资源的支持,加之VC+严谨的内存管理,在堆栈上良好的分配处理,生成代码的体积小,稳定性高的优点,Visual C+就成为目前主流开发工具。由于OpenCV 的代码是用C和C+所编写而且完全开放,因此可以在Microsoft Visual Studio 环境下很方便地使用OpenCV所提供的库来进行图像处理。在介绍OpenCV编程环境之前,首先要来了解如何安

19、装OpenCV和基本的编程软件,下面的说明假设已经安装完成Microsoft Visual C+ 6.0。2.3 Open CV的特征OpenCV的主要特征有以下几个方面:(1)图像数据的操作 ( 分配、释放、复制、设置和转换)。 (2)图像是视频的输入输出I/O (文件与摄像头的输入、图像和视频文件输出)。(3)矩阵和向量的操作以及线性代数的算法程序(矩阵积、解方程、特征值以及奇异值等)。 (4)各种动态数据结构(列表、队列、集合、树、图等)。 (5)基本的数字图像处理(滤波、边缘检测、角点检测、采样与差值、色彩转换、形态操作、直方图、图像金字塔等)。 (6)结构分析(连接部件、轮廓处理、距

20、离变换、各自距计算、模板匹配、Hough变换、多边形逼近、直线拟合、椭圆拟合、Delaunay 三角划分等)。 (7)摄像头定标(发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计、立体对应)。(8)运动分析(光流、运动分割、跟踪)。 (9)目标识别(特征法、隐马尔可夫模型:HMM)。 (10)基本的GUI (图像与视频显示、键盘和鼠标事件处理、滚动条)。(11)图像标注(线、二次曲线、多边形、画文字2.4 开发环境的安装与配置2.4.1安装OpenCV2.4.9图2.1安装示例1要将OpenCV安装到C:Program FilesOpenCV。在安装时选择"将OpenCVbin加

21、入系统变量"(AddOpenCVbin to the systerm PATH)。图2.2安装示例2图2.3安装示例3图2.4安装示例42.4.2配置windows环境变量检查C:Program FilesOpenCVbin是否已经被加入到环境变量PATH,如果没有,请加入。加入后需要重启后重新登陆才生效。图2.6环境变量图2.5系统属性2.4.3配置visual C+6.0环境及全局设置在菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径: C:Program FilesOpenCVlib然后选择

22、include files,在下方填入路径: C:Program FilesOpenCVcxcoreincludeC:Program FilesOpenCVcvincludeC:Program FilesOpenCVcvauxincludeC:Program FilesOpenCVmlincludeC:Program FilesOpenCVotherlibshighguiC:Program FilesOpenCVotherlibscvcaminclude然后选择source files,在下方填入路径: C:Program FilesOpenCVcvsrcC:Program FilesOpen

23、CVcxcoresrcC:Program FilesOpenCVcvauxsrcC:Program FilesOpenCVotherlibshighguiC:Program FilesOpenCVotherlibscvcamsrcwindows最后点击“ok”,完成设置。图2.7设置lib路径2.4.4导入库文件每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上(cx

24、core.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib)这些文件。图2.8导入库文件3 Open CV的事件检测系统结构与应用Open CV本身就具有简单方便的特点,其中的大部分类和库函数在实际应用中都有着特定的背景和现实意义,因此整个库的体系结构显得十分简单明了。3.1 数据结构体系OpenCV设计了一些基础的数据类型和一些帮助数据类型,在运用Opencv函数库进行编程的过程中,常常会需要用到这些结构类型,只有正真了解这些结构才能够很好地利用Opencv函数库来解决问题。基础的数据类型包括:图像类的IplImage,矩阵类的CvMat,可

25、变集合类的CvSeq、CvSet、 CvGraph以及用于多维柱状图的混合类CvHistogram。帮助数据类型包括:用于表示二维点坐标的CvPoint,用于表示图像宽和高的CvSize等。下面对CvSize和和IplImage两个比较常用的简单结构进行介绍。1. CvSize结构CvSize结构用来表示矩形尺寸的结构,结构体中分别定义了矩形的宽高和高度。 定义如下: Typedef struct Cvsize int width; /*矩形宽度,单位为像素*/ int height; /*矩形高度,单位为像素*/ CvSize; 2. Iplmage 结构 通常情况下,使用DIB格式来处理图

26、像,而OpenCV库则是使用“IplImage”结构体来创造和处理图像。由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体就是IplImage结构。IplImage结构来源于Inter的另外一个函数库IPL,该函数库主要是针对图像处理。使用这种格式的优点是可以比DIB格式表示更多的图像性质,而且可以很方便地存取图像中的像素值,IplImage结构的具体定义如下: Typedef struct IplImage int nSize; /*IplImage大小*/ int ID; /*版本(=0)*/ int nChannels; /*大多数opencv函数支持14个

27、信道*/ int depth; /*像素的位深度*/ int dataOrder; /*0:交叉存取颜色信道。1:分开的颜色信道。只有cvCreateImage可以创建交叉存取图像*/ int origin; /*0:顶左结构,1:底左结构*/ int width; /* 图像宽像素 */ int heighet; /*图像高像素*/ struct_IplROI *roi; /*图像感兴趣区域*/ int imageSize; /*图像数据大小*/ int widthStep; /*排列的图像大小,以字节为单位*/ 3.2 类体系OpenCV1.0版本,包含以下五个部分. (1)CxCore:

28、一些基本函数(各种数据类型的基本类型的基本运算等)。 (2)CV:图像处理和计算机视觉功能(图像处理、结构分析、运动分析、物体跟踪、模式识别、摄像机定标)。 (3)CvAux:一些实验性的函数。 (4)HighGUI:用户交互部分(GUI,图像视频I/O、系统调用函数)。 (5)CvCam:linux版本中已经抛弃,Windows版本中将directx支持加入HighGUI后,CVCam将彻底去掉。3.3 处理图像函数下面介绍一下OpenCV中常用的一些函数,下面就这些函数分别做说明。 1cvLoadImage 从文件中读取图像IplImage* cvLoadImage(const char*

29、 filename, int flags=CV_LOAD_IMAGE_COLOR ); filename :要被读入的文件的文件名。flags :指定读入图像的颜色和深度;指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR), 单信道 (CV_LOAD_IMAGE_GRAYSCALE), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)。深度指定输入的图像是否转为每个颜色信道每象素8位,(OpenCV的早期版本一样),或者同输入的图像一样保持不变。选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位无符号,32位有符号或

30、者32位浮点型。如果输入有冲突的标志,将采用较小的数字值。如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。 函数cvLoadImage从指定文件读入图像,返回读入图像的指针。目前支持如下文件格式:Windows位图文件 - BMP, DIB;JPEG文件 - JPEG, JPG, JPE; 便携式网络图片 - PNG; 便携式图像格式 - PBM,PGM,PPM; TIFF文件 - TIFF,TIF; JPEG 2000 图片- jp2。2cvNamedWindow 创建窗口int cvNamedWindow( co

31、nst char* name, int flags=CV_WINDOW_AUTOSIZE );name :窗口的名字,它被用来区分不同的窗口,并被显示为窗口标题。 flags :窗口属性标志。目前唯一支持的标志是CV_WINDOW_AUTOSIZE。当这个标志被设置后,用户不能手动改变窗口大小,窗口大小会自动调整以适合被显示图像(参考cvShowImage)。 函数cvNamedWindow创建一个可以放置图像和trackbar的窗口。被创建的窗口可以通过它们的名字被引用。 如果已经存在这个名字的窗口,这个函数将不做任何事情。3cvShowImage 在指定窗口中显示图像 void cvSho

32、wImage( const char* name, const CvArr* image );name :窗口的名字。 image :被显示的图像。 函数cvShowImage 在指定窗口中显示图像。如果窗口创建的时候被设定标志CV_WINDOW_AUTOSIZE,那么图像将以原始尺寸显示;否则,图像将被伸缩以适合窗口大小。 4cvWaitKey 等待按键事件 int cvWaitKey( int delay=0 );delay :延迟的毫秒数。 函数cvWaitKey无限制的等待按键事件(delay<=0时);或者延迟"delay"毫秒。返回值为被按键的值,如果超过

33、指定时间则返回-1。 注释:这个函数是HighGUI中唯一能够获取和操作事件的函数,所以在一般的事件处理中,它需要周期地被调用,除非HighGUI被用在某些能够处理事件的环境中。 注:比如在MFC环境下,这个函数不起作用。5cvSaveImage 保存图像到文件 int cvSaveImage( const char* filename, const CvArr* image );filename :文件名(注明格式)。 image :要保存的图像。 函数cvSaveImage保存图像到指定文件。图像格式的的选择依赖于filename的扩展名,请参考cvLoadImage。只有8位单通道或者3

34、通道(通道顺序为'BGR' )可以使用这个函数保存。如果格式,深度或者通道不符合要求,请先用cvCvtScale 和cvCvtColor转换;或者使用通用的cvSave保存图像为XML或者YAML格式。 6cvDestroyWindow 销毁一个窗口 void cvDestroyWindow( const char* name );name :要被销毁的窗口的名字。 函数cvDestroyWindow销毁指定名字的窗口。如果没有指定名字的窗口则函数不做任何事情。 返回值:无。 7cvReleaseImage:图像销毁函数 语法:void cvReleaseImage销毁已定义的

35、IplImage指针变量,释放占有的内存空间。 返回值:无。4 系统视频处理模块在OpenCV的CVcam库中封装了很多针对视频流的处理函数。本章主要介绍使用HighGUI对视频进行读写处理以及使用CvCam对摄像头和视频流进行处理。使用CvCam库时,要设置预编译的头文件目录*OpenCVotherlibscvcaminclude,并在工程设置加入链接库cvcam.lib。4.1视频的读写处理在获取摄像头之前先来熟悉以下OpenCV中视频获取的数据结构的管理方式。 1.CVCapture:视频获取结构 说明:OpenCV中的视频获取结构。结构CVCapture没有公共接口,他只能被用来作视频

36、获取函数中使用的一个参数。 2.cvCreateFileCapture:初始化文件中获取视频 语法:CvCapture * cvCreateFileCapture(const char*filename); 参数 类型 说明 Filename const char* 使用视频文件名 说明:该函数给指定文件的视频流分配和初始化CvCapture。 返回值:分配的CvCapture 3.cvCaptureFromCAM:从摄像头中获取视频 语法:CvCapture * cvCaptureFromCAM(int index) 参数 类型 说明 Index int index指的是摄像头的索引,当只有

37、 一个摄像头时,index设为-14.cvQueryFrame:从摄像头或者文件中抓取并返回一帧 语法: IplImage * cvQueryFrame(CvCapture * capture); 参数 类型 说明 Capture CvCapture * 视频获取结构 说明:函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。返回的图像不可以被用户释放或者修改。 返回值:获取的IplImage指针4.2视频文件处理Error! Main Document Only.4.1打开视频对视频文件处理的程序如下,获得图像效果如图:#include "stdafx.h

38、"#include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui.hpp>#include<conio.h>using namespace cv;using namespace std;int main()cvNamedWindow("video");CvCapture * capture = cvCreateFileCapture("C:Projectsopencvx64DebugWalk1.avi");IplImage* pFrame = NULL

39、; CvCapture* pCapture = NULL;while(pFrame = cvQueryFrame( pCapture ) /逐帧读取视频 cvShowImage("video", pFrame); /显示图像 /如果有按键事件,则跳出循环 /此等待也为cvShowImage函数提供时间完成显示 /等待时间可以根据CPU速度调整 if( cvWaitKey(2) >= 0 ) break; cvDestroyWindow("video"); /销毁窗口cvReleaseCapture(&pCapture); return 0;

40、在图像中加入线段的算法如下:CvPoint pt1_Rect; CvPoint pt2_Rect; pt1_Rect.x=0; pt1_Rect.y=80; pt2_Rect.x=384; pt2_Rect.y=80; int thickness=1; int line_type=8;CvScalar color=CV_RGB(255,158,97); cvLine( pFrame, pt1_Rect, pt2_Rect,color , thickness, line_type, 0 );图4.2加入线段5系统事件检测模块基于Open CV的事件检测研究,首先要从视频中提取出运动目标并获得运动

41、目标的特征信息,如颜色、形状、轮廓等。提取运动目标的过程实际上就是一个图像分割的过程,而运动物体只有在连续的图像序列(如视频图像序列)中才能体现出来,运动目标提取的过程就是在连续的图像序列中寻找差异,并把由于物体运动和表现出来的差异提取出来。建立背景模型物体检测输入视频前景检测5.1运动物体检测的基本方法运动物体检测是Open CV事件检测的第一部分,它就是实时的在被监视的场景中检测运动目标,并将其提取出来。运动物体检测常用的有四种方法:连续帧间差分法、背景差分法、光流法和运动能量法。连续帧间差分法对于动态环境有很好的适应性,但却不能够很好地分割运动对象,不利于进一步的对象识别与分析;背景差分

42、法是将当前帧每个像素与背景图像逐一比较,能够较完整的提取目标点,却又对光照和外部条件造成的动态场景变化过于敏感;光流法的优点是能够检测出独立运动的对象,不需要预先知道场景的任何信息,而且可以应用于背景整体运动的情况,但是大多数光流方法的计算复杂,除非有特殊的硬件支持,否则很难实现于实时检测;运动能量法适合于复杂变化的环境,能消除背景中振动的像素,使按某一方向运动的对象更加突出地显现出来,但运动能量法也不能精确地分割出对象。 由于运动检测处于视频运动分析的最底层,广泛的应用场合使运动检测算法应该可以处理各种复杂的情况,但很难有一种算法能够适合所有的应用场合,所以对运动检测方法的研究一直是国内外研

43、究的重点。就国内外发表的文献来看,现在普遍采用的运动检测方法有:(l)帧间差分法(FramesDifferenee) 帧间差分法也是一种基于象素的运动检测方法,它通过对视频图像序列中相邻的两个或三个图像进行差分运算来获得运动物体轮廓。从理论上看,相邻两帧或者相邻三帧的差分运算实际上是一种动态的边缘提取运算,从实际效果上看,帧间差分法能够检测出运动对象的部分轮廓信息。帧间差分法对动态环境有很强的自适应能力,但是在检测结果中,却不能完全提取出所有的属于运动对象的特征象素点,在运动物体内部容易产生空洞,这样的检测结果对随后的操作很不利。(2)背景差分法(BackgroundDifferenee) 背

44、景差分法通过输入图像与背景图像进行比较从而分割出运动目标。背景差分的基本操作是:首先需要有一张背景图像,然后对视频图像和此背景图像进行差分运算,用一张新的图像保存差分结果的绝对值。在此差分图像中,若像素的值大于一个特定的闭值,则认为视频图像中在相同位置的象素属于运动目标区域,若象素的值小于或者等于一个特定的闭值,则认为视频图像中在相同位置的象素属于背景区域。很明显,在运用背景差分法时需要有一定的限制:要求前景(运动物体)象素的灰度值和背景象素的灰度值存在一定的差别,同时要求摄像机是静止的。但由于背景差分法具有实现简单,运算速度快,在大多数情况下检测结果完整的突出优点,背景差分法成了运用最厂泛的

45、运动检测方法。由于背景差分法作用于像素,在这个低层次的处理中,操作的对象是单个的象素,由于缺乏对图像足够的“理解”,检测结果很客易受噪声和各种突变的影响,使检测结果的准确度大大下降。 (3)光流法(optiealFlow) 光流的概念是由Gibson于 1950年提出来的。所谓光流就是指图像中模型运动的速度,它是一种二维(2D)瞬时速度场,其中ZD速度矢量是可见的三维速度矢量在成像平面上的投影。用光流检测运动目标的基本原理是:给图像中的每一个像素赋予一个速度矢量,这就形成了一个图像运动场,在运动的一个特定时刻,图像上的点与三维物体上的点一一对应,这种对应关系可由投影关系得到,根据各个像素的速度

46、矢量特征,可以对图像进行动态分析。如果图像中没有运动目标,则光流矢量在整个图像区域是连续变化的,当物体和图像背景存在相对运动时,运动物体所形成的速度矢量必然和邻域背景速度矢量不同,从而检测出运动物体的位置。5.2检测算法设计与实现由于实验的视频是一个背景固定,而且运动物体是相对运动。而且实验的目的只检测背景上是否有物体越过某条警戒线。基于背景差分法的原理比较简单。而且要求使用的被监视的背景图像是静态的。这里刚好符合实验要求。背景检测出的图像如下:图5.1背景检测图像这种方法的缺点是,所采集到的背景图像随着时间的推移,会对光照和外部条件造成的场景变化比较敏感,会出现许多伪运动目标点。影响目标检测

47、的效果。程序如下: cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); cvConvert(pFrImg, pFrameMat); /高斯滤波先,以平滑图像 /cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0); /当前帧跟背景图相减 cvAbsDiff(pFrameMat, pBkMat, pFrMat); /二值化前景图 cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);/进行形态学滤波,去掉噪音 /cvErode(pFrImg, pFrImg

48、, 0, 1); /cvDilate(pFrImg, pFrImg, 0, 1);/更新背景 cvRunningAvg(pFrameMat, pBkMat, 0.003, 0); /将背景转化为图像格式,用以显示 cvConvert(pBkMat, pBkImg); /把图像正过来 pBkImg->origin=1; pFrImg->origin=1;在图像分割的诸多方法中,二值化技术是一种简单有效的方法。图像的二值化按下述公式进行:式中,G(x,y)是原图像中位于(ij)处像素的灰度;Gb(ij)是二值化后该处的像素值, 它只能取O 或l,将上式所得二值图像中数值为0 的部分表示

49、背景,数值为1 的部分表示对象图形。T 为用于二值化处理的阀值。二值化的过程本身比较简单,关键问题就是阀值的选取。在数字图像处理中,由于数学形态学算法有平滑轮廓、填充洞孔、连接断裂区域等特性,常常被用在各种图像分析的后处理操作中。数学形态学表示以形态为基础对图像进行分析的数学工具。它的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。其基本运算有4种,即膨胀、腐蚀、开运算和闭运算。形态学运算主要用于如下几个目的: .图像预处理(去噪声、简化形状) .增强物体结构(抽取骨骼、细化、粗化、凸包、物体标一记) .从背景中分割物体 .物体量化描述(面积、周长、

50、投影等特征) 黑白点的集合构成了二值图像的描述。假定只考虑黑色像素,其余部分认为是背景。基本的形态学变换是膨胀和腐蚀,由这两个变换可以定义更多的形态学运算,如开运算、闭运算和形状分解,等等。5.3 关键技术设计在特定位置处生成一条警戒线,当读入视频时,将当前帧与背景图在特定位置的像素值相减,当不为0时,说明有人入侵,相关代码如下:int x, y;int a384288;y = i;for (x = 0; x < pFrImg->width; x+)ayx = *(pFrImg->imageData + pFrImg->widthStep*y + x);if (ayx

51、!= 0)x = pFrImg->width;printf("有人入侵");break;5.4 实验结果运行生成的可执行程序,下图是在自动检测中截取的一副图。里面的人是检测的对象。实验中当有人踏进警戒线,就会在屏幕上显示“有人入侵”的字幕。图5.2 有人过线此实验中还能由操作者自由控制警戒线的位置,然后程序运行结果会因输入参数的不同而产生不同的结果,实现了动态控制。图5.3显示结果6总结与展望6.1总结从论文开题直至完成的几个月时间里,遇到了很多问题,但在黄靖老师指导、同学帮助及我自己努力下,达到了毕业设计的预计目标,学到了很多宝贵的知识。1、OpenCV是一个强大的

52、开源计算机视觉库,里面包括计算机视觉处理的很多相关算法。要学会使用这个强大工具,首先要熟悉其环境并能正确安装。在准备工作就绪后,就要认真学习OpenCV常用数据结构体系及相关函数。像素是图像和视频的基本单位,本文就是从视频每帧像素着手,通过一系列的形态学变换和图像处理来进行相关的事件检测和分析的。要学会使用好这个工具,当然扎实的C语言基础是必不可少的,里面有很多C语言的相关函数,通过这次毕业设计的创作,我进一步深化了对C语言的理解,积累了更多实践经验。2、同时也锻炼了自己独立研究学习的能力,学会如何去学新的知识,敢于面对新的挑战,培养了良好的思维方式和负责任的态度,为以后的学习和工作埋下了坚实

53、的基础。虽然开始面对这个闻所未闻的课题有点手足无措,但是通过自己查资料默默坚持学习着,终于慢慢地有所收获,后来更加得心应手,克服了眼前的困难,取得了成功。6.2展望艰难困苦,玉汝于成。本文的基于OpenCV的事件检测还比较基础,目前来看,OpenCV的应用尚处在初级阶段,为了更好的将OpenCV相关技术应用在交通事件、视频监控和实时路况检测上,需要越来越多的人的努力,使这些技术普及起来,才能让OpenCV更好的为我们服务。24参考文献1高守传,姚领田等.Visualc料数字图像处理与工程应用篇M.北京:中国 铁道出版社.2006,1 2陈兵旗,孙明.使用数字图像处理与分析M.中国农业大学出版社

54、,清华大 学出版社.2008,2 3王亮,胡卫明,谭铁牛.人运动的视觉分析综述J.计算机学报.2002(3):1一16 4朱仲杰蒋刚毅.目标基视频编码中的运动目标提取与跟踪新算法J.电子 学报.2003,9(9):1408一1426. 5张益贞,刘滔.Visualc+实现MPEG/JPEG编解码技术M.北京:人民邮电 出版社,2002 6陈胜勇, 刘勇基于OpenCV的计算机视觉技术实现7周长发VC+多媒体编程技术与实例M北京:电子工业出版社19998张星明视频图像捕获及运动检测技术的实现M计算机工程20029喻其炳多媒体信息处理在Windows中的应用J重庆工商大学学报200310Micro

55、soft IncVideo For Windows Developed Toolkit Programming GuideM200111周长发. 精通Visual C+图像处理编程. M北京:电子工业出版社,2006. 12Kruglinski DJ著,王国印译Visual C+技术内幕M北京:清华大学出版社199413Norton P著,孙风英译MFC开发Windows95NT4应用程序M北京:清华大学出版社199814张基温,贾中宁,李伟Visual C+程序开发基础M北京:高等教育出版社200215刘瑞祯,于仕琪OpenCV教程基础篇M北京:北京航空航天大学出版社20076附录(源代码)#include "stdafx.h"#include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui.hpp>#include<conio.h>using namespace cv;using namespace std;int main()cvNamedWindow("video");CvCa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论