当前位置:文档之家› 基于OpenCv的事件检测

基于OpenCv的事件检测

摘要

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

针对在给定视频中检测出特定事件,本文利用opencv的事件检测的数据结构、函数以及基本框架,建立了一个由人机交互界面模式,采用了帧差分法。该方法在安防方面已经很受重视。相信在不久的将来将会得到更大的普及。

关键词:视频;事件检测;帧差分

I

Abstract

Opencv is a function library for digital image processing and computer vision, developed by Intel’s MicroprocessorRes earch Lab and The Visual Interactivity https://www.doczj.com/doc/7212874620.html,ed in the development of language is C + +,It can be used in the Window system and the Linux system.The library is open source,It's free to download from the 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 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 frameworkstructure 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 difference

II

目录

1 绪论 (1)

1.1 目的及意义 (1)

1.2 国内外研究现状 (1)

2系统环境搭建 (2)

2.1 Open CV简介 (2)

2.2 Open CV 环境介绍 (4)

2.3 Open CV的特征 (4)

2.4 开发环境的安装与配置 (5)

2.4.1安装OpenCV2.4.9 (5)

2.4.2配置windows环境变量 (7)

2.4.3配置visual C++6.0环境及全局设置 (9)

2.4.4导入库文件 (9)

3 Open CV的事件检测系统结构与应用 (11)

3.1 数据结构体系 (11)

3.2 类体系 (12)

3.3 处理图像函数 (12)

4 系统视频处理模块 (15)

4.1视频的读写处理 (15)

4.2视频文件处理 (15)

5系统事件检测模块 (18)

5.1运动物体检测的基本方法 (18)

5.2检测算法设计与实现 (20)

5.3 关键技术设计 (22)

5.4 实验结果 (22)

6总结与展望 (24)

6.1总结 (24)

6.2展望 (24)

参考文献 (25)

附录(源代码) (26)

致谢 (29)

1 绪论

1.1 目的及意义

计算机视觉是研究用计算机模拟生物外显或宏观视觉功能的科学和技术。OpenCV,全名为Open Source Computer Vision Library,是Intel公司资助的开源计算机视觉库。它由一系列C函数和少量C++类构成,提供了针对各种形式的图像和视频源文件(bitmap图像,video文件和实时摄像机)的帧提取函数和很多标准的图像处理函数,实现了图像处理和计算机视觉方面的很多通用算法。作为计算机视觉研究的一个分支—基于Open CV事件检测,就是对视场内的运动目标,如人或车辆等,进行实时的观测,并在此基础上对被观测对象进行分类,然后分析它们的行为。近年来,计算机视觉的研究重点已经从对静态图像的研究过渡到对动态图像序列的研究上面,这方面的典型应用包括自动化的视频监控系统、视频MPEG编解码技术、人机交互的感知接口、军事上的制导、雷达视频图像中的目标分析。

1.2 国内外研究现状

国外的视频检测技术研究开始的较早,经过十几年的发展,技术己经相当成熟,视频检测与线圈检测技术相比具有的优越性和高性价比己得到业内人士的公认,代表了未来检测领域的发展和应用方向。视频检测技术虽然在国内研究起步比较晚,但经过这些年的迅速发展,也取得了很多研究成果, 如中国科学院自动化研究所模式识别国家重点实验室研究员从20世纪90年代初就开始研究基于三维模型的智能视觉监控系统,领导视觉监控小组,针对系统中若干关键性问题像车辆检测、跟踪以及车辆行为分析,进行了深入的研究和探讨,提出了自己的见解和主张,取得了一系列的研究成果。国内产品虽然实现了视频检测的功能,但在实际的推广中并不明显,远远没有达到实际应用的要求,同国外产品还有相当的差距。因此,我们国家在此的研究还要加强,真正做出适合市场需求的产品。

1

2系统环境搭建

2.1 Open CV简介

OpenCV是Intel公司资助的开源计算机视觉库。它由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。

其重要重要特性包括:

拥有包括300多个C函数的跨平台的中、高层API。它不依赖于其它的外部库—尽管也可以使用某些外部库。

对非商业应用和商业应用都是免费(FREE)的。

为Intel Intergrated Perfomance Primitives(IPP)提供了透明接口。这意味着如果有为特定处理器优化的的IPP库,OpenCV将在运行时自动加载这些库。

在过去的十年,随着处理器速度和内存容量以摩尔定律增长,计算机视觉的研究和应用也得到了迅速的发展。以往传统的开发方法要求工程人员在完成的硬件设计的同时,自己编码实现所有底层的算法,所有的图像处理函数都要从头编写,既造成时间和精力上的浪费,又难以保证稳定性、实用性和通用性,越来越难以满足现实的需求。为了解决理论到应用的难题,出现了众多的计算机视觉和图像处理软件包。大多数软件包是用C/C++编写的。例如,TargetJr及其后续版本VXL(the Vision something LIbrarise)就是这样一个C++库的集合,在满足的小型、快速和稳固的系统的开发要求的同时提供了多平台移植性。Gandalf提供了计算机视觉和数值计算库,适合于可移植平台的视觉应用软件的开发。Delft科学图像处理库DIPlib是另一个科学图像处理C程序库.包含了许多图像数据多维分析和处理函数。同时许多商用图像处理和计算机视觉软件包也得到相应开发。MVTec公司开发的HALCON是其中之一,它包含了C/C++代码的图像处理库。LabView在Nl图像处理硬件的支持下能加速图像处理。由微软公司开发的SDK 是一个底层的图像操作分析的C++库。在Matlab中的图像处理工具包以及在Mathematica中的数字图像处理软件包都是较为强大的图像处理工具,同时这两个软件包兼有许多高级数学计算功能。由Aurora公司开发的LEADTOOLS是一套商用化计算机视觉包,它包括了图像处理服务器开发工具。允许用户创建各种基于网络的图像处理服务程序。

这些软件包为计算机图像分析和机器视觉提供了极大的便利,但也存在不足之处。

大多数软件包没有高级数学计算函数。并且这些软件包都不包括如目标跟踪、

2

摄像机标定、姿态识别、脸谱识别和三维重建等高层函数。

Matlab是功能较为强大的科学计算和分析平台,它提供了图像处理工具包,也提供了较为丰富的数学计算函数,但在Matlab环境下的运行速度令人担忧。虽然Matlab可以通过编译器将m文件转化为C代码。但是转换后的C代码的执行效率和可读性存在较大问题。

除Matlab和LEADTOOLS。大部分软件包不支持网络服务器结构的应用程序的开发;Matlab的网络接口机制较为复杂,且同样存在运行效率的问题。

绝大多数软件包不支持可嵌人性。

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

丰富的函数功能,强大的图像和矩阵运算能力: OpenCV提供了数组、序列、矩阵、树等基本结构,也包含了差分方程求解、傅立叶分析、积分运算、特殊函数等众多高级数学计算函数,以及各种图像处理操作和目标跟踪、摄像机校准、三维重建等高级视觉函数。

平台无关性:基于OpenCV开发的程序可以直接在Windows、Unix、Linux、MacOSX、solaris、HP等平台之间相互移植,无需对代码进行任何修改。

程序运行的实时性:完成调试的代码可以编译连接成二进制可执行文件。从而得到较快的运算速度,满足实时性运算的要求。

方便灵活的用户接口。OpenCV作为一个开放的计算机视觉函数库在使用上必然没有Matlab那样解释执行来得方便,而softhitegration将CH和OpenCV 绑定起来推出的CH OpenCV,解决了这一使用上的瓶颈。CH本身是一种嵌入式跨平台的C/C一脚本解释器,有自己的外壳程序,可以应用于2D/3D绘图、数值计算、分布式网络运算。CH OpenCV具有以下特性:

1.交互性:如同Matlab,CH OpenCV是交互式的。代码不需要编译就能解释执行。适合于快速建模和应用程序开发。同时为游动代码的计算机视觉提供了可能。

3

2.强大的扩展功能:通过Ch SDK。可以使现在所有的C/C++动态库、静态库和模块成为Ch函数库的一部分.因此Ch函数库的扩充潜能几乎是无限的。先前提及的所有计算机视觉软件包都能成为CH OpenCV补充部分。

3.Web实现性:类似于ASP和Java服务程序。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操作系统的编程工具。像其他的可视化开发环境一样,VC++集程序的代码编辑、编译、链接和调试于一体,给编程人员提供了一个完整而又方便的开发环境,和许多有效的辅助开发工具。同时,因为VC++是微软的产品,用它来编写Windows程序有强大的程序接口和丰富的开发资源的支持,加之VC++严谨的内存管理,在堆栈上良好的分配处理,生成代码的体积小,稳定性高的优点,Visual C++就成为目前主流开发工具。由于OpenCV 的代码是用C和C++所编写而且完全开放,因此可以在Microsoft Visual Studio 环境下很方便地使用OpenCV所提供的库来进行图像处理。在介绍OpenCV编程环境之前,首先要来了解如何安装OpenCV和基本的编程软件,下面的说明假设已经安装完成Microsoft Visual C++ 6.0。

2.3 Open CV的特征

OpenCV的主要特征有以下几个方面:

(1)图像数据的操作 ( 分配、释放、复制、设置和转换)。

(2)图像是视频的输入输出I/O (文件与摄像头的输入、图像和视频文件输出)。

(3)矩阵和向量的操作以及线性代数的算法程序(矩阵积、解方程、特征值以及奇异值等)。

(4)各种动态数据结构(列表、队列、集合、树、图等)。

(5)基本的数字图像处理(滤波、边缘检测、角点检测、采样与差值、色彩

4

转换、形态操作、直方图、图像金字塔等)。

(6)结构分析(连接部件、轮廓处理、距离变换、各自距计算、模板匹配、Hough变换、多边形逼近、直线拟合、椭圆拟合、Delaunay 三角划分等)。

(7)摄像头定标(发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计、立体对应)。

(8)运动分析(光流、运动分割、跟踪)。

(9)目标识别(特征法、隐马尔可夫模型:HMM)。

(10)基本的GUI (图像与视频显示、键盘和鼠标事件处理、滚动条)。

(11)图像标注(线、二次曲线、多边形、画文字

2.4 开发环境的安装与配置

2.4.1安装OpenCV2.4.9

要将OpenCV安装到C:\Program Files\OpenCV。在安装时选择"将\OpenCV\bin加入系统变量"(Add\OpenCV\bin to the systerm PATH)。

图2.1安装示例1

5

图2.2安装示例2

图2.3安装示例3

6

图2.4安装示例4

2.4.2配置windows环境变量

检查C:\Program Files\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入。加入后需要重启后重新登陆才生效。

7

图2.5系统属性

图2.6环境变量

8

2.4.3配置visual C++6.0环境及全局设置

在菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径:

C:\Program Files\OpenCV\lib

然后选择include files,在下方填入路径:

C:\Program Files\OpenCV\cxcore\include

C:\Program Files\OpenCV\cv\include

C:\Program Files\OpenCV\cvaux\include

C:\Program Files\OpenCV\ml\include

C:\Program Files\OpenCV\otherlibs\highgui

C:\Program Files\OpenCV\otherlibs\cvcam\include

然后选择source files,在下方填入路径:

C:\Program Files\OpenCV\cv\src

C:\Program Files\OpenCV\cxcore\src

C:\Program Files\OpenCV\cvaux\src

C:\Program Files\OpenCV\otherlibs\highgui

C:\Program Files\OpenCV\otherlibs\cvcam\src\windows

图2.7设置lib路径

最后点击“ok”,完成设置。

2.4.4导入库文件

9

每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上(cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib)这些文件。

图2.8导入库文件

10

3 Open CV的事件检测系统结构与应用

Open CV本身就具有简单方便的特点,其中的大部分类和库函数在实际应用中都有着特定的背景和现实意义,因此整个库的体系结构显得十分简单明了。3.1 数据结构体系

OpenCV设计了一些基础的数据类型和一些帮助数据类型,在运用Opencv函数库进行编程的过程中,常常会需要用到这些结构类型,只有正真了解这些结构才能够很好地利用Opencv函数库来解决问题。

基础的数据类型包括:图像类的IplImage,矩阵类的CvMat,可变集合类的CvSeq、CvSet、 CvGraph以及用于多维柱状图的混合类CvHistogram。帮助数据类型包括:用于表示二维点坐标的CvPoint,用于表示图像宽和高的CvSize等。

下面对CvSize和和IplImage两个比较常用的简单结构进行介绍。

1. CvSize结构

CvSize结构用来表示矩形尺寸的结构,结构体中分别定义了矩形的宽高和高度。

定义如下:

Typedef struct Cvsize

{int width; /*矩形宽度,单位为像素*/

int height; /*矩形高度,单位为像素*/

}CvSize;

2. Iplmage 结构

通常情况下,使用DIB格式来处理图像,而OpenCV库则是使用“IplImage”结构体来创造和处理图像。由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体就是IplImage结构。IplImage结构来源于Inter的另外一个函数库IPL,该函数库主要是针对图像处理。使用这种格式的优点是可以比DIB格式表示更多的图像性质,而且可以很方便地存取图像中的像素值,IplImage结构的具体定义如下:

Typedef struct IplImage

{int nSize; /*IplImage大小*/

int ID; /*版本(=0)*/

int nChannels; /*大多数opencv函数支持1~4个信道*/

11

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:一些基本函数(各种数据类型的基本类型的基本运算等)。

(2)CV:图像处理和计算机视觉功能(图像处理、结构分析、运动分析、物体跟踪、模式识别、摄像机定标)。

(3)CvAux:一些实验性的函数。

(4)HighGUI:用户交互部分(GUI,图像视频I/O、系统调用函数)。

(5)CvCam:linux版本中已经抛弃,Windows版本中将directx支持加入HighGUI后,CVCam将彻底去掉。

3.3 处理图像函数

下面介绍一下OpenCV中常用的一些函数,下面就这些函数分别做说明。

1.cvLoadImage 从文件中读取图像

IplImage* cvLoadImage(const char* filename, int flags=CV_LOAD_IMAGE_COLOR );

filename :要被读入的文件的文件名。

flags :指定读入图像的颜色和深度;

指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR), 单信道(CV_LOAD_IMAGE_GRAYSCALE), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)。

深度指定输入的图像是否转为每个颜色信道每象素8位,(OpenCV的早期版本一样),或者同输入的图像一样保持不变。

12

选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位无符号,32位有符号或者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。

2.cvNamedWindow 创建窗口

int cvNamedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE );

name :窗口的名字,它被用来区分不同的窗口,并被显示为窗口标题。

flags :窗口属性标志。目前唯一支持的标志是CV_WINDOW_AUTOSIZE。当这个标志被设置后,用户不能手动改变窗口大小,窗口大小会自动调整以适合被显示图像(参考cvShowImage)。

函数cvNamedWindow创建一个可以放置图像和trackbar的窗口。被创建的窗口可以通过它们的名字被引用。

如果已经存在这个名字的窗口,这个函数将不做任何事情。

3.cvShowImage 在指定窗口中显示图像

void cvShowImage( const char* name, const CvArr* image );

name :窗口的名字。

image :被显示的图像。

函数cvShowImage 在指定窗口中显示图像。如果窗口创建的时候被设定标志CV_WINDOW_AUTOSIZE,那么图像将以原始尺寸显示;否则,图像将被伸缩以适合窗口大小。

4.cvWaitKey 等待按键事件

int cvWaitKey( int delay=0 );

13

delay :延迟的毫秒数。

函数cvWaitKey无限制的等待按键事件(delay<=0时);或者延迟"delay"毫秒。返回值为被按键的值,如果超过指定时间则返回-1。

注释:这个函数是HighGUI中唯一能够获取和操作事件的函数,所以在一般的事件处理中,它需要周期地被调用,除非HighGUI被用在某些能够处理事件的环境中。

注:比如在MFC环境下,这个函数不起作用。

5.cvSaveImage 保存图像到文件

int cvSaveImage( const char* filename, const CvArr* image );

filename :文件名(注明格式)。

image :要保存的图像。

函数cvSaveImage保存图像到指定文件。图像格式的的选择依赖于filename 的扩展名,请参考cvLoadImage。只有8位单通道或者3通道(通道顺序为'BGR' )可以使用这个函数保存。如果格式,深度或者通道不符合要求,请先用cvCvtScale 和cvCvtColor转换;或者使用通用的cvSave保存图像为XML或者YAML格式。

6.cvDestroyWindow 销毁一个窗口

void cvDestroyWindow( const char* name );

name :要被销毁的窗口的名字。

函数cvDestroyWindow销毁指定名字的窗口。如果没有指定名字的窗口则函数不做任何事情。

返回值:无。

7.cvReleaseImage:图像销毁函数

语法:void cvReleaseImage

销毁已定义的IplImage指针变量,释放占有的内存空间。

返回值:无。

14

4 系统视频处理模块

在OpenCV的CVcam库中封装了很多针对视频流的处理函数。本章主要介绍使用HighGUI对视频进行读写处理以及使用CvCam对摄像头和视频流进行处理。使用CvCam库时,要设置预编译的头文件目录*\OpenCV\otherlibs\cvcam\include,并在工程设置加入链接库cvcam.lib。

4.1视频的读写处理

在获取摄像头之前先来熟悉以下OpenCV中视频获取的数据结构的管理方式。

1.CVCapture:视频获取结构

说明:OpenCV中的视频获取结构。结构CVCapture没有公共接口,他只能被用来作视频获取函数中使用的一个参数。

2.cvCreateFileCapture:初始化文件中获取视频

语法:CvCapture * cvCreateFileCapture(const char*filename);

参数类型说明

Filename const char* 使用视频文件名

说明:该函数给指定文件的视频流分配和初始化CvCapture。

返回值:分配的CvCapture

3.cvCaptureFromCAM:从摄像头中获取视频

语法:CvCapture * cvCaptureFromCAM(int index)

参数类型说明

Index int index指的是摄像头的索引,当只有

一个摄像头时,index设为-1

4.cvQueryFrame:从摄像头或者文件中抓取并返回一帧

语法: IplImage * cvQueryFrame(CvCapture * capture);

参数类型说明

Capture CvCapture * 视频获取结构

说明:函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。返回的图像不可以被用户释放或者修改。

返回值:获取的IplImage指针

4.2视频文件处理

15

对视频文件处理的程序如下,获得图像效果如图:

14.1打开视频

#include "stdafx.h"

#include

#include

#include

using namespace cv;

using namespace std;

int main()

{

cvNamedWindow("video");

CvCapture * capture = cvCreateFileCapture("C:\\Projects\\opencv\\x64\\Debug\\Walk1.avi");

IplImage* pFrame = NULL;

CvCapture* pCapture = NULL;

while(pFrame = cvQueryFrame( pCapture )) //逐帧读取视频

{

cvShowImage("video", pFrame); //显示图像

//如果有按键事件,则跳出循环

//此等待也为cvShowImage函数提供时间完成显示

//等待时间可以根据CPU速度调整

if( cvWaitKey(2) >= 0 )

break;

}

cvDestroyWindow("video"); //销毁窗口

cvReleaseCapture(&pCapture);

16

return 0;

}

在图像中加入线段的算法如下:

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加入线段

17

相关主题
文本预览
相关文档 最新文档