课程设计Ⅰ设计报告题目:基于Opencv运动目标跟踪与检测学号:姓名:学院:信息学院专业班级:计算机软件2班指导教师:黄文培设计时间:2012.9.3指导老师评语:评定成绩:签名:日期:摘要本文先介绍一种开放源代码的计算机视觉类库OpenCV,主要阐述该类库的特点及其结构,然后介绍本人学习opencv一些基本功能的实现以及结果。最后通过“检测一个视频中的运动物体”这一实例探讨了使用OpenCV进行编程的方法。关键词图像处理目标检测OpenCVIplImageVC++目录1概述..............................................................41.1目标跟踪与检测课程设计目的....................................41.2目标跟踪与检测设计任务与要求..................................41.3目标跟踪与检测的开发环境......................................42目标跟踪与检测系统设计的基本概念与原理............................42.1目标跟踪与检测的基本概念与知识................................42.2目标跟踪与检测系统设计实现平台的搭建.........................122.1与目标跟踪与检测相关的一些基本功能...........................183基于OPENCV运动目标跟踪与检测系统实现的详细说明..................333.1一般目标跟踪的实现...........................................333.2本文的检测算法...............................................343.3CAMSHIFT算法原理及其OPENCV实现................................353.4目标跟踪与检测系统的运行结果.................................394目标跟踪与检测的课程设计总结.....................................44参考文献1概述1.1目标跟踪与检测课程设计目的1.通过实验了解opencv运动物体跟踪的数据结构、函数以及基本框架;2.通过实验提高对于图像与视频的认识;3.通过学习,掌握基本的opencv图像与视频的知识。4.通过实验将理论和实践联系起来,提升对于理论知识的认识;1.2目标跟踪与检测设计任务与要求1.通过学习做该课程设计,掌握一些opencv的基本知识以及图像与视频的知识。2.调用基于intel的开源视觉库opencv,实现视频或者摄像头的监控;3.编程实现对进入视觉范围内的运动物体实施监测;1.3目标跟踪与检测Opencv开发环境一台pc机,MicrosoftVisualC++6.02系统设计的基本概念与原理2.1目标跟踪与检测基本概念与知识2.1.1.OpenCV简介开放源代码的计算机视觉类库OpenCV(IntelOpenSourceComputerVisionLibrary)由英特尔公司开发.它是一套可免费获得的由一些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,它表示二维坐标系下的点,类型为整型,定义如下:typedefstructCvPoint{intx;/*x坐标,通常以0为基点*/inty;/*y坐标,通常以0为基点*/}CvPoint;2)CvSize结构CvSize结构用来表示矩形框大小,以像素为精度,结构体中分别定义了矩形的宽高和高度,定义如下:typedefstructCvsize{intwidth;/*矩形宽度,单位为像素*/intheight;/*矩形高度,单位为像素*/}CvSize;3)CvRect结构该结构是用来表示矩形框的偏移和大小。typedefstructCvRect{intx;/*方形的最左角的x-坐标*/inty;/*方形的最上或者最下角的y-坐标*/intwidth;/*宽*/intheight;/*高*/}CvRect;4)CvScalar结构该结构是用来定义存放1-4个数值的数组。typedefstructCvscalar{doubleval[4];}CvScalar;//可用来表示RGBA的值,A=alpha透明度5)IplImage结构OpenCV库主要是使用“IplImage”结构体来创造和处理图像。IplImage结构来源于inter的另外一个函数库IPL,该函数库主要是针对图像处理。定义如下:typedefstructIplImage{intnSize;/*IplImage大小*/intID;/*版本(=0)*/intnChannels;/*大多数opencv函数支持1~4个信道*/intdepth;/*像素的位深度*/intdataOrder;/*0:交叉存取颜色信道。1:分开的颜色信道。只有cvCreateImage可以创建交叉存取图像*/intorigin;/*0:顶—左结构,1:底—左结构*/intwidth;/*图像宽像素*/intheighet;/*图像高像素*/struct_IplROI*roi;/*图像感兴趣区域*/intimageSize;/*图像数据大小*/intwidthStep;/*排列的图像大小,以字节为单位*/}IplImage;动态结构类型包括:内存存储,序列,集合,图,树。(2)OpenCV的函数体系OpenCV中每个函数的命名都已“cv”开始,然后是该函数的行为及目标。例如用来创建图像的函数“cvCreatelmage”,载入图像的函数“cvLoadlmage”。OpenCV是为图像处理及计算机视觉在实际工程中的应用而设计的一个类库。其中所有的函数都有与其在实际应用中所实现的不同功能而分属不同的类型。主要函数类型有:(1)基本的图像处理与分析函数图像处理和分析的一些函数。其中大多数函数都是针对两维象素数组的,这里我们称这些数组为“图像”,但是它们不一定非得是IplImage结构.也可以是CvMat或者CvMatND结构。这个类型的函数主要用于实现一些基本的图像处理与分析功能。例如图像平滑函数cvSmooth,Sobel算子cvSobel,Canny边缘分割函数cvCanny。创建直方图cvCreateHist等。(2)结构分析函数例如用多边形曲线逼近Freeman链函数cvApprexChains,函数cvMaxRect寻找包含两个输入矩形的具有最小面积的矩形边界等。(3)运动分析与对象跟踪函数例如背景重建函数cvAcc.用光流法或动态轮廓模型来实现目标跟踪的函数cvCalcOptiealFlowBM和cvSnakeImage以及卡尔曼滤波函数CvKalman等。(4)摄像机标定和3D重建函数例如函数cvCalibrateCamera利用目标图像模式和目标模式的象素点信息计算相机参数.函数cvFindExtrinsieCamera_Params寻找模式的摄像机外参数矩阵等。(5)模式识别例如函数cvLoadHaarClassifierCascade用于从文件中装载训练好的利用海尔特征的级联分类器.或者从OpenCV中嵌入的分类器数据库中导入。(6)GUI与视频处理函数包括有高级图形用户接口highGUI用以实现对图像的载入、显示及保存等基本操作以及用以实现视频输入输出及处理的函数。根据上述的函数体系。程序开发者可以根据自己所开发应用程序所要实现的功能来方便地选择所需的库函数.从而大大减少开发时间和精力。缩短程序开发的周期。(3)OpenCV常用的函数下面介绍一下OpenCV中常用的几个函数,也是利用OpenCV进行特定目标体识别的过程中常用到的函数,分别说明如下。1)cvLoadImage():载入图像IplImage*cvLoadImage(constchar*filename,intiscolor=CV_LOAD_IMAGE_COLOR);filename:要被读入的文件的文件名。iscolor:指定读入图像的颜色和深度。指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR),单信道(CV_LOAD_IMAGE_GRAYSCALE),或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)。2)cvShowImage():在指定窗口中显示图像voidcvShowImage(constchar*name,constCvArr*image);name:窗口的名字。image:被显示的图像。(3)IplImage*cvCreateImage分配图像空间(CvSizesize,intdepth,intchannels);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_64Fchannels:1,2,3or4.注意数据为交叉存取.彩色图像的数据编排为b0g0r0b1g1r1...举例:分配一个单通道字节图像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)设定/获取兴趣通道:voidcvSetImageCOI(IplImage*image,intcoi);//0=allintcvGetImageCOI(constIplImage*image);设定/获取兴趣区域:voidcvSetImageROI(IplImage*image,CvRectrect);voidcvResetImageROI(IplImage*image);vRectcvGetImageROI(constIplImage*image);2