您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 应用OPENCV在VC++下实现视频图像的目标检测
应用OpenCV在VC++下实现视频图像的目标检测摘要本文先介绍实现视频图像目标检测的几种算法,然后介绍一种开放源代码的计算机视觉类库OpenCV,主要阐述该类库的特点及其结构,最后通过“检测一个视频中的运动物体”这一实例探讨了使用OpenCV进行编程的方法。关键词图像处理目标检测OpenCVIplImageVC++1.目标检测目标检测(objectdetection)是将运动的物体从背景中检测出来,人们希望设计能适用于各种监控环境,不受光照、天气等外界因素影响的目标检测算法。但这种算法难免复杂度大,现有一些算法大多是针对某一类问题提出的,主要包括背景减法、相邻帧差法和光流法等。1.1背景减法背景减法(backgroundsubtraction)是目前运动目标检测的主流方法,其基本思想是将当前每一帧图像与事先存储或实时获取的背景图像相减,计算出与背景偏离超过一定阈值的区域作为运动区域。该算法实现简单,相减结果直接给出目标的位置、大小、形状等信息,能够提供关于运动目标区域的完整描述,特别是对于摄像机静止的情况,背景减法是实现运动目标实时检测和提取的首选方法。背景减法实现的关键是背景模型的获取和更新。背景获取算法通常要求在场景中存在运动目标的情况下获取背景图像,更新过程使背景能够适应场景的各种变化和干扰,如外界光线的改变,背景中对象的扰动和固定对象的移动,阴影的影响等。一种典型的背景建模方法是用混合高斯模型描述背景图像像素值的分布,目标检测过程中判断图像的当前像素值是否符合该分布,若是被判为前景点,否则为背景点。同时根据新获取的图像,对背景图像参数进行自适应更新。该方法能够可靠处理光照变化、背景混乱运动的干扰以及长时间的场景变化等。在此基础上,对背景、静止目标和运动目标三者采取不同的更新策略,以减弱背景更新过程中运动目标对背景的影响。1.2相邻帧差法相邻帧差法(temporaldifferencing)利用序列中连续两帧或几帧图像间的差异进行目标的检测和提取。由于相邻帧的时间间隔一般较短,因此算法对场景中的动态变化不太敏感,具有较强的自适应性。但该方法一般不能完全提取出所有相关的特征像素点,在运动实体内容易产生空洞现象。累积图像差分法进一步计算一阶和二阶差分图像,利用时间序列图像的历史积累信息,能够适应低对比度有噪时间序列,判断复杂情况下目标运动的多种状态。以上两种目标检测方法适用于背景固定不变的情形,对于背景发生运动的情况,需要提前对由摄像机引起的背景移动进行补偿。1.3光流法光流法(opticalflow)是通过研究图像序列的光流场实现运动目标检测的一种方法。光流场是空间运动物体被观测表面上的像素点运动产生的瞬时速度场,它包含了物体编码结构和动态行为的重要信息。光流法实际上是通过光流场近似计算图像序列中不能直接得到的运动场,根据运动场的特征对目标进行检测。2.OpenCV简介开放源代码的计算机视觉类库OpenCV(IntelOpenSourceComputerVisionLibrary)由英特尔公司开发.它是一套可免费获得的由一些C函数和C++类所组成的库,用来实现一些常用的图像处理及计算机视觉算法。OpenCV主要用于对图像进行一些高级处理,比如说特征检测与跟踪、运动分析、目标分割与识别以及3D重建等。它有以下特点;开放C源码,基于Intel处理器指令集开发的优化代码,统一的结构和功能定义,强大的图像和矩阵运算能力,方便灵活的用户接口,同时支持WINDOWS、LINUX平台等。2.1OpenVC的数据结构基础的数据类型包括:CvPoint基于二维整形坐标轴的点.CvSize矩形框大小。CvRect矩形框的偏移和大小,以像素为精度,CvMat多通道矩阵等。在此仅介绍图像类的Ipllmage数据结构。typedefstruet_IpUmage{intnSize;\*Ipllmage大小*\intID;\*版本=0*\imnChannels;\*大多数OPENCV函数支持1,2,3或4个通道*\intalphaChannel;\*被OpenCV忽略*\intdepth;\*像素的位深度*\,charcolorModel;\*被OpenCV忽略*\charchannelSeq;\*同上*\intdataOrder;\*0—交叉存取颜色通道1—分开的颜色通道*\intorigin;\*0—顶-左结构,1—底-左结构(Windowsbitmap风格*\intalign;\*图像行排列(4or8)。OpenCV忽略它,使用widthStep代替*\intwidth;\*图像宽像素数*\intheight;\*图像高像素数*\struet_IplROI*roi;\*图像感兴趣区域*\struet_IplImagemaskROI;\*在OpenCV中必须置NULL*\void*imageld;\*同上*\intimageSize;\*图像数据大小*\char*imageData;\*指向排列的图像数据*\intwidthStep;\*排列的图像行大小,以字节为单位*\intBorderMode;\*边际结束模式,被OpenCV忽略*\intBorderConst;\*同上*\char*imageDataOrigin;\*指针指向一个不同的图像数据结构(不是必须排列的)是为了纠正图像内存分配准备的*\}IplImage;Ipllmage结构来自于IntelImageProcessingLibrary(是其本身所具有的),OpenCV只支持其中的一个子集。动态结构类型包括:内存存储,序列,集合,图,树。2.2OpenCV的函数体系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来进行视频图像处理,该程序的具体流程如下:检测出一个视频中的运动物体流程每读入一帧MC(cvQueryFrame)1)对当前帧进行平滑;(cvSmooth)2)当前帧MC与背景MB相减,求差值MD;(cvAbsDif)3)二值化MD;(cvThreshold)4)形态学操作过滤噪声;(cvEmde,cvDilate)5)更新背景。(cvRunningAvg)主要程序代码设计如下;cvNamedWindow(“video”,1);//创建窗口cvNamedWindow(“background”,1);cvNamedWindow(“foreground”,1);!(pCapture=cvCaptureFremFile(argv)))//打开视频文件{fprintf(stderr,“Cannotopenvideofile%sha”,argv);return-2;}while(pFrame=cvQueryFrame(pCapture))//逐帧读取视频{nFrmNum++;if(nFrmNum==1//如果是第一帧,需要申请内存,并初始化{pBkImg=evCreateImage(cvSize(pFrame一width.pFrame一height),IPL_DEPTH-8U,1);pFrImgevCreateImage(evSize(pFrame一width.pFrame一height),IPL_DEPTH-8U,1);pBkMat=evCreateMat(pFrame-height,pFrame一width,CV一32FC1);pFrMat=evCreateMat(pFrame-height,pFrame一width,CV一32FC1);pFrameMat=evCreateMat(pFrame-height,pFrame一width,CV一32FC1);cvCvtColor(pFrame,pBkImg,CV—BGR2GRAY);//转化成单通道图像再处理cvCvtColor(pFrame,pFrlmg,CV—BGR2GRAY);cvConven(pFrImg,pFrameMat);cvConvert(pFrlmg,pFrMat);cvConvert(pFrlmg,pBkMat);}else{cvCvtColor(pFrame,pFrlmg,CV_BGR2GRAY);cvConven(pFrlmg,pFrameMat);cvSmooth(pFrameMat,pFrameMat,CV—GAUSSIAN,3,0,0);//高斯滤波先.以平滑图像cvAbsDif(pFrameMat,pBkMat,pFrMat);//当前帧跟背景图相减cvThreshold(pFrMat,pFrlmg,60,255.0,CVJHRESH—BIRY1;//二值化前景图cvRunningAvg(FrameMat,pBkMat,0.003);cvConvert(pBkMat,pBklmg);//将背景转化为图像格式,用以显示cvShowlmage(“video”,pFrame);cvShowlmage(“background”.pBklmg);cvShowlmage(“foreground”,pFrlmg);if(cvWaitKey(2)=0)break;}}4.结束语由上面的实例可以看出,利用OpenCV提供的数字图像处理和计算机视觉的函数,可使平时处理起来很复杂的操作变得很容易,对缩短程序的开发周期有着十分显著的作用。Intel公司开发OpenCV库,旨在建立一个完全开放的研究机构使得图像处理及计算机视觉技术在快速发展的PC环境中得到更好的应用,它为用户提供了一整套的图像处理以及图像与模式分析函数,而且这些函数在Intel的处理器下执行是最优的。
本文标题:应用OPENCV在VC++下实现视频图像的目标检测
链接地址:https://www.777doc.com/doc-5110555 .html