背景减除法
- 格式:docx
- 大小:45.79 KB
- 文档页数:8
智能交通系统中基于视频图像处理的车辆检测与跟踪方法综述一、概述随着科技的快速发展和城市化进程的推进,智能交通系统(ITS)已经成为现代交通领域的重要研究方向。
基于视频图像处理的车辆检测与跟踪方法是智能交通系统的重要组成部分,对于提高道路安全、优化交通流量、实现智能交通管理具有重要意义。
基于视频图像处理的车辆检测与跟踪方法主要利用计算机视觉和图像处理技术,对视频序列中的车辆进行自动检测、跟踪和识别。
这种方法可以实时获取道路交通信息,为交通管理和规划提供数据支持。
同时,通过车辆检测与跟踪,还可以实现车辆行为分析、交通事件检测等功能,为智能交通系统的进一步发展提供有力支持。
近年来,随着深度学习、机器学习等人工智能技术的快速发展,基于视频图像处理的车辆检测与跟踪方法也取得了显著的进步。
通过构建深度学习模型,可以实现对车辆目标的准确、快速检测,同时利用多目标跟踪算法,实现对多辆车辆的连续跟踪。
这些技术的发展为智能交通系统的车辆检测与跟踪提供了新的解决方案,也为未来的智能交通发展奠定了坚实的基础。
基于视频图像处理的车辆检测与跟踪方法仍然面临一些挑战,如复杂交通场景下的车辆遮挡、光照变化、动态背景干扰等问题。
未来研究需要不断探索新的算法和技术,提高车辆检测与跟踪的准确性和鲁棒性,以适应智能交通系统的发展需求。
本文将对基于视频图像处理的车辆检测与跟踪方法进行综述,介绍其基本原理、发展历程、现状以及未来的发展趋势。
通过总结现有方法的优点和不足,为未来的研究提供参考和借鉴。
同时,本文还将探讨当前面临的挑战和未来的研究方向,为智能交通系统的进一步发展提供有益的探索和启示。
1. 智能交通系统概述智能交通系统(Intelligent Traffic Systems,ITS)是信息技术、数据通信技术、传感器技术、电子控制技术以及计算机技术的综合应用,旨在构建一种大范围内、全方位发挥作用的实时、准确、高效的综合运输和管理系统。
基于OPENCV的背景减除方法tiunjaj生曹WWJM跚何奶礎疑1仕函鳏0»¥枷辭偷UxogoBess州} (ajnjdeo-iuj)|!to = isp ^6eiu||d|:0 = auej 厂iu)^6eiu||d| ajsq spoo jqpueqpueuiiuoo」noA ppv :0G01//} 0U!p6)pBguo::M^/\iiuoHE|dS!sA|euvuono|/yo ppAJ「鋼画稱砂醐期T 娜跚龜2那wm血轴卿绅前笛齢朝非型阪解絵■胸哥辟阁翔巨聊略綁罐猊宙'鳞讎副彳中¥ :離0械6£型囿乙&69:讥Z乙pgOOZ AOuadoAONBdO iWw o _u n o o -5E 39>2J2q n o p N -9z n op z 暑m nd。
m.S i s i s —^1=七cp %#誉Eo 匸 uyd/、(.(ALMDEO —)2E E J^AJ ANO AQNALUET —UQgej 「diuj!H MAaluBJ 「duQ)opow08u.sssne9seaoA 。
=o P O E I 6q•OPOW3S08A9m t=L.蕃矍一A ・m5w ^・・ c l §)(9um」「du4iw二” u-6yo八丄sp=L co ・(aluej「E o a z !S J 89A O )&E E a>_g 」o >。
H一童rudeo —}aiuej JAJano/voni s ^—duncvupdaieBGSta-Mode-(tmpIframes;闵二cvupdaieFGDSta-M0de-(tmplframe9bglmode_)=ku(doub_exVGefnckcoumoI=好T曲龍郭M Jnrbglmode-・voreground ・voriginubglmode.vbackground->origin u」;WCVErode<bglmodelvbackground9bglmodelvbackground);i fUCVErode<bglmodek>foregrounabg —mode-rvforeground);IprintK ・・%JfM sn.「・;i fcvShow 一magec4沖bglmodek>background)八cvcopwbglmodeyforegrounp-d s <?cvsmooih(dsL dsLCVIGAUSS_AN&);CVMOrphologyEX(dsL dsL p p;/. seuiimo am oas oj L削M aTHId^AO a团dai j t(0 0乙'looT JO|oo s((m6pq paj-jnoiuhui + A*pai7ino)u<x)—uiy(qip!M*par」no|uoo—iu + xioaj^jnoiuoo^uiJ^uiodAO 络joaj^jnoiuoo^ UJ X)oaT」noiU8一H UIOJAO()sp)a|6ue)ddyA3}(000S < ((Jnojuoo- iu)eaJVJno)uooA3)sqe|)j!(FL v mpiMioai-4nojuoo-UJ4q6pq)oaj""jno|uoo'" ui gg 03 < iq6i9q paj-jnojuoo-UJ . qipiMioajTinoiuoo"IU00t < q)P!M)39j7jno)uoo-ui + jqBpq pai^jnojuoo""UJ:(L 'jnojuoo- ui)pdH6uipunogA3 =|oaj~jno|uoo-ui 冶SZ'SSEO )gOH~AO =P9J~i0|OOJB|BOSAO:(9S 乙9 4SSZ )gOd"AO = JO|oo JqeosAO}(ixau~q<-jno)uoo~UJ = jnojuoo-UJ io=i Jnojuoo"ui! po| i((0l0)luiodAO RdlAIIS— OaddV"NIVHO~AO lSn~H13H~AO Vnoiuoo^odzis如0屮8一 $ 审如貯划4jsp )SJnOlUOQpUIJAO麻卿乃sjno)uoopuyAo// 4if^jno)uoo^ 幽沁群"cvDrawContours( dst, m_contour, color, color, -1, CV_FILLED, 8, cvPoint(0,0));cvShowlmageCW^m u, dst);// cvWaitKey(O);intk = cvWaitKey(1);if(k = q) break;cvReleaseBGStatModel( &bg_model);cvReleaseCapture(&m_capture); cvReleaselmage(&dst);if(m__storage) cvClearMemStorage(m_storage);cvDestroyWindow("背景图像');cvDestroyWindow("前景图像');return;。
FPGA实现移动⽬标检测 上⼀篇整理了⼈脸检测,这篇讲⼀下移动⽬标检测。
⽬前逐渐形成三种运动⽬标的检测算法: 1)帧间差分法是采⽤视频序列中的相邻两帧图像做差的⽅法,来检测视频序列中的移动⽬标。
但是受运动⽬标和背景变化的影响,检测过程中有可能出现伪⽬标或者⽬标中出现“空洞”,在⽬标运动不是太快时可以有效的检测到⽬标。
2)背景减除法⾸先在没有⽬标的场景中获取背景图像,然后利⽤实时视频序列和背景图像做差,来实现地移动⽬标的检测。
如何获得背景是背景减除法的关键。
3)光流法是通过给图像中每个像素点赋予⼀个速度⽮量的⽅法建⽴光流场,利⽤光流场中⽮量运动的连续性来检测移动⽬标。
该⽅法的计算量通常很⼤,难以实现实时性的检测。
其中帧差法⽐较简单,可操作性较强。
⼀、帧差法原理 帧差法是通过两帧相邻图像间做差,并选取合适的阈值对图像进⾏⼆值化,从⽽选取出运动的物体。
设 f(x,y)为灰度差分图像,g k(x,y)、g k-1(x,y) 为相邻的两帧灰度图像,D(x,y)为侦差图像,T为差分阈值。
1、缓存两帧灰度图像。
2、两帧灰度图像做差,将结果和设置的阈值进⾏⽐较后转⼆值化输出。
3、对⼆值化结果进⾏框选,确定移动⽬标,类似⼈脸检测。
本设计的难点是如何能缓存两帧图像,以 SDRAM 为例,常⽤的⽅法有两种:掩码法和⾮掩码法,下⾯分别介绍⼀下。
⼆、移动⽬标检测——掩码法1、结构框图 如图所⽰:摄像头采集数据后,再SDRAM通道0中缓存后输出到 VGA_driver,正常的摄像头显⽰⼯程到这就结束了。
⽽为了后续处理,我将 VGA_driver 的输出数据先不输出到VGA引脚,⽽是对其进⾏图像处理:先进⾏ RGB转YCbCr处理,得到 8bit 的灰度数据 Y 分量,然后将 Y 分量输⼊到 SDRAM的通道 1 中,利⽤ SDRAM 的掩码,通道 1 的读出数据包含了 2 帧的灰度数据,将这两帧数据进⾏帧差计算,然后进⾏⼀些图像处理。
背景消减法_OpenCV_详解一.基本概念背景消减法可以看作一种特殊的帧差法。
基本思想:利用当前帧图像与背景图像对应象素点的灰度差值来检测车辆。
如果当前图像的象素点和背景图像的象素点灰度值差别很大,就认为此象素点有车通过;相反,如果当前图像的象素点和背景图像的象素点灰度值差别较小,在一定的阈值范围内,我们就认为此象素点为背景象素点。
背景差值法假定图像背景是静止不变的,即图像背景不随图像帧数而变,可表示为b(x,y),定义图像序列为f(x,y,i),其中(x,y)为图像位置坐标,i为图像帧数,将每一帧图像的灰度值减去背景的灰度值可得到一个差值图像:id(x,y,i)=f(x,y,i)-b(x,y)背景差值法检测运动目标速度快,检测准确,易于实现,其关键是背景图像的获取与背景更新。
在实际应用中,静止背景是不易直接获得的,同时,由于背景图像的动态变化,需要通过视频序列的帧间信息来估计和恢复背景,即背景重建,所以要选择性的更新背景。
然而它对于动态场景的变化,例如光照的变化和阴影的干扰等特别敏感。
因此,选取一个可靠的背景模型进行背景的提取与动态更新以适应环境的变化是必要的。
使用背景差分法进行运动检测通常会遇到如下一些问题:(1)背景获取:最简单的方法是在场景中没有运动目标的情况下进行,但在现实中肯定是无法满足的,如高速公路和城市交通的监控,需要一种方法能在场景存在运动目标的情况下获得背景图像。
(2)背景的扰动:如树叶、树枝等各种东西的摇动(3)外界光照条件的变化(4)背景中固定对象的移动(5)背景的更新(6)阴影的影响背景消减法根据其背景模型的不同又可分为:直方图法、平均值法、单分布高斯背景模型、混合高斯分布背景模型、Kalman滤波器法,HMM模型法。
二.下面分享的是两种背景实现方式:(1)背景即为第一帧图像,简单的先看看程序的基本步骤和实现方法。
这种方法适用于第一帧即为全部背景,如果存在不是背景的物体,将出现误差;同时进行了简单的背景更新;(2)背景为前50帧的平均值,对于高速的车流量较少的地段,背景提取较理想,车辆缓慢移动时会在背景上留下痕迹。
2007,43(22)1引言视频图像中往往包含大量的信息,要存储和计算如此庞大的数据集合是很困难的事情。
况且真正有用的信息只是其中的很少部分。
减除无用的背景就可以大大减少数据量而不丢失有用信息。
背景减除包括背景建模、检测前景和背景更新三个方面。
背景建模即从一系列视频图像中准确找到属于背景的部分,并且存储为背景图像。
背景建模面临的困难主要是如何适应光照变化、摄像机抖动、背景中某些物体的高频运动(如树叶舞动和水波荡漾)、背景自身的变化(如本来属于背景的静止对象开始运动,甚至离开视线或运动对象停止在背景中不动等)[1]。
检测前景是将当前视频图像与背景模型进行比较,找到前景目标,减除背景。
这里的困难是差值定义和阈值设定的问题,即反映当前视频与背景差异的度量标准是什么,分类的阈值为多少。
背景更新就是某些变化导致原来的背景模型不再适合当前视频图像时,实时地更新背景模型。
背景更新的困难在于如何找到合适的更新策略,能够快速而真实的反映变化,即实时性和准确性的问题。
本文第2章用基于像素RGB值统计归类重建背景模型的方法构建初始的背景模型;第3章以颜色差异和亮度范围为依据,结合形态学处理进行背景减除;第4章提出两种背景更新的方法应对光照变化和物体增减导致的背景变化;第5章给出实验结果和讨论。
2背景建模2.1基本原理固定摄像机拍摄的视频序列,背景往往是最经常被看到的。
基于这一假设,参考灰度统计归类方法[2]对像素RGB值统计归类来建立背景模型。
即将样本序列中的各个像素的RGB值分别进行统计归类,出现频率最高的像素RGB值分别取其一种新的基于统计的背景减除方法孙吉花,刘肖琳SUNJi-hua,LIUXiao-lin国防科技大学机电工程与自动化学院自动化所333教研室,长沙410073333StaffRoomofAutomationInstitution,CollegeofMechatronicsEngineeringandAutomation,NationalUniversityofDefenseTechnology,Changsha410073,ChinaE-mail:sunjh81@yahoo.comSUNJi-hua,LIUXiao-lin.Newbackgroundsubtractionalgorithmbasedonstatistic.ComputerEngineeringandApplications,2007,43(22):73-75.Abstract:Aneweffectivebackgroundsubtractionalgorithmforcolorvideoisproposed.Firstgetsanimagesamplesequencefromacolorvideo.ThenanalyzesandclassifiestheRGBvalueperpixelofthesequenceandusestheaverageRGBvalueoftheclasswhichhasthehighestfrequencyinthesequencetoconstructthebackgroundmodel.Atlastsubtractsbackgroundaccordingtobothcolordistortionandbrightnessrange.Atthesametime,doessomemorphologicalworktoimprovetheresult.Experimentre-sultsindicatethatthisalgorithmcansolvetheproblemthatgrayvideobackgroundsubtractionalgorithmscan’tdetectthetargetswhichhavethesimilargrayintensitycomparedtobackground.Furthermore,itcanconstructbackgroundmodelfasterthanothercolorvideobackgroundsubtractionalgorithmsandallowspresenceofmovingobjectsinthesampleimages.Itimprovestheaccu-racyandreal-timeperformanceofbackgroundsubtractiontoacertainextent.Finallyproposessomeeffectivemethodstoupdatebackgroundmodelsoastoadapttheilluminationandbackgroundchanges.Keywords:backgroundmodel;backgroundsubtraction;backgroundupdate摘要:提出了一种有效的彩色视频背景减除的新方法。
国防科学技术大学硕士学位论文背景减除的算法研究姓名:孙吉花申请学位级别:硕士专业:控制科学与工程指导教师:刘肖琳20061101国防科技大学研究生院硕士学位论文可以看出,第一类的概率最大,其平均值为176左右,取该像素的R值分量为176。
依此方法遍历所有像素的RGB值,即可以得到一幅完整的彩色背景模型图像。
数字图像处理中的灰度直方图概念与图像序列的RGB三个通道的数值单独进行统计的方法有相通之处.若把图像序列的RGB三个值分别作为灰度来看,上述的统计过程可以用三个灰度直方图分析来进行。
只是这里的灰度直方图不是单幅图像的,而是图像序列的某个对应像素位置的某个颜色单值的统计结果。
灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数。
其横坐标是灰度级,纵坐标是该灰度出现的频率汹1.对应于此处的应用,某个颜色单值的直方图是该颜色分量的函数,描述的是图像序列中某个像素位置的该分量具有此数值的个数。
例如图3~5所示;图3样本图像序列2中(100,20)像素位置的R直方图图4样本图像序列2中(100,20)像素位置的G直方图国防科技大学研究生院硕士学位论文图5样本图像序列2中(100,20)像素位置的B直方图图3~5中横坐标是该颜色分量的数值范围(图像序列中该像素的此颜色分量的最小值到最大值),纵坐标是该数值的频率(出现的次数).由图3~5可知;R通道的高频数值主要集中在两个数值,即117和118,按方柱高低的比例取其平均值作为(100,20)位置的R数值。
G通道的数值与R通道类似,高频数值集中在107和108上,按方柱高低的比例取平均值作为(100,20)位置的G数值。
B通道的情况就有些特殊,高频数值集中在107上,形成单峰,直接获取数值作为(100,20)位置的B数值。
类似的方法循环遍历所有的像素,就得到完整的一幅彩色图像,也就是我们所求的背景模型。
2.2.2静态背景减除的基本原理根据背景模型与当前视频图像的对比,找到有差异的像素归为前景目标。
移动侦测算法原理移动侦测算法是一种广泛应用于视频监控、智能图像处理等领域的技术。
它能够检测图像中的人或物体移动,从而实现对视频的实时监控和处理。
本篇文章将详细介绍移动侦测算法的原理、实现方式及应用场景。
移动侦测算法的基本原理是利用图像处理技术,通过比较连续的图像帧之间的差异,判断是否存在移动物体。
通常采用帧间差分法、背景减除法等算法来实现。
1. 帧间差分法帧间差分法是通过比较连续的两帧图像之间的差异,从而检测移动物体。
它通过计算相邻两帧图像之间的差异,将移动物体与背景区分开来。
帧间差分法的优点是实现简单、计算量小,但容易受到光源、背景变化等因素的影响。
2. 背景减除法背景减除法是通过不断监测当前帧图像与背景图像的差异,从而去除背景变化和移动物体的干扰。
它通过提取一个稳定的背景图像作为参考,将当前帧与参考图像进行比较,将变化的部分识别为移动物体。
背景减除法的优点是能够处理复杂的背景变化和光源变化,但实现难度较大,计算量也较大。
除了上述两种常见的算法外,还有光流法、光度法等更高级的算法可以实现移动侦测。
这些算法能够更加准确地检测移动物体,但实现难度也更大,需要更多的计算资源和时间。
二、移动侦测算法的实现方式移动侦测算法的实现方式通常包括硬件实现和软件实现两种方式。
1. 硬件实现硬件实现是通过图像传感器、图像处理芯片等硬件设备直接实现移动侦测算法。
这种方式通常适用于对实时性要求较高的应用场景,如智能监控系统、无人驾驶等。
硬件实现的优势在于实时性强、响应速度快,但成本较高,且受限于硬件性能和限制。
2. 软件实现软件实现是通过计算机视觉技术,使用图像处理和计算机编程技术来实现移动侦测算法。
这种方式适用于对实时性要求较低、对精度和稳定性要求较高的应用场景,如视频监控、智能图像处理等。
软件实现的优点在于成本较低、灵活性强、可扩展性好,但实时性相对较差。
三、移动侦测算法的应用场景移动侦测算法在视频监控、智能图像处理等领域有着广泛的应用。
bpca 原理BPCA原理是指基于主成分分析的背景减除法(Background Pixel Counting Algorithm),它是一种常用于图像处理和计算机视觉领域的算法。
该算法的主要目的是从图像中提取出背景信息,并用于分割、识别或检测对象。
BPCA原理的基本思想是通过主成分分析将图像中的像素点分解为背景和前景两个部分。
主成分分析是一种常用的数据降维技术,它可以将高维数据转化为低维表示,并保留最重要的信息。
在BPCA 算法中,首先需要构建一个背景模型,通过对一系列背景图像的主成分分析,得到一个背景特征空间。
然后,将待处理图像中的像素点投影到该特征空间中,通过计算像素点在特征空间中的距离,判断其属于背景还是前景。
BPCA算法的具体步骤如下:1. 收集一组背景图像,这些图像应包含与待处理图像相似的背景信息。
2. 将背景图像转化为灰度图像,并将其展开为一维向量。
3. 将所有的背景图像向量组合成一个矩阵,每一列代表一个像素点的灰度值。
4. 对矩阵进行主成分分析,得到主成分向量和对应的特征值。
5. 选择保留的主成分个数,通常是根据累计特征值贡献率来确定。
6. 将待处理图像转化为灰度图像,并将其展开为一维向量。
7. 将待处理图像向量投影到背景特征空间中,得到对应的投影系数。
8. 根据投影系数,判断像素点属于背景还是前景。
BPCA算法的优点是可以准确地提取出图像中的背景信息,并且对光照、噪声等因素具有一定的鲁棒性。
它在图像分割、运动检测、目标跟踪等领域有着广泛的应用。
然而,BPCA算法也存在一些局限性,例如对于复杂背景或者前景与背景差异较小的情况,其分割效果可能不理想。
BPCA原理是一种基于主成分分析的背景减除法,通过构建背景模型和投影分析的方式,可以有效地提取图像中的背景信息。
该算法在图像处理和计算机视觉领域有着广泛的应用前景,并且具有较好的鲁棒性和准确性。
背景消减法_OpenCV_详解一.基本概念背景消减法可以看作一种特殊的帧差法。
基本思想:利用当前帧图像与背景图像对应象素点的灰度差值来检测车辆。
如果当前图像的象素点和背景图像的象素点灰度值差别很大,就认为此象素点有车通过;相反,如果当前图像的象素点和背景图像的象素点灰度值差别较小,在一定的阈值范围内,我们就认为此象素点为背景象素点。
背景差值法假定图像背景是静止不变的,即图像背景不随图像帧数而变,可表示为b(x,y),定义图像序列为f(x,y,i),其中(x,y)为图像位置坐标,i为图像帧数,将每一帧图像的灰度值减去背景的灰度值可得到一个差值图像:id(x,y,i)=f(x,y,i)-b(x,y)背景差值法检测运动目标速度快,检测准确,易于实现,其关键是背景图像的获取与背景更新。
在实际应用中,静止背景是不易直接获得的,同时,由于背景图像的动态变化,需要通过视频序列的帧间信息来估计和恢复背景,即背景重建,所以要选择性的更新背景。
然而它对于动态场景的变化,例如光照的变化和阴影的干扰等特别敏感。
因此,选取一个可靠的背景模型进行背景的提取与动态更新以适应环境的变化是必要的。
使用背景差分法进行运动检测通常会遇到如下一些问题:(1)背景获取:最简单的方法是在场景中没有运动目标的情况下进行,但在现实中肯定是无法满足的,如高速公路和城市交通的监控,需要一种方法能在场景存在运动目标的情况下获得背景图像。
(2)背景的扰动:如树叶、树枝等各种东西的摇动(3)外界光照条件的变化(4)背景中固定对象的移动(5)背景的更新(6)阴影的影响背景消减法根据其背景模型的不同又可分为:直方图法、平均值法、单分布高斯背景模型、混合高斯分布背景模型、Kalman滤波器法,HMM模型法。
二.下面分享的是两种背景实现方式:(1)背景即为第一帧图像,简单的先看看程序的基本步骤和实现方法。
这种方法适用于第一帧即为全部背景,如果存在不是背景的物体,将出现误差;同时进行了简单的背景更新;(2)背景为前50帧的平均值,对于高速的车流量较少的地段,背景提取较理想,车辆缓慢移动时会在背景上留下痕迹。
同时也进行了背景的简单更新;(3)同样的方法可以尝试不同的背景提取模型。
三.程序源代码[cpp]view plaincopy1.#include "stdafx.h" //背景为第一帧2.#include "highgui.h"3.#include "cv.h"4.#include "cxcore.h"5.#include "ml.h"6.7.int main(int argc, char* argv[])8.{9. CvCapture* pCapture = cvCaptureFromFile("video.avi");10.if( !pCapture) return -1;11.12. IplImage* pImgFrame = NULL;13. IplImage* pImgProcessed = NULL;14. IplImage* pImgBackground = NULL;15. IplImage* pyrImage = NULL;16.17. CvMat* pMatFrame = NULL;18. CvMat* pMatProcessed = NULL;19. CvMat* pMatBackground = NULL;20.21. cvNamedWindow("video", 0);22. cvNamedWindow("background",0);23. cvNamedWindow("processed",0);24.25. cvResizeWindow("video",300,300); //重新定义窗口的大小26. cvResizeWindow("background",300,300);27. cvResizeWindow("processed",300,300);28.29. cvMoveWindow("video", 0, 100); //设定窗口的位置30. cvMoveWindow("background", 350, 100);31. cvMoveWindow("processed", 700, 100);32.33.//int thresh_low = 20;34.//cvCreateTrackbar("Low","processed",&thresh_low,255,NULL); //创建滚动条,显示阈值35.36. pImgFrame = cvQueryFrame( pCapture ); //取第一帧37. pImgBackground = cvCreateImage(cvSize(pImgFrame->width, pImgFrame->height), IPL_DEPTH_8U,1);38. pImgProcessed = cvCreateImage(cvSize(pImgFrame->width, pImgFrame->height), IPL_DEPTH_8U,1);39. pyrImage = cvCreateImage(cvSize(pImgFrame->width/2, pImgFrame->height/2), IPL_DEPTH_8U,1);40.41. pMatBackground = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1);42. pMatProcessed = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1);43. pMatFrame = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1);44.45. cvSmooth(pImgFrame, pImgFrame, CV_GAUSSIAN, 3, 0, 0); //高斯平滑46. cvCvtColor(pImgFrame, pImgProcessed, CV_BGR2GRAY);47. cvCvtColor(pImgFrame, pImgBackground, CV_BGR2GRAY);48. cvConvert(pImgProcessed, pMatBackground);49. cvConvert(pImgProcessed, pMatFrame);50. cvConvert(pImgProcessed, pMatProcessed);51.52. cvSmooth(pMatBackground, pMatBackground, CV_GAUSSIAN, 3, 0, 0);53.54.while(pImgFrame = cvQueryFrame( pCapture ))55. {56. cvShowImage("video", pImgFrame);57. cvSmooth(pImgFrame, pImgFrame, CV_GAUSSIAN, 3, 0, 0);58.59. cvCvtColor(pImgFrame, pImgProcessed, CV_BGR2GRAY);60. cvConvert(pImgProcessed, pMatFrame);61.62. cvSmooth(pMatFrame, pMatFrame, CV_GAUSSIAN, 3, 0, 0);63. cvAbsDiff(pMatFrame, pMatBackground, pMatProcessed);64.65. cvThreshold(pMatProcessed, pImgProcessed, 20, 255.0, CV_THRESH_BINARY);66.67.//cvPyrDown(pImgProcessed,pyrImage,CV_GAUSSIAN_5x5); //GAUSSIAN金字塔向下采样68.//cvPyrUp(pyrImage,pImgProcessed,CV_GAUSSIAN_5x5);69.70. cvErode(pImgProcessed, pImgProcessed, 0, 1); //腐蚀71. cvDilate(pImgProcessed, pImgProcessed, 0, 1); //膨胀72.73. cvRunningAvg(pMatFrame, pMatBackground, 0.0003, 0); //背景更新74. cvConvert(pMatBackground, pImgBackground);75.76. cvFlip(pImgBackground,NULL,0); //垂直旋转图像77. cvFlip(pImgProcessed,NULL,0);78. cvShowImage("background", pImgBackground);79. cvShowImage("processed", pImgProcessed);80.81.if( cvWaitKey(33) == 27 ) //触发Esc键,跳出82. {83.break;84. }85. }86.87. cvDestroyWindow("video");88. cvDestroyWindow("background");89. cvDestroyWindow("processed");90.91. cvReleaseImage(&pImgProcessed);92. cvReleaseImage(&pImgBackground);93.94. cvReleaseMat(&pMatFrame);95. cvReleaseMat(&pMatProcessed);96. cvReleaseMat(&pMatBackground);97.98. cvReleaseCapture(&pCapture);99.100.return 0;101.}[cpp]view plaincopy1.#include "stdafx.h" //背景为前50帧的平均值2.#include "highgui.h"3.#include "cv.h"4.#include "cxcore.h"5.#include "ml.h"6.7.int main(int argc, char* argv[])8.{9. CvCapture* pCapture = cvCaptureFromFile("video.avi");10.if( !pCapture) return -1;11.12. IplImage* pImgFrame = NULL;13. IplImage* pImgProcessed = NULL;14. IplImage* pImgBackground = NULL;15. IplImage* pyrImage = NULL;16.17. CvMat* pMatFrame = NULL;18. CvMat* pMatProcessed = NULL;19. CvMat* pMatBackground = NULL;20.21. cvNamedWindow("video", 0);22. cvNamedWindow("background",0);23. cvNamedWindow("processed",0);24.25. cvResizeWindow("video",300,300); //重新定义窗口的大小26. cvResizeWindow("background",300,300);27. cvResizeWindow("processed",300,300);28.29. cvMoveWindow("video", 0, 100); //设定窗口的位置30. cvMoveWindow("background", 350, 100);31. cvMoveWindow("processed", 700, 100);32.33.//int thresh_low = 20;34.//cvCreateTrackbar("Low","processed",&thresh_low,255,NULL); //创建滚动条,显示阈值35.36. pImgFrame = cvQueryFrame( pCapture ); //取第一帧37. pImgBackground = cvCreateImage(cvSize(pImgFrame->width, pImgFrame->height), IPL_DEPTH_8U,1);38. pImgProcessed = cvCreateImage(cvSize(pImgFrame->width, pImgFrame->height), IPL_DEPTH_8U,1);39. pyrImage = cvCreateImage(cvSize(pImgFrame->width/2, pImgFrame->height/2), IPL_DEPTH_8U,1);40.41. pMatBackground = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1);42. pMatProcessed = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1);43. pMatFrame = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1);44.45.46.int i=1;47. CvMat* pMat = NULL,*pMat1=NULL,*pMatSum=NULL,*pMatAve=NULL;48. pMat = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1); //存放当前帧49. pMat1 = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1); //存放前一帧50. pMatSum = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1); //所有帧的和51. pMatAve = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1); //帧的平均52.while(i<=50)53. {54. pImgFrame = cvQueryFrame( pCapture );55. cvCvtColor(pImgFrame, pImgBackground, CV_BGR2GRAY);56. cvConvert(pImgBackground, pMat);57. cvAdd(pMat,pMat1,pMatSum,NULL);58. pMat1=pMatSum;59. i++;60. }61. cvConvertScale(pMatSum, pMatAve, 0.02, 0 ); //求平均值62. cvConvert(pMatAve, pMatBackground);63. cvSmooth(pMatBackground, pMatBackground, CV_GAUSSIAN, 3, 0, 0);64. cvSetCaptureProperty(pCapture, CV_CAP_PROP_POS_FRAMES, 0. );65.66. cvSmooth(pImgFrame, pImgFrame, CV_GAUSSIAN, 3, 0, 0); //高斯平滑67. cvCvtColor(pImgFrame, pImgProcessed, CV_BGR2GRAY);68. cvConvert(pImgProcessed, pMatFrame);69. cvConvert(pImgProcessed, pMatProcessed);70.71.while(pImgFrame = cvQueryFrame( pCapture ))72. {73. cvShowImage("video", pImgFrame);74. cvSmooth(pImgFrame, pImgFrame, CV_GAUSSIAN, 3, 0, 0);75.76. cvCvtColor(pImgFrame, pImgProcessed, CV_BGR2GRAY);77. cvConvert(pImgProcessed, pMatFrame);78.79. cvSmooth(pMatFrame, pMatFrame, CV_GAUSSIAN, 3, 0, 0);80. cvAbsDiff(pMatFrame, pMatBackground, pMatProcessed);81.82. cvThreshold(pMatProcessed, pImgProcessed, 20, 255.0, CV_THRESH_BINARY);83.84.//cvPyrDown(pImgProcessed,pyrImage,CV_GAUSSIAN_5x5); //GAUSSIAN金字塔向下采样85.//cvPyrUp(pyrImage,pImgProcessed,CV_GAUSSIAN_5x5);86.87. cvErode(pImgProcessed, pImgProcessed, 0, 1); //腐蚀88. cvDilate(pImgProcessed, pImgProcessed, 0, 1); //膨胀89.90. cvRunningAvg(pMatFrame, pMatBackground, 0.0003, 0); //背景更新91. cvConvert(pMatBackground, pImgBackground);92.93. cvFlip(pImgBackground,NULL,0); //垂直旋转图像94. cvFlip(pImgProcessed,NULL,0);95. cvShowImage("background", pImgBackground);96. cvShowImage("processed", pImgProcessed);97.98.if( cvWaitKey(50) == 27 ) //触发Esc键,跳出99. {100.break;101. }102. }103.104. cvDestroyWindow("video");105. cvDestroyWindow("background");106. cvDestroyWindow("processed");107.108. cvReleaseImage(&pImgProcessed);109. cvReleaseImage(&pImgBackground);110.111. cvReleaseMat(&pMatFrame);112. cvReleaseMat(&pMatProcessed);113. cvReleaseMat(&pMatBackground);114.115. cvReleaseCapture(&pCapture);116.117.return 0;118.}。