基于opencv目标跟踪与检测课程设计
更新时间:2023-09-29 11:13:01 阅读量: 综合文库 文档下载
课程设计Ⅰ设计报告
题 目:基于Opencv运动目标跟踪与检测 学 号: 姓 名: 学 院: 信息学院 专业班级: 计算机软件2班 指导教师: 黄文培 设计时间: 2012.9.3
指导老师评语:
评定成绩: 签名: 日期:
摘 要
本文先介绍一种开放源代码的计算机视觉类库OpenCV,主要阐述该类库的特点及其结构,然后介绍本人学习opencv一些基本功能的实现以及结果。最后通过“检测一个视频中的运动物体”这一实例探讨了使用OpenCV进行编程的方法。 关键词 图像处理 目标检测
OpenCV IplImage VC++
目 录
1 概述.............................................................. 4 1.1 目标跟踪与检测课程设计目的 .................................... 4 1.2 目标跟踪与检测设计任务与要求 .................................. 4 1.3 目标跟踪与检测的开发环境 ...................................... 4 2 目标跟踪与检测系统设计的基本概念与原理............................ 4 2.1 目标跟踪与检测的基本概念与知识 ................................ 4 2.2目标跟踪与检测系统设计实现平台的搭建 ......................... 12 2.1与目标跟踪与检测相关的一些基本功能 ........................... 18 3 基于OPENCV运动目标跟踪与检测系统实现的详细说明.................. 33 3.1 一般目标跟踪的实现 ........................................... 33 3.2 本文的检测算法 ............................................... 34 3.3 CAMSHIFT算法原理及其OPENCV实现 ................................ 35 3.4目标跟踪与检测系统的运行结果 ................................. 39 4 目标跟踪与检测的课程设计总结..................................... 44 参考文献
1概述
1.1目标跟踪与检测课程设计目的
1.通过实验了解opencv运动物体跟踪的数据结构、函数以及基本框架; 2.通过实验提高对于图像与视频的认识;
3.通过学习,掌握基本的opencv图像与视频的知识。
4.通过实验将理论和实践联系起来,提升对于理论知识的认识;
1.2目标跟踪与检测设计任务与要求
1.通过学习做该课程设计,掌握一些opencv的基本知识以及图像与视频的知识。 2.调用基于intel 的开源视觉库opencv,实现视频或者摄像头的监控; 3.编程实现对进入视觉范围内的运动物体实施监测;
1.3 目标跟踪与检测Opencv开发环境
一台pc机,Microsoft Visual C++ 6.0
2 系统设计的基本概念与原理
2.1 目标跟踪与检测基本概念与知识
2.1.1. OpenCV简介
开放源代码的计算机视觉类库OpenCV (Intel Open Source Computer Vision Library)由英特尔公司开发.它是一套可免费获得的由一些C函数和C++类所组成的库,用来实现一些常用的图像处理及计算机视觉算法。OpenCV主要用于对图像进行一些高级处理,比如说特征检测与跟踪、运动分析、目标分割与识别以及3D重建等。
它有以下特点; 开放C源码,基于Intel处理器指令集开发的优化代码,统一的结构和功能定义,强大的图像和矩阵运算能力,方便灵活的用户接口,同时支持WINDOWS、LINUX平台等。
(1) OpenVC的数据结构
OpenCV提供了多种基本数据类型,虽然这些数据类型在C语言中不是基本类型,但结构都很简单,可将它们作为原子类型。在运用OpenCV函数库进行编程的过程中,常常会需要用到这些结构类型,只有真正了解这些结构才能够很好地利用OpenCV函数库来解决问题
基础的数据类型包括:CvPoint基于二维整形坐标轴的点.CvSize矩形框大小。CvRect矩形框的偏移和大小,以像素为精度,CvMat多通道矩阵等。
OpenCV提供了多种基本数据类型,虽然这些数据类型在C语言中不是基本类型,但结构都很简单,可将它们作为原子类型。在运用OpenCV函数库进行编程的过程中,常常会需要用到这些结构类型,只有真正了解这些结构才能够很好地利用OpenCV函数库来解决问题。 下面对几个比较常用的简单结构进行介绍。 1)CvPoint结构
在这些数据类型中最简单的就是CvPoint,它表示二维坐标系下的点,类型为整型,定义如下:
typedef struct CvPoint {
int x; /* x坐标, 通常以0为基点 */ int y; /* y坐标, 通常以0为基点 */ } CvPoint; 2)CvSize结构
CvSize结构用来表示矩形框大小,以像素为精度,结构体中分别定义了矩形的宽高和高度,定义如下: typedef struct Cvsize {
int width; /*矩形宽度,单位为像素*/ int height; /*矩形高度,单位为像素*/ }CvSize;
3)CvRect结构该结构是用来表示矩形框的偏移和大小。 typedef struct CvRect {
int x; /* 方形的最左角的x-坐标 */
int y; /* 方形的最上或者最下角的y-坐标 */ int width; /* 宽 */ int height; /* 高 */ }CvRect; 4)CvScalar 结构
该结构是用来定义存放1- 4个数值的数组。 typedef struct Cvscalar {
double val[4];
}CvScalar; //可用来表示RGBA的值,A=alpha透明度 5)IplImage 结构
OpenCV库主要是使用“IplImage”结构体来创造和处理图像。IplImage结构来源于inter的另外一个函数库IPL,该函数库主要是针对图像处理。定义如下: typedef struct IplImage
{
int nSize; int ID;
/*IplImage大小*/ /*版本(=0)*/
int nChannels; /*大多数opencv函数支持1~4个信道*/ int depth; /*像素的位深度*/
int dataOrder; /*0:交叉存取颜色信道。1:分开的颜色信道。只有cvCreateImage可以创建交叉存取图像*/ int origin; int width;
/*0:顶—左结构,1:底—左结构*/
/* 图像宽像素 */
/*图像高像素*/
int heighet;
struct_IplROI *roi; /*图像感兴趣区域*/ int imageSize; /*图像数据大小*/
int widthStep; /*排列的图像大小,以字节为单位*/ }IplImage;
动态结构类型包括:内存存储,序列,集合,图,树。
(2)OpenCV的函数体系
OpenCV中每个函数的命名都已“cv”开始,然后是该函数的行为及目标。例如用来创建图像的函数“cvCreatelmage”,载入图像的函数“cvLoadlmage”。OpenCV是为图像处理及计算机视觉在实际工程中的应用而设计的一个类库。其中所有的函数都有与其在实际应用中所实现的不同功能而分属不同的类型。主要函数类型有:
(1)基本的图像处理与分析函数
图像处理和分析的一些函数。其中大多数函数都是针对两维象素数组的,这里我们称这些数组为“图像”,但是它们不一定非得是IplImage结构.也可以是CvMat或者CvMatND结构。这个类型的函数主要用于实现一些基本的图像处理与分析功能。
例如图像平滑函数cvSmooth,Sobel算子cvSobel,Canny边缘分割函数cvCanny。创建直方图cvCreateHist等。
(2)结构分析函数
例如用多边形曲线逼近Freeman 链函数cvApprexChains,函数cvMaxRect寻找包含两个输入矩形的具有最小面积的矩形边界等。 (3)运动分析与对象跟踪函数
例如背景重建函数cvAcc.用光流法或动态轮廓模型来实现目标跟踪的函数cvCalcOp tiealFlowBM 和cvSnake Image以及卡尔曼滤波函数CvKalman 等。 (4)摄像机标定和3D重建函数
例如函数cvCalibrateCamera利用目标图像模式和目标模式的象素点信息计算相机参数.函数cvFindExtrinsieCamera_Params寻找模式的摄像机外参数矩阵等。 (5)模式识别
例如函数cvLoadHaarClassifierCascade用于从文件中装载训练好的利用海尔特征的级联分类器.或者从OpenCV中嵌入的分类器数据库中导入。 (6) GUI与视频处理函数
包括有高级图形用户接口highGUI用以实现对图像的载入、显示及保存等基本操作以及用以实现视频输入输出及处理的函数。
根据上述的函数体系。程序开发者可以根据自己所开发应用程序所要实现的功能来方便地选择所需的库函数.从而大大减少开发时间和精力。缩短程序开发的周期。
(3)OpenCV常用的函数
下面介绍一下OpenCV中常用的几个函数,也是利用OpenCV进行特定目标体识别的过程中常用到的函数,分别说明如下。 1)cvLoadImage( ):载入图像 IplImage* cvLoadImage( const char* filename,
int iscolor=CV_LOAD_IMAGE_COLOR );
filename:要被读入的文件的文件名。
iscolor:指定读入图像的颜色和深度。指定的颜色可以将输入的图片转为3信
道(CV_LOAD_IMAGE_COLOR),单信道(CV_LOAD_IMAGE_GRAYSCALE),或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)。
2)cvShowImage( ):在指定窗口中显示图像 void cvShowImage( const char* name, const CvArr* image );
name:窗口的名字。 image:被显示的图像。
(3)IplImage* cvCreateImage分配图像空间 (CvSize size, int depth, int channels); size: cvSize(width,height);
depth: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F
channels: 1, 2, 3 or 4.
注意数据为交叉存取.彩色图像的数据编排为b0 g0 r0 b1 g1 r1 ... 举例:
分配一个单通道字节图像
IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 分配一个三通道浮点图像
IplImage* img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 释放图像空间:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img); 复制图像:
IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage* img2;img2=cvCloneImage(img1);
(4)设定/获取兴趣通道:void cvSetImageCOI(IplImage* image, int coi); //
0=all
int cvGetImageCOI(const IplImage* image); 设定/获取兴趣区域:
void cvSetImageROI(IplImage* image, CvRect rect); void cvResetImageROI(IplImage* image); vRect cvGetImageROI(const IplImage* image);
2.1.2.目标检测
目标检测(object detection)是将运动的物体从背景中检测出来,人们希望设计能适用于各种监控环境,不受光照、天气等外界因素影响的目标检测算法。但这种算法难免复杂度大,现有一些算法大多是针对某一类问题提出的,主要包括背景减法、相邻帧差法等 。
(1) 背景减法
背景减法(background subtraction)是目前运动目标检测的主流方法 ,其基本思想是将当前每一帧图像与事先存储或实时获取的背景图像相减,计算出与背景偏离超过一定阈值的区域作为运动区域。该算法实现简单,相减结果直接给出目标的位置、大小、形状等信息,能够提供关于运动目标区域的完整描述,特别是对于摄像机静止的情况,背景减法是实现运动目标实时检测和提取的首选方法。
背景减法实现的关键是背景模型的获取和更新。背景获取算法通常要求在场景中存在运动目标的情况下获取背景图像,更新过程使背景能够适应场景的各种变化和干扰,如外界光线的改变,背景中对象的扰动和固定对象的移动,阴影的影响等。
一种典型的背景建模方法是用混合高斯模型描述背景图像像素值的分布 ,目标检测过程中判断图像的当前像素值是否符合该分布,若是被判为前景点,否则为背景点。同时根据新获取的图像,对背景图像参数进行自适应更新。该方法能够可靠处理光照变化、背景混乱运动的干扰以及长时间的场景变化等。在此基础上,对背景、静止目标和运动目标三者采取不同的更新策略,以减弱背景更新
过程中运动目标对背景的影响。
(2) 相邻帧差法
相邻帧差法(temporal differencing)利用序列中连续两帧或几帧图像间的差异进行目标的检测和提取。由于相邻帧的时间间隔一般较短,因此算法对场景中的动态变化不太敏感,具有较强的自适应性。但该方法一般不能完全提取出所有相关的特征像素点,在运动实体内容易产生空洞现象。累积图像差分法进一步计算一阶和二阶差分图像,利用时间序列图像的历史积累信息,能够适应低对比度有噪时间序列,判断复杂情况下目标运动的多种状态。
以上两种目标检测方法适用于背景固定不变的情形,对于背景发生运动的情况,需要提前对由摄像机引起的背景移动进行补偿。帧间差分法是一种通过对视频图像序列中相邻两帧作差分运算来获得运动目标轮廓的方法,它可以很好地适用于存在多个运动目标和摄像机移动的情况。当监控场景中出现异常物体运动时,帧与帧之间会出现较为明显的差别,两帧相减,得到两帧图像亮度差的绝对值,判断它是否大于阈值来分析视频或图像序列的运动特性,确定图像序列中有无物体运动。图像序列逐帧的差分,相当于对图像序列进行了时域下的高通滤波。
帧间差分法的优点是:算法实现简单,程序设计复杂度低;对光线等场景变化不太敏感,能够适应各种动态环境,稳定性较好。其缺点是:
不能提取出对象的完整区域,只能提取出边界;同时依赖于选择的帧间时间间隔。对快速运动的物体,需要选择较小的时间间隔,如果选择不合适,当物体在前后两帧中没有重叠时,会被检测为两个分开的物体:而对慢速运动的物体,应该选择较大的时间差,如果时间选择不适当,当物体在前后两帧中几乎完全重叠时,则检测不到物体。
(2) 光流法
光流法检测运动物体的基本原理是:给图像中的每一个像素点赋予一个速度矢量,这就形成了一个图像运动场,在运动的一个特定时刻,图像上的点与三维物体上的点一一对应,这种对应关系可由投影关系得到,根据各个像素点的速度矢量特征,可以对图像进行动态分析。如果图像中没有运动物体,则光流矢量在整个图像区域是连续变化的。当图像中有运动物体
时,目标和图像背景存在相对运动,运动物体所形成的速度矢量必然和邻域背景速度矢量不同,从而检测出运动物体及位置。采用光流法进行运动物体检测的问题主要在于大多数光流法计算耗时,实时性和实用性都较差。但是光流法的优点在于光流不仅携带了运动物体的运动信息,而且还携带了有关景物三维结构的丰富信息,它能够在不知道场景的任何信息的情况下,检测出运动对象。
2.1.3.关于图像与视频
1.图像的种类:计算机的图像分为两大类,即位图图像和矢量图形。
位图:采用点阵方式构成图像,可以表现丰富的图像色彩,但是文件占用存储空间较大。
矢量图:以数学矢量方式记录图像,适合表示色彩较少的图像,但是可以表现和保持清晰的图像曲线,缩小、放大不会失真,文件占用存储空间较小。像素:位图图像是由许多个离散的点组成,它们是组成图像的基本单元,被称为像素。
2. 关于图像的通道(nchannels)问题:
1通道:描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道,为1。
2通道:2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便;还有一种情况就是16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道,常见格式有RGB555或RGB565,也就是说R占5位,G占5或6位,B占5位,也有RGBA5551格式。古老的格式,不用也罢。
3通道:如果一个像素点,由RGB三种颜色来描述它,就是三通道,为3。 4通道:windows的bmp有时候是一个四通道图像,R、G、B加上一个A通道,一般叫做alpha通道,表示透明度。
3. 关于视频
视频(Video)泛指将一系列静态影像以电信号方式加以捕捉,纪录,处理,储存,传送,与重现的各种技术。连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的
视觉效果,这样连续的画面叫做视频。
帧数:帧数就是在1秒钟时间里传输的图片的量,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。 但文件大小会变得越大。帧率:帧率(Frame rate)是用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second,简称:FPS)或“赫兹”(Hz)。此词多用于影视制作和电子游戏。 Frame rate中文常译为“画面更新率”或“帧率”,是指视频格式每秒钟播放的静态画面数量。典型的画面更新率由早期的每秒6或8张(frame per second,简称fps),要达成最基本的视觉暂留效果大约需要10fps的速度。
2.2 系统设计实现平台的搭建
开发平台搭建
安装、下载Opencv,并在Microsoft Visual C++ 6.0编译环境下配置opencv。在vc++2006中建立新工程以后,在工程设置里添加需要的opencv库,并在程序文件中包含opencv的头文件。 2.2.1安装OpenCV 从http://www.opencv.org.cn 下载OpenCV安装程序。假如要将OpenCV安装到C:\\Program Files\\OpenCV。(下面附图为OpenCV 1.0rc1的安装界面,OpenCV 1.0安装界面与此基本一致。)在安装时选择\将\\OpenCV\\bin加入系统变量\(Add\\OpenCV\\bin to the systerm PATH)。
2.2.2配置Windows环境变量 检查C:\\Program Files\\OpenCV\\bin是否已经被加入到环境变量PATH,如果没有,请加入。加入后需要注销当前Windows用户(或重启)后重新登陆才生效。(可以在任务管理器里重启explorer.exe)
2.2.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 最后点击“ok”,完成设置。 项目设置 每创建一个将要使用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 如果你不需要这么多lib,你可以只添加你需要的lib。
2.2.4.在相应的程序前包含相关头文件。
2.3一些opencv的基本功能
2.3.1图片显示
利用opencv中自带的函数打开一张图片。
代码:
#include \
int main(int argc, char* argv[]) {
//创建一个IplImage指针,使用cvLoadImage函数打开一个视频,第一个参数是视频的
路径,第二个参数是指
IplImage* src = cvLoadImage(\图像\\\\2j.jpg\ //给打开的窗口命名 }
cvNamedWindow(\//显示这张图片
cvShowImage(\cvWaitKey(0); return 0;
2.3.2加载一个视频。
(1)有关代码:
#include\
int main(int argc, char* argv[]) {
cvNamedWindow(\
// CvCapture
CvCapture* capture = cvCreateFileCapture(\学习\\opencv\\\\学习opencv代码\\\\读取一个视频\\\\绝望的主妇第七季01.avi\
IplImage* frame;
while(1) { frame = cvQueryFrame(capture);
正在阅读:
基于opencv目标跟踪与检测课程设计09-29
人防工程监理实施细则05-26
品读论语随笔11-20
云南旅游注意事项:去云南旅游要注意什么02-13
英语专业本科毕业论文写作04-20
初三英语完形填空专项练习06-24
热工设备课程设计教学大纲04-21
小学语文古诗教学方法初探04-17
医院救护车驾驶员岗位试题05-30
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 跟踪
- 基于
- 检测
- 目标
- 课程
- opencv
- 设计
- 八年级上册地理读图复习题
- 现浇箱梁施工技术方案
- C#期末模拟题
- 手动变速器设计 - 图文
- PTN最新题库中级
- 湘教版 - - - 四年级下期 - - - - - - 语文期末试卷 - - - 及答案
- 资产评估-计算题-2
- 2013年华鲁恒升财务报表分析
- 2011年房地产新国八条全文
- 你猜
- 2019学年江苏省无锡市滨湖区七年级上学期期中考试数学试卷含答案及解析
- 《独立性检验的基本思想及其初步应用》说课稿
- 词义辨析
- 高数中需要掌握证明过程的定理
- 机械工程学院过程装备与控制工程认识实习报告
- 精选资料-八年级物理全册7.2力的合成教案(新版)沪科版
- 课堂教学有效性策略研究结题报告 - 董春美
- 实验二01直线、圆弧及曲线的生成算法
- 2015-2020年中国口蹄疫疫苗市场评估及市场行情动态报告
- 本科教育全程导师制模式构建的新思路