三帧差分法
运动目标检测方法的对比分析和仿真实现

) =
D (,) t e kxy >h s l hd r o ) } ≤t l r
.
I2 ()
Rc : w。 , { hD +y :: h = : 。k w e n
+l
+
d ( y > h s o 2 t h x ) re l
, ,
中图分类号
T 3 14 P9.1
文献标识码
A
文章编号
10 7 2 (0 1 1 0 7— 80 2 1 )2—12— 2 1 0
C mp rsna dSmuaino eMeh d o vn jc tcin o ai n i lt f h to sfrMo igObet et o o t De o
陕西 西安
摘 要
70 8 ;3 武警石 家庄指挥学 院 训 练部 ,河北 石家庄 10 6 .
00 6 ) 5 0 1
研 究了 目前运动 目标检测 常用的两种方 法:三帧差分 法及混合 高斯模型 背景 差分 法,并对两种运动 目标
运 动 目标 检 测 ;三 帧 差 分 法 ;混 合 高斯
检 测 方 法 作 了 简述 ,且 辅 以典 型 的 视 频 运 动 目标 检 测 实例 ,给 出 了 两种 方法 的 实验 结 果 ,指 出其 适 用范 围及 优 缺 点 关键词
ห้องสมุดไป่ตู้
运动 目标检 测 在 视 频 分 析 、 频 编解 码 及 视 频监 视
控等方面起着重要的作用 。运动 目标检测 即实时的检
测运 动 目标 , 其 提取 出来 。在序 列 图像处 理 中 , 并将 运 动 目标 的检测 方法 总体 上可 归纳为 以下 3类 : 流法 、 光
帧差 法和 背景 差法 。
一种基于OpenCV实现的三帧差分运动目标检测算法研究

K y W o d t r ef medf rn i , eet n o vn be t Op n V e r s h e-r i ee t l d tci f a f a o mo ig o jc , e C
Cls mb r TP 0 . a s Nu e 3】6
1 引言
现实 生活 中, 量有 意义 的视 觉 信息 都 包 括在 大 运 动之 中 。尽 管 人类 的 视 觉 即 能看 见 运 动物 体 又 能看 到静 止 的物 体 , 是 在 许 多 场 合 , 但 比如 重 要 场
t n S me smu a i n t s sa e c r id O t b h l o ih a d t e b sc fa i e e c t o i . o i lt e t r a re u y t e a g rt m n h a i r me d f r n e me h d,r s e t e y o o f e p c i l ,mo 的基础 , 取 准确 的 获 运 动 目标对 于 后 面 的处 理具 有 重 要 意 义 , 此 , 因 研
徐 卫星 王 兰英 李 秀娟
郑州 400) 5 O 7 ( 河南工业大学 电气工程学院
摘
要
运 动 目标检测在视觉监控系统 、 医学 图像 分析 、 工业检测 和军事等领域 有着广泛 的应用 。运动 目标 检测处于
这些应 用的最前端 , 检测结果 的准确 精度 对后 续处理 有很 大 的影 响 。文 中提 出 了一 种三帧 差分运 动 目标 检测算 法 , 利用
总第 2 5 6 期 2 1 年第 1 期 01 1
基于改进的三帧差分法运动目标检测

【 中图分类号】T N 9 1 1 . 7 3
【 文献标志码】 A
Mo v i n g Ob j e c t s D e t e c t i o n B a s e d o n I mp r o v e d T h r e e F r a me D i f e r e n c e
DI NG L e i , GONG Ni n g s h e n g
C o l l e g e o f E l e c t r o n i c s a n d l n f o r m  ̄ t i o n E n g i n e e r i n g , n j i g n U n i v e r s i t y f o T e c h n o l o g y , №n j i n g 2 1 1 3 1 6 , C h i n a ) 【 A b s t r a c t 】 T o a c c u r a t e l y a n d e ic f i e n t l y i m p r o v e t h e m o v i n g o b j e c t s d e t e c t i o n , t h i s p a p e r p r o p o s e s a n i m p o r v e d t h r e e L a m e d i f e r e n c e a l g o r i h t m, w h i c h
hr t e s ho l d e x r t a c i t o n r e d u c e he t e fe c t o f he t s u n s h i n e a n d n o i s e .Ex p e ime r n t l a r e s u l t s d e mo n s ra t t e ha t t he t lg a o r i hm t c a n d e t e c t he t e n t i r e t y o f t h e mo v i a a v o i d u n d e t e c t e d e r r o r .T hi s a l g o i r t h m c a n a c c u r a t e l y a n d e ic f i e n t l y d e t e c t h t e m o v i n g o b j e c t s d e t e c t i o n .
三帧差法和Mean-shift结合的行人检测与跟踪研究

采用基于 Me a n - s h i f t 的轮廓跟踪 算法对行 人进 行 实时跟踪 。实验结果表 明,该 算法能够将 不 包含行人信 息的 区域进 行 筛选 排 除 ,在 不降低检测效果 的情 况下明显提 高 了行人检测及跟踪的效率 ,具有较强 的鲁棒性 。
关 键 词 :三 帧 差 法 ;Me a n - s h i f t ;背 景 差 分 法 ;HOG 算 子 ;支 持 向 量 机 中 图 法分 类 号 :T P 3 9 1 . 4 1 文 献 标 识 号 :A 文 章 编 号 :1 0 0 0 — 7 0 2 4( 2 0 1 4 )O 1 — 0 2 2 3 — 0 5
姚 倩 ,安 世 全 , 姚 路
( 1 . 重庆 邮 电大 学 计 算机 科 学与技 术 学 院 ,重 庆 4 0 0 0 6 5 ;2 . 重庆邮 电 大学 移通 学院 ,重庆 4 0 1 5 2 0 )
摘 要 :为 了快 速 、准 确 地 对视 频 序 列 中的 行 人 进 行 检 测 和 跟 踪 ,提 出 了一 种 基 于 运 动 区域 的 Me a n - s h i f t 行 人 检 测 和 跟 踪 算 法 。采 用 改 进 的 背景 差分 的 三 帧 间 差 分 法 对 运 动 区域 进 行 提 取 ,并 通 过 离线 训 练 的 H( X 3分 类 器 对 行 人 进 行 识 别 。提 出
2 0 1 4年 1 月
计 算机 工 程 与 设 计
C( ) MP UTER ENGI NEE RI NG AND DE S I GN
J a n .2 0 1 4
Vo 1 . 3 5 No 法 和 Me a n — s h i f t 结 合 的行 人检 测 与 跟踪 研 究
基于三帧时间差分法的独居老人运动检测

关 键词 : 帧 差 分 法 ; 三 运动 检 测 ; 居 老 人 独
D :0 7 8 .s.0 2 8 3 . 1 . . 1 文章编号 :0 2 8 3 (0 0 1— 29 0 文献 标识码 : 中图分类 ̄' P 9 OI 1. 7 /i n10 — 3 1 0 01 0 3 js 2 37 10 — 3 1 2 1 )3 0 3 — 3 A : 31 T
l 引言
数据表 明 , 中国已经进入老龄化社会} 如何对老年人进行 l 】 ,
照顾 已经成 为—个 日益 引起关注 的问题 , 尤其独居老人 的 日常 生活安全对 构建和谐社会具有重要 意义 。 利用摄像机 的非接触
fa — i e e c gC mp tr E gn e ig a d A p e t n , 0 0 4 ( 3 :3 - 4 . r me df rn i . o ue n i e r p f ai s 2 1 。 6 1 ) 2 9 2 1 f n n n i o
Ab t a t Ch n a e t r d t e gn o i t. h ed ry h v e o n n r a ig o c r . h e t n a g rt m f id o sr c : i a h s n e e h a i g s c eyT e l el a e b c me a i ce sn c n e n T e d  ̄ci l o h o n o r o i
3 fa — i e e c n r p l d t h ma e s g n ai n o n i d o l e v n lwl n h a i si t n f r h s e - r me d f r n i g a e a p i o t e i g e me tt f a n o r e d r mo i g s f e o o y a d te b s et c mai o i/ r o h a t i o t r . e x e i n s s o t a h u n p s r ma e a e e me td u c sf l .h e l t rq ie n s ci t p su eTh e p rme t h w h t t e h ma o t e i g c n b s g ne s c e s l T e r a i vy u uy me e u r me t i s t fe a d i l y o d b ss f r t e f l wig i e t y n h l e l o t r n e e mi i g h s e e u t . a i id, n t a s a g o a i o h ol n d n i i g t e ed ry p su e a d d tr n n i/ r s c r y s o f h i Ke r s t r e fa -df r n ig; t n d tc in:h l el gn -i— lc y wo d : h e - r me i e e cn moi ee t o o t e ed r a ig n p a e y
帧差法

帧差法近些年来, 世界各地的学者们针对视频图像中的运动目标检测与跟踪问题做了大量而深入的研究, 提出了很多极其有效的算法难点主要在于视频序列中有各种不同的干扰因素, 这些因素主要包括: 光线明暗的变化、成像传感器本身的固有噪声、运动目标自身的形变或位移变化、背景中的杂波、运动目标的互相遮挡或者自遮挡等, 这些问题还有待于做进一步的研究。
目前, 常用的运动目标检侧方法有: 光流法、背景差分法和帧间差分法。
1.光流法光流法能够检测出运动目标较完整的运动信息, 不需要预先知道场景的任何信息, 能够较好的处理运动背景的情况, 并且可以用于摄像机运动的情况, 适用于帧间位移较大的情况。
但是由于透明性、阴影、多光源、遮挡和噪声等原因,利用光流法进行运动物体检测时, 计算量很大, 无法保证实时性和实用性, 故难以应用到实时系统, 同时对噪声比较敏感, 计算结果精度较低, 难以得到运动目标的精确边界。
2 .背景差分法操作简单, 能够提供完全的特征数据, 但对目标的检测能力较低, 尤其对天气、光照等噪声的影响极其敏感,3T 为预先设定的阈值, 可根据经验选取T , 若选取过大, 则检测的目标则可能出现较大的空洞甚至漏检, 若T 选取过小, 将出现大量噪声。
由于帧间差分法的不足, 就有学者提出了三帧差法, 三帧差法充分考虑了动像素的时间相关性, 对动态检测比较灵敏, 对随机噪声也有很好的抑制作用,但也存在一定缺陷, 即差分图像的检测阈值需手动设定, 大多数情况下只能依据实践经验。
三帧差分法的关键是选取合适的阈值对图像进行二值化。
运动目标自动跟踪是指对目标进行连续的检测并确定其运动轨迹[1].在视频监控领域中,目标智能识别与自动跟踪系统是近几年来的研究重点.在军事、国防和工业等领域有着广泛的应用前景.当前运动目标的检测方法主要有3类:光流法[2]、帧间差分法[3]和背景差分法[4].背景差分法具有简单、运算速度快等诸多优点,使得该法作为运动目标检测的基本方法被普遍采用.但该法暴露出若干问题:一种是因外部条件引起的,如对光线的变化、噪声等造成差分图像检测精度不高,甚至失效;另一种是由差分图像法本身内在局限引起的,主要有空洞[5]、拖影,以及运动目标被拉长等现象.光流法[6]虽然能够适用于静态背景和动态背景两种环境,有较好的适应性,但是其计算复杂度高,运算时间开销很大,不能满足实时性的要求.帧差法[7]比较简单,实时性高,它主要包括减背景方法和相邻帧相减法,即三帧差分法.减背景方法存在背景获取困难、受光照影响严重且更新困难等问题.三帧差分法受光照和阴影影响较小.笔者对三帧差分法进行改进,提出了一种简单有效的运动目标检测方法.1 运动目标实时跟踪系统1. 1 帧差法的基本原理帧间差分法的基本原理就是将前后两帧图像对应像素点的灰度值相减,在环境亮度变化不大的情况下,如果对应像素灰度相差很小,可以认为此处物是静止的;如果图像区域某处的灰度变化很大,可以认为这是由于图像中运动物体引起的,将这些区域标记下来,利用这些标记的像素区域,就可以求出运动目标在图像中的位置.一般采用的帧差法是在连续的图像序列[8]中2个或3个相邻帧间采用基于像素的时间差分并且阈值化来提取图像的运动区域.该运动目标实时跟踪系统是采用三帧差分来进行运动目标检测,这种方法不仅能提高运动目标检测[9]的速度,而且提高了所检测运动目标图像的完整性.均值滤波均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
一种基于改进三帧差分和ViBe算法的运动目标检测算法

一种基于改进三帧差分和ViBe算法的运动目标检测算法谢红;原博;解武【摘要】近几年提出的ViBe算法具有运算速度快,目标提取准确率高的特点,但是它对光照的突然变化也非常敏感,而且由于它的模型初始化的方式,也容易形成“拖影”现象。
文中先通过引入传统三帧差分算法难以提取出完整的目标轮廓这一问题,提出一种结合边缘检测的改进三帧差分算法。
该算法在提取出完整的运动目标的同时不会附加冗余的边缘信息。
然后将该算法引入到ViBe算法中,使2种方法结合,一方面消除“拖影”现象,另一方面可以自适应地选择检测的方法,以消除光照突变造成的影响。
试验结果表明,该改进算法是一种适应性强、鲁棒性高的运动目标检测算法。
%The ViBe algorithm proposed in recent years has the characteristics of high computing speed and high accuracy of object extraction. But it is sensitive to the light mutation. And it is also easy to form the"smear" phe⁃nomenon because of its model initialization modes. Firstly, this article proposed the improved three⁃frame difference algorithm combined with edge detection by introducing the problem that the traditional three⁃frame difference algo⁃rithm is difficult to extract the complete contours of the targets. This algorithm can extract the complete moving tar⁃gets without additional redundancy edge information. Then this algorithm is introduced into the ViBe algorithm and is combined with it. The improved algorithm can eliminate the"smear" phenomenon. and it can select the suitable detection method adaptively to eliminate the impact caused by the light mutation. The experimental results show that, this method is an effective moving target detection method.【期刊名称】《应用科技》【年(卷),期】2016(043)006【总页数】7页(P46-52)【关键词】视觉背景提取算法;三帧差分法;边缘检测;“拖影”现象;光照突变【作者】谢红;原博;解武【作者单位】哈尔滨工程大学信息与通信工程学院,黑龙江哈尔滨150001;哈尔滨工程大学信息与通信工程学院,黑龙江哈尔滨150001;哈尔滨工程大学信息与通信工程学院,黑龙江哈尔滨150001【正文语种】中文【中图分类】TN911.73运动目标检测就是将视频序列中的运动目标与所在的背景图像相分离,从而可以获得目标的前景,也就是确切的运动目标。
图像处理算法之帧间差分法

图像处理算法之帧间差分法
1. 基本原理
帧间差分法是⼀种通过对视频图像序列的连续两帧图像做差分运算获取运动⽬标轮廓的⽅法。
当监控场景中出现异常⽬标运动时,相邻两帧图像之间会出现较为明显的差别,两帧相减,求得图像对应位置像素值差的绝对值,判断其是否⼤于某⼀阈值,进⽽分析视频或图像序列的物体运动特性。
其数学公式描述如下:
D(x,y)为连续两帧图像之间的差分图像,I(t)和I(t-1)分别为t 和t-1时刻的图像,T 为差分图像⼆值化时选取的阈值,D(x,y) = 1表⽰前景,D(x,y)= 0表⽰背景。
2. 优缺点
优点:算法实现简单,程序设计复杂度低,运⾏速度快;动态环境⾃适应性强,对场景光线变化不敏感。
缺点:“空洞”现象(运动物体内部灰度值相近);“双影”现象(差分图像物体边缘轮廓较粗);不能提取出运动对象的完整区域,仅能提取轮廓;算法效果严重依赖所选取的帧间时间间隔和分割阈值。
3. 三帧差法
⽬的:解决帧间差分法的“双影”问题。
算法步骤如下:
可在⼀定程度上消除帧间差分法的“双影”现象。
一种改进的三帧差分运动目标实时检测算法

一种改进的三帧差分运动目标实时检测算法张英;车进;周鹏【摘要】针对传统三帧差分法提取的运动目标存在大量的噪声和空洞,提出一种改进的三帧差分运动目标实时检测算法;该算法采用Surendra背景提取算法提取有效背景,对视频流中连续三帧图像分别进行背景减除,得到的结果作为反馈对背景进行选择性更新,利用HSV颜色空间去除阴影后进行三帧差分,将差分结果进行“与”运行,通过将中间帧背景减除结果与“与”运算的结果进行“或”运算,这样可以得到运动目标的完整信息;实验结果表明,该算法能够快速、完整、准确地检测出运动目标,可有效应用于实时监控系统.【期刊名称】《计算机测量与控制》【年(卷),期】2015(023)006【总页数】4页(P2073-2075,2078)【关键词】背景选择性更新;阴影去除;三帧差分;运动目标检测【作者】张英;车进;周鹏【作者单位】宁夏大学物理电气信息学院,银川 750021;宁夏大学物理电气信息学院,银川 750021;宁夏大学物理电气信息学院,银川 750021【正文语种】中文【中图分类】TP391运动目标的有效检测是提取计算机视觉信息的重要步骤之一,是进行高层次视频图像处理的前提。
由于后续对运动目标的处理过程只是利用图像中运动区域内的像素值,所以对运动目标的有效检测显得非常重要[1]。
目前,运动目标的检测主要有3类方法,分别是光流法[2]、背景差法[3]和帧间差分法[4-5]。
光流法会受到噪声、阴影、光线变化和遮挡等因素的影响,使得计算结果有很大的误差,而且光流法的计算要有一定的硬件支持,所以要实现对视频流的实时处理就非常困难。
背景差法在背景发生变化(如光照、树枝树叶摇动等)时,则会影响到检测效果。
帧间差分法对静止或者速度比较慢的目标容易漏检,同时对连续两帧图像灰度和纹理比较接近时将无法得到完整的目标,容易形成较明显的“空洞”和“双影”现象。
针对上述问题,本文利用三帧差分法对外部环境变化不敏感的特点,提出了一种改进的三帧差分法对运动目标进行检测,有效地克服了以上问题,并且取得了很好的检测效果。
三帧差法

#include "stdafx.h"#include "cv.h"#include "cxcore.h"#include "highgui.h"#include "stdio.h"int main(int argc, _TCHAR* argv[]) {IplImage* pFrame = NULL;IplImage* pFrImg1 = NULL;IplImage* pFrImg2 = NULL;IplImage* pFrImg3 = NULL;IplImage* result1 = NULL;IplImage* result2 = NULL;IplImage* result = NULL;IplImage* tempImg1 = NULL;CvSize size;CvMat* pFrMat1 = NULL;CvMat* pFrMat2 = NULL;CvMat* pFrMat3 = NULL;CvMat* reMat1 = NULL;CvMat* reMat2 = NULL;CvMat* reMat = NULL;CvMat* tempMat1 = NULL;CvCapture* pCapture = NULL;int nFrmNum = 0;char* reWin = "effect" + nFrmNum;cvNamedWindow("video", 1);cvNamedWindow("effect", 1);cvMoveWindow("video", 0, 0);cvMoveWindow("effect", 400, 400);if( argc != 1 ){fprintf(stderr, "Usage: bkgrd <video_file_name>\n");return -1;}if( !(pCapture = cvCaptureFromFile("视频3.avi"))){fprintf(stderr, "Can not open video file %s\n", "视频3.avi");return -2;}while(pFrame = cvQueryFrame( pCapture )){nFrmNum++;if ( nFrmNum > 500){nFrmNum = 0;break;}}while(pFrame = cvQueryFrame( pCapture )){nFrmNum++;//如果是第一帧,需要申请内存,并初始化if(nFrmNum == 1){pFrImg1 = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1); pFrImg2 = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1); pFrImg3 = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);result1 = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1); result2 = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);result = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);pFrMat1 = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1); pFrMat2 = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1); pFrMat3 = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1); reMat1 = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1); reMat2 = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1); reMat = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1);tempMat1 = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1);size = cvSize(pFrame->width, pFrame->height);tempImg1 = cvCreateImage( cvSize((size.width & -2)/2, (size.height & -2)/2), 8, 1 );cvConvert(pFrImg1, pFrMat1);cvConvert(pFrImg1, pFrMat2);cvConvert(pFrImg1, pFrMat3);cvConvert(pFrImg1, reMat1);cvConvert(pFrImg1, reMat2);//cvConvert(pFrame1, reMat);}else{cvCvtColor(pFrame, pFrImg3, CV_BGR2GRAY);cvConvert(pFrImg3, pFrMat3);//cvCvtColor(pFrImg3, pFrImg2, CV_BGR2GRAY);pFrImg2 = pFrImg3;cvConvert(pFrImg2, pFrMat2);//cvCvtColor(pFrImg2, pFrImg1, CV_BGR2GRAY);pFrImg1 = pFrImg2;cvConvert(pFrImg1, pFrMat1);cvSmooth(pFrMat1, pFrMat1, CV_GAUSSIAN , 3, 1);cvSmooth(pFrMat2, pFrMat2, CV_GAUSSIAN , 3, 1);cvSmooth(pFrMat3, pFrMat3, CV_GAUSSIAN , 3, 1);//当前帧跟前一帧相减cvAbsDiff(pFrMat2, pFrMat1, reMat1);cvAbsDiff(pFrMat3, pFrMat2, reMat2);//二值化前景图cvThreshold(reMat1, result1, 60.0, 255.0, CV_THRESH_BINARY); cvThreshold(reMat2, result2, 60.0, 255.0, CV_THRESH_BINARY);//cvAdaptiveThreshold( reMat1, result1, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5 );//cvAdaptiveThreshold( reMat2, result2, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5 );//两个帧差值相与cvAnd(result1,result2,result,0);//使用Gaussian金字塔分解对输入图像向下采样,输出图像的高度和宽度应是输入图像的一半cvPyrDown(result, tempImg1, 7 );//对输入图像进行膨胀cvDilate(result, result, 0, 1);//使用Gaussian金字塔分解对输入图像向上采样,输出图像的高度和宽度应是输入图像的2倍cvPyrUp(tempImg1, result, 7 );//cvErode(result, result, 0, 1);//cvDilate(result, result, 0, 1);//cvPyrDown(result, tempImg1, 7 );//cvPyrUp(tempImg1, result, 7 );cvErode(result, result, 0, 3);cvDilate(result, result, 0, 3);//翻转图像,使其正立显示cvFlip(result, NULL, 0);cvShowImage("video", pFrame);cvShowImage("effect", result);cvCopy(pFrMat2, pFrMat1, NULL);cvCopy(pFrMat3, pFrMat2, NULL);cvCopy(pFrMat1, pFrMat3, NULL);cvCopy(pFrMat1, tempMat1, NULL);if( cvWaitKey( 20 ) >= 0 )break;}printf("\nFrame = %d\n", nFrmNum);}//销毁窗口cvDestroyWindow("video");//cvDestroyWindow(reWin);cvDestroyWindow("effect");//释放图像和矩阵cvReleaseImage(&pFrame);cvReleaseImage(&pFrImg1);cvReleaseImage(&pFrImg2);cvReleaseImage(&result1);cvReleaseImage(&result2);cvReleaseImage(&result);cvReleaseImage(&tempImg1);cvReleaseMat(&pFrMat1);cvReleaseMat(&pFrMat2);cvReleaseMat(&reMat1);cvReleaseMat(&reMat2);cvReleaseMat(&reMat);cvReleaseMat(&tempMat1);cvReleaseCapture(&pCapture); return 0;}。
运动目标检测

图4-7 二值化后
图4-8 检测结果
帧差法与背景减法的比较分析
帧差法与背景减法都比较简单,普遍应用的运动目标检测方法。但是对于 帧差法,运动过快或者运动过慢的目标,检测的准确率大大降低,甚至检 测不出,在动态背景下也不适用,易受外界环境变化的干扰。背景减法的 关键在于背景模型,最简单的背景模型获取方法是在场景没有运动目标时 采集图像作为背景,但这种背景存在局限性。目前很多人致力于不同背景 模型,减少动态场景变化对运动目标检测的影响,如,W4模型、均值滤波 法和高斯背景模型等建模方法,获取良好的背景与背景模型不断更新能保 证基于背景减法检测出更精确的目标。背景减法越来越受到重视,逐渐成 为主流的运动目标检测,有广泛的研究前景。
帧差法流程图
图4-1 三帧差分法
帧差法程序
帧差法程序
帧差法结果
图4-2 第97帧
图4-3 第98帧
图4-4 第99帧
图4-5 二值化
图4-6 第97帧
使用帧间差分法,需要考虑如何选择合理的时间间隔,这一般取决于运动目标的速度。对于快速 运动的目标,需要选择较短的时间间隔,如果选择不当,最坏情况下目标在前后两帧中没有重叠, 被检测为两个分开的目标;对于慢速运动的目标,应该选择较长的时间间隔,如果选择不当,最 坏情况下目标在前后两帧中几乎完全重叠,根本检测不到目标。
本文选取某一原始帧作为背景,实际中是对背景图像序列每一个像 素进行统计建模得到背景模型,常采用的建模方法有很多,例如高 斯背景建模,背景建模对目标检测的准确性起了重要作用。
背景减法流程图
图4-7 背景减法
背景减法程序
背景减法程序
背景减法结果
图4-3 第一帧
图4-4 第98帧
图4-5 背景帧
三帧差分法原理

三帧差分法原理
三帧差分法(Three-Frame Difference)是一种视频运动检测方法。
该方法通过对连续三帧图像进行比较,来检测出其中的运动目标。
原理是:首先,将三帧图像进行差分,得到两个差分图。
然后,将两个差分图进行逐像素比较,如果两个差分图的像素差异都比较大,就说明当前的图像中存在运动目标。
最后,可以通过一些形态学操作,如腐蚀、膨胀等,来进一步处理检测出来的运动目标。
三帧差分法可以有效地检测出视频中的运动目标,并且对于背景干扰较小的情况下,检测效果较好。
但是,在背景干扰较大的情况下,容易出现误检和漏检。
因此,在实际应用中,需要根据具体情况选择合适的方法来进行视频运动检测。
改进三帧差分算法在移动物体检测中的应用

改进三帧差分算法在移动物体检测中的应用刘伟洋;陈侃松;张丹;兰智高;冯杰【摘要】移动物体监控系统利用检测算法识别监控区域的移动物体,并进行实时异常信息存储,检测算法中的传统三帧差分法中的阈值是固定的,因此重叠部分无法准确检测出来,存在空洞现象,可能发生误判;针对这些问题,对已有的三帧差分法进行改进,结合图像边缘提取和自适应的迭代阈值计算方法来提高移动物体检测的准确性,并对异常信息进行选择性存储,由实验结果可知,应用平台采用改进后的移动物体检测算法,较好的提高了移动物体检测的灵敏度,增强了检测系统的实时性和准确性,若仅存储异常信息,可节省视频存储空间,并在定位异常动态信息时节省查找时间.【期刊名称】《计算机测量与控制》【年(卷),期】2017(025)002【总页数】4页(P177-180)【关键词】异常信息;三帧差分法;边缘提取;迭代阈值【作者】刘伟洋;陈侃松;张丹;兰智高;冯杰【作者单位】湖北大学计算机与信息工程学院物联网工程研究所,武汉430062;湖北大学计算机与信息工程学院物联网工程研究所,武汉430062;黄冈师范学院电子信息学院,湖北黄冈438000;湖北大学计算机与信息工程学院物联网工程研究所,武汉430062;黄冈师范学院电子信息学院,湖北黄冈438000;黄冈师范学院电子信息学院,湖北黄冈438000【正文语种】中文【中图分类】TP391智能视频监控系统是信息安全中的重要一环,它集成了智能行为识别算法,能够对画面场景中物体的行为进行识别、判断,当视频监控范围内出现异常信息时,通过对视频中的物体进行检测、分析和识别,实现异常报警等功能。
在智能视频监控系统中,移动物体检测算法的优劣直接影响系统对移动物体的有效检测和系统的应用性能,它的目的是为了从背景中提取出移动物体的信息,既从采集的序列图像中检测出变化的区域,并将移动物体从背景中提取出来进行分析和分割,检测出移动物体。
然而,现实生活中复杂的背景,摄像机固有的缺陷和环境光照的影响等因素给移动物体的检测带来了很大的影响。
改进三帧差分法与背景差分法结合的运动目标检测算法

改进三帧差分法与背景差分法结合的运动目标检测算法高林;王昌宇【摘要】针对传统三帧差分法对于运动速度较慢物体容易漏检等问题,提出了利用光流法对传统三帧算法改进并与背景差分法结合的运动目标检测算法.实验结果表明,改进的三帧差分算法与背景差分算法结合具有良好的抗躁性、适应性和鲁棒性.【期刊名称】《装备制造技术》【年(卷),期】2018(000)003【总页数】3页(P172-173,177)【关键词】三帧差分法;背景差分法;光流法;移动目标检测【作者】高林;王昌宇【作者单位】沈阳理工大学自动化与电气工程学院学院,辽宁沈阳110159;沈阳理工大学自动化与电气工程学院学院,辽宁沈阳110159【正文语种】中文【中图分类】TP3910 引言运动目标检测与识别的实用化是近几年图像识别领域重要研究方向,对运动目标图像的分割、跟踪和分类等在各个方面中都有重要应用。
目前,应用较多的算法是三帧差分法、背景差分法和光流法。
其中三帧差分法的优点是速度快,背景不用积累,但是对于与运动速度较慢物体容易漏检;背景差分法对于光照、天气等外界环境变化比较敏感;光流法具有精度相对较高的优点,但很难达到实时性[1]。
本文所提出的运动目标检测算法,能够达到最大程度降低噪声和最快速度反应目的。
1 应用光流法改进的三帧差分法利用金字塔Lucas-Kanade光流法对传统三帧差分算法进行改进。
采用金字塔结构来计算光流,可以减小光流计算的误差。
金字塔结构是对图像的各个层都计算光流矢量,首先计算出图像金字塔最高层处的光流,然后将该光流定义为下一层金字塔的起始点,重复上述过程,直至计算到金字塔的最底层[5]。
最后提取出可能存在运动目标的区域,根据不同的阈值在该区域内提取各个目标,这样便将光流法与传统的三帧差分算法结合了起来。
Lucas-Kanade光流法需要满足以下条件:(1)相邻的帧图像的灰度值不变;(2)该像素点邻域内的点具有相似的运动状态;(3)图像运动随时间的变化相对比较缓慢[3]。
三帧差分法

三帧差分法基于OpenCV实现的三帧差分法代码基于帧间差分法进行升级的三帧差分法,不同的测试视频可以设置不同二值化阈值来增强效果。
根据实际情况进行形态学处理。
[cpp] view plain copy1. #include <opencv2/highgui/highgui.hpp>2. #include<opencv2/imgproc/imgproc.hpp> 3. #include <opencv2/core/core.hpp>4.5. #define threshold_diff1 25 //设置简单帧差法阈值6. #define threshold_diff2 25 //设置简单帧差法阈值7.8. using namespace cv;9. using namespace std;10.11. int main(int argc,unsigned char* argv[]) 12. {13. Mat img_src1,img_src2,img_src3;//3帧法需要3帧图片 14. Mat img_dst,gray1,gray2,gray3;15. Mat gray_diff1,gray_diff2;//存储2次相减的图片 16. Matgray_diff11,gray_diff12;17. Mat gray_diff21,gray_diff22;18. Mat gray;//用来显示前景的19. bool pause=false;20.21. VideoCapture vido_file("test3.avi");//在这里改相应的文件名 22. namedWindow("foreground",0);23. for (;;)24. {25. if(!false)26. {27. vido_file >>img_src1; 28. cvtColor(img_src1,gray1,CV_BGR2GRAY);29.30. waitKey(33);31. vido_file >>img_src2; 32. cvtColor(img_src2,gray2,CV_BGR2GRAY);33. imshow("video_src",img_src2);//34.35. waitKey(33);36. vido_file >>img_src3;37. cvtColor(img_src3,gray3,CV_BGR2GRAY);38.39. Sobel(gray1,gray1, CV_8U,1,0,3,0.4,128);40. Sobel(gray2,gray2, CV_8U,1,0,3,0.4,128);41. Sobel(gray3,gray3, CV_8U,1,0,3,0.4,128);42.43. subtract(gray2,gray1,gray_diff11);//第二帧减第一帧44. subtract(gray1,gray2,gray_diff12);45. add(gray_diff11,gray_diff12,gray_diff1); 46.subtract(gray3,gray2,gray_diff21);//第三帧减第二帧47. subtract(gray2,gray3,gray_diff22); 48.add(gray_diff21,gray_diff22,gray_diff2);49.50. for(int i=0;i<gray_diff1.rows;i++)51. for(int j=0;j<gray_diff1.cols;j++) 52. {53. if(abs(gray_diff1.at<unsigned char>(i,j))>=threshold_diff1)//这里模板参数一定要用unsigned char,否则就一直报错54. gray_diff1.at<unsigned char>(i,j)=255; //第一次相减阈值处理 55. else gray_diff1.at<unsigned char>(i,j)=0;56.57. if(abs(gray_diff2.at<unsigned char>(i,j))>=threshold_diff2)//第二次相减阈值处理58. gray_diff2.at<unsigned char>(i,j)=255;59. else gray_diff2.at<unsigned char>(i,j)=0;60. }61. bitwise_and(gray_diff1,gray_diff2,gray);62.63. dilate(gray,gray,Mat());erode(gray,gray,Mat());64.65. imshow("foreground",gray); 66. }67. if( cvWaitKey(33) >= 0 ) 68. break;69. }70. return 0;71. }。
基于改进三帧差分法对监控视频中行人目标检测

①基金项目:玉林市政府与玉林师范学院重大合作项目(项目编号:YLSXZD2019015);玉林师范学院科研项目(项目编 号:2019YJKY24);玉林师范学院校级科研项目(项目编号:2019YJKY26)。
作者简介:莫丹雷(1991—),男,研究生,助教,研究方向为视频图像处理。
通信作者:杨瑞兆(1990—),男,硕士,实验师,研究方向为激光诱导击穿光谱、激光微加工技术。
E-mail: yangruizhao@。
DOI:10.16660/ki.1674-098X.2012-5640-9634基于改进三帧差分法对监控视频中行人目标检测①莫丹雷 杨瑞兆* 吴伟 甘永进 龙妹(玉林师范学院物理与电信工程学院 广西玉林 573000)摘 要:行人是交通系统中的主要参与者,所以监控视频中的行人目标检测对智能交通系统的研究和应用有着重要的意义。
由于场景的动态变化使得行人目标的检测变得相当困难,有效检测出监控视频中行人目标是解决这个问题的关键。
本文对比帧差法、光流法、背景相减法、三帧差法等几种常用检测算法的效果,最终采用三帧差法结合形态学技术对监控视频中行人目标检测,能较好地填充行人目标的部分“空洞”。
实验结果表明:改进的算法能较清晰,较完整地检测出视频中行人目标,检测效果良好。
关键词:监控视频 行人目标检测 三帧差法 形态学技术中图分类号:TP391.1文献标识码:A 文章编号:1674-098X(2021)02(c)-0138-05Pedestrian Target Detection in Surveillance Video Based onImproved Three-frame Difference MethodMO Danlei YANG Ruizhao * WU Wei GAN Yongjin LONG Mei(School of Physics and Telecommunication Engineering, Yullin Normol University, Yulin, Guangxi ZhuangAutonomous Region, 573000 China)Abstract: Pedestrians are the main participants in the transportation system, so the detection of pedestrian targets in sur veillance video is of great signif icance to the research and application of intelligent transportation systems. This article compares the effects of several common detection algorithms such as frame difference method, optical f low method, background subtraction method, and three frame difference method. Finally, the three-frame difference method combined with morphological technology is used to detect the pedestrian target in the surveillance video, which can better fill in the part of the pedestrian target hole. The experimental results show that the improved algorithm can detect pedestrians in surveillance video clearly and completely, and the detection effect is good.Key Words: Surveillance video; Pedestrian target detection; Three frame difference method; Morphological technique1 引言行人目标检测就是检测图像或者视频序列中是否包含行人目标,并根据检测出的行人得出其大小和位置信息,是目前计算机视觉领域的研究热点之一[1]。
三帧差分法

三帧差分法的问题大家帮忙看看这个三帧差分法的代码哪里出了问题?参照论坛上的相邻帧差法,改造成三帧差分法。
clc;clear;targetavi='SampleVideo.avi'; %%原始视频resultavi='result.avi'; %%检测结果视频%%%%%%%%%%%%%%%%%%%%%%读取视频mov=aviread(targetavi);%mov=mmreader(targetavi);fnum=size(mov,2);%%%%%%%%%%%%%%%%%%%%%%建立结果视频aviobj = avifile(resultavi);aviobj.Quality = 100;aviobj.Fps = 15;%pression='Indeo5';pression='None';%%%%%%%%%%%%%%%%%%%%%%帧间差分法for i=2:fnumx=mov(i-1).cdata(:,:,:);y=mov(i).cdata(:,:,:);z=mov(i+1).cdata(:,:,:);m=rgb2gray(x);m=medfilt2(m);n=rgb2gray(y);n=medfilt2(n);o=rgb2gray(z);o=medfilt2(o);q=im2double(n);w=im2double(m);p=im2double(o);c=q-w;%%前两帧差分b=p-q;%%后两帧差分t=40; %%阈值,此值可以调节t=t/256;%%转化为double型数据k=find(abs(c)>=t);%%find函数作用是找到图c中的值大于t的点坐标d=find(abs(b)>=t);%%find函数作用是找到图b中的值大于t的点坐标c(k)=255;%%二值化的一b(d)=255;k=find(abs(c)<t);d=find(abs(b)<t);c(k)=0;%%二值化的零b(d)=0;f=c&b;imshow(f);adata=cat(3,f,f,f);%%灰度图像生成视频必加此句aviobj = addframe(aviobj,adata);%%生成视频hold on;drawnow;hold off;endaviobj=close(aviobj);显示的错误提示:??? Error using ==> avifile.addframe>getInputType at 384Invalid input argument. Each frame must be a numeric matrix, a MA TLAB movie structure, or a handle to a figureor axis.Error in ==> avifile.addframe at 58inputType = getInputType(varargin{i});Error in ==> ThreeFrameDifference at 61aviobj = addframe(aviobj,adata);%%生成视频TOPMatlab中文函数大全上线,欢迎大家完善!点。
三帧差分

这几天研究了下三帧差法做物体检测。
三帧差法的具体算法如下。
提取连续的三帧图像,I(k-1),I(k),I(k+1) 。
(1) d(k,k-1) [x,y] = | I(k)[x,y] - I(k-1)[x,y] |;d(k,k+1)[x,y] = | I(k+1)[x,y] - I(k)[x,y] |;(2) b(k,k-1)[x,y] = 1; if d(k,k-1) [x,y] >= T;b(k,k-1)[x,y] = 0; if d(k,k-1) [x,y] < T;b(k+1,k)[x,y] = 1 if d(k+1,k) [x,y] >= T;b(k+1,k)[x,y] = 0 if d(k+1,k) [x,y] < T;(3) B(k)[x,y] = 1 ; if b(k,k-1)[x,y] && b(k+1,k)[x,y] == 1 ;B(k)[x,y] = 0 ; if b(k,k-1)[x,y] && b(k+1,k)[x,y] ==0 ;到了这里,比较关键的就是第2步的阈值T的选取问题,单纯用otsu算法分割貌似效果不太好,如果手动设置一个较小的值(如10)效果还可以,但手动设置有一定的限制性。
接下来要研究局部阈值的选取。
用otsu取阈值实现的一个三分差法代码。
效果不是很好。
#include "highgui.h"#include "cv.h"#include "cxcore.h"#include "cvaux.h"#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <queue>#include <vector>#include <windows.h>using namespace std;//#pragma comment(lib, "highgui200.lib")//#pragma comment(lib, "cv200.lib")//#pragma comment(lib, "cxcore200.lib")//#pragma comment(lib, "cvaux200.lib")#define GET_IMAGE_DATA(img, x, y) ((uchar*)(img->imageData + img->widthStep * (y)))[x]int T = 10;int Num[300];int Sum[300];void InitPixel(IplImage * img, int &_low, int &_top){memset(Num,0,sizeof(Num));memset(Sum,0,sizeof(Sum));_low = 255;_top = 0;for(int i = 0;i < img->height;i++){for(int j = 0;j < img->width;j++){int temp = ((uchar*)(img->imageData + img->widthStep*i))[j];if(temp < _low)_low = temp;if(temp > _top)_top = temp;Num[temp] += 1;}}for(int i = 1 ; i < 256 ; i++){Sum[i] = Sum[i-1]+ i*Num[i];Num[i] += Num[i-1];}}int otsu (IplImage *img){int _low,_top,mbest=0;float mn = img->height*img->width;InitPixel(img,_low,_top);float max_otsu = 0;mbest = 0;if( _low == _top)mbest = _low;else{for(int i = _low; i< _top ; i++){float w0 = (float)((Num[_top]-Num[i]) / mn);float w1 = 1 - w0;float u0 = (float)((Sum[_top]-Sum[i])/(Num[_top]-Num[i]));float u1 = (float)(Sum[i]/Num[i]);float u = w0*u0 + w1*u1;float g = w0*(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u);if( g > max_otsu){mbest = i;max_otsu = g;}}}return mbest;}int main(){int ncount=0;IplImage *image1=NULL;IplImage *image2=NULL;IplImage *image3=NULL;IplImage *Imask =NULL;IplImage *Imask1=NULL;IplImage *Imask2=NULL;IplImage *Imask3=NULL;IplImage *mframe=NULL;CvCapture *capture = cvCreateFileCapture("E:\\Motion\\IndoorGTTest2.avi");//CvCapture *capture = cvCreateCameraCapture(0);cvNamedWindow("src");cvNamedWindow("dst");cvNamedWindow("Imask1");cvNamedWindow("Imask2");cvNamedWindow("Imask3");//cvCreateTrackbar("T","dst",&T,255,0);while(mframe=cvQueryFrame(capture)){DWORD start=GetTickCount();if(ncount>1000000000)ncount=100;ncount+=1;if(ncount==1){image1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);image2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);image3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);Imask =cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);Imask1=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);Imask2=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);Imask3=cvCreateImage(cvGetSize(mframe),IPL_DEPTH_8U,1);cvCvtColor(mframe,image1,CV_BGR2GRAY);}if(ncount==2)cvCvtColor(mframe,image2,CV_BGR2GRAY);if(ncount>=3){if(ncount==3)cvCvtColor(mframe,image3,CV_BGR2GRAY);else{cvCopy(image2,image1);cvCopy(image3,image2);cvCvtColor(mframe,image3,CV_BGR2GRAY);}cvAbsDiff(image2,image1,Imask1);cvAbsDiff(image3,image2,Imask2);//cvShowImage("Imask1",Imask1);//cvShowImage("Imask2",Imask2);int mbest1 = otsu(Imask1);cvSmooth(Imask1, Imask1, CV_MEDIAN);cvThreshold(Imask1,Imask1,mbest1, 255, CV_THRESH_BINARY);int mbest2 = otsu(Imask2);cvSmooth(Imask2,Imask2, CV_MEDIAN);cvThreshold(Imask2,Imask2,mbest2, 255, CV_THRESH_BINARY);cout<<mbest1<<" "<<mbest2<<endl;cvAnd(Imask1,Imask2,Imask);/*cvErode(Imask, Imask);cvDilate(Imask,Imask);*/DWORD finish=GetTickCount();// cout<<finish-start<<"ms"<<endl;cvShowImage("src",image2);cvShowImage("dst",Imask);}char c = cvWaitKey(30);if(c==27)break;}return 0;}\#include "stdafx.h"#include "cv.h"#include "cxcore.h"#include "highgui.h"#include "stdio.h"int main(int argc, _TCHAR* argv[]){IplImage* pFrame = NULL;IplImage* pFrImg1 = NULL;IplImage* pFrImg2 = NULL;IplImage* pFrImg3 = NULL;IplImage* result1 = NULL;IplImage* result2 = NULL;IplImage* result = NULL;IplImage* tempImg1 = NULL;CvSize size;CvMat* pFrMat1 = NULL;CvMat* pFrMat2 = NULL;CvMat* pFrMat3 = NULL;CvMat* reMat1 = NULL;CvMat* reMat2 = NULL;CvMat* reMat = NULL;CvMat* tempMat1 = NULL;CvCapture* pCapture = NULL;int nFrmNum = 0;char* reWin = "effect" + nFrmNum;cvNamedWindow("video", 1);cvNamedWindow("effect", 1);cvMoveWindow("video", 0, 0);cvMoveWindow("effect", 400, 400);if( argc != 1 ){fprintf(stderr, "Usage: bkgrd <video_file_name>\n"); return -1;}if( !(pCapture = cvCaptureFromFile("F:\\仿真结果\\B vector.avi"))){fprintf(stderr, "Can not open video file %s\n", "F:\\仿真结果\\B vector.avi");return -2;}while(pFrame = cvQueryFrame( pCapture )){nFrmNum++;if ( nFrmNum > 500){nFrmNum = 0;break;}}printf("视频帧数:%d\n",nFrmNum);cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_FRAMES,);//第一帧pFrame = cvQueryFrame( pCapture );if(nFrmNum>2){pFrImg1 = cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U, 1);pFrImg2 = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);pFrImg3 = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);result1 = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);result2 = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);result = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_8U, 1);pFrMat1 = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1);pFrMat2 = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1);pFrMat3 = cvCreateMat(pFrame->height, pFrame->width, CV_8UC1);reMat1 = cvCreateMat(pFrame->height, pFrame->width,CV_8UC1);reMat2 = cvCreateMat(pFrame->height, pFrame->width,CV_8UC1);reMat = cvCreateMat(pFrame->height, pFrame->width,CV_8UC1);size = cvSize(pFrame->width, pFrame->height);tempImg1 = cvCreateImage( cvSize((size.width & -2)/2, (size.height & -2)/2), 8, 1 );}else{printf("帧数小于3!\n");return -1;}//先读取两帧cvCvtColor(pFrame, pFrImg1, CV_BGR2GRAY);cvConvert(pFrImg1, pFrMat1);pFrame = cvQueryFrame( pCapture );cvCvtColor(pFrame, pFrImg2, CV_BGR2GRAY);cvConvert(pFrImg2, pFrMat2);int count = 2;while((pFrame = cvQueryFrame( pCapture ))){count++;cvCvtColor(pFrame, pFrImg3, CV_BGR2GRAY);cvConvert(pFrImg3, pFrMat3);cvSmooth(pFrMat1, pFrMat1, CV_GAUSSIAN , 3, 1);cvSmooth(pFrMat2, pFrMat2, CV_GAUSSIAN , 3, 1);cvSmooth(pFrMat3, pFrMat3, CV_GAUSSIAN , 3, 1);//当前帧跟前一帧相减cvAbsDiff(pFrMat2, pFrMat1, reMat1);cvAbsDiff(pFrMat3, pFrMat2, reMat2);//二值化前景图cvThreshold(reMat1, result1, 60.0, 255.0, CV_THRESH_BINARY); cvThreshold(reMat2, result2, 60.0, 255.0, CV_THRESH_BINARY);///cvAdaptiveThreshold( reMat1, result1, 255,CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 5, 5 );//cvAdaptiveThreshold( reMat2, result2, 255,CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 5, 5 );//两个帧差值相与cvAnd(result1,result2,result,0);//使用Gaussian金字塔分解对输入图像向下采样,输出图像的高度和宽度应是输入图像的一半cvPyrDown(result, tempImg1, 7 );//对输入图像进行膨胀cvDilate(result, result, 0, 1);//使用Gaussian金字塔分解对输入图像向上采样,输出图像的高度和宽度应是输入图像的2倍cvPyrUp(tempImg1, result, 7 );//cvErode(result, result, 0, 1);//cvDilate(result, result, 0, 1);//cvPyrDown(result, tempImg1, 7 );//cvPyrUp(tempImg1, result, 7 );cvErode(result, result, 0, 3);cvDilate(result, result, 0, 3);//翻转图像,使其正立显示cvFlip(result, NULL, 0);cvShowImage("video", pFrame);cvShowImage("effect", result);cvCopy(pFrMat2, pFrMat1, NULL);cvCopy(pFrMat3, pFrMat2, NULL);if( cvWaitKey( 20 ) >= 0 )break;printf("\nFrame = %d\n", count);}//销毁窗口cvDestroyWindow("video");//cvDestroyWindow(reWin);cvDestroyWindow("effect");//释放图像和矩阵cvReleaseImage(&pFrImg1);cvReleaseImage(&pFrImg2);cvReleaseImage(&result1);cvReleaseImage(&result2);cvReleaseImage(&result);cvReleaseImage(&tempImg1);cvReleaseMat(&pFrMat1);cvReleaseMat(&pFrMat2);cvReleaseMat(&reMat1);cvReleaseMat(&reMat2);cvReleaseMat(&reMat);cvReleaseCapture(&pCapture); return 0;}。
opencv运动检测三帧差法

opencv运动检测三帧差法三帧差法优点:实时性高缺点:1、运动物体本身颜色相近时,会出现较大的空洞。
2、无法应对光照骤变的情况理论上:三帧差法比二帧差法更好一些(可在一定程度上消除帧间差分法的“双影”现象),但是也要结合实际情况而用。
1. 帧差法基本原理帧差法的实现非常简单:如图可见,由目标运动引起的运动变化区域,包括运动目标在前后两帧中的共同位置(图中黑色区域)、在当前帧中新显露出的背景区域和新覆盖的背景区域三部分。
数学原理:三帧差法的流程:1 结果1 = (第二幅图像 - 第一幅图像) ∩ (第三幅图像 - 第二幅图像)2结果2 = 滤波(结果1)3 结果3 = 形态学处理(结果2)4结果4 = 二值化(结果3)第一步:第二幅图像减去第一幅图像的值与第三幅图像减去第二幅图像的值作交集运算.对第一步产生的结果做滤波处理.对第二步产生的结果做形态学处理.对第三步产生的结果做二值化处理.直接上代码:1.#include <opencv2/opencv.hpp>ing namespace std;ing namespace cv;4.5.int main()6.{7.//读入视频8.VideoCapture capture("1.avi"); //Laboratory_raw.avi9.//VideoCapture capture(0);10.11.Mat tempframe, currentframe, previousframe, difframe,s3;12.Mat difframe2, difframe3;13.Mat frame;14.int framenum = 0;15.//读取一帧处理16.while (true)17.{18.if (!capture.isOpened())19.{20.cout << "read video failure" << endl;21.return -1;22.}23.//tempframe = capture.read(frame);24.capture >> frame;25.imshow("原视频", frame);26.previousframe = frame.clone(); //第一帧27.28.capture >> frame;29.currentframe = frame.clone(); //第二帧30.31.capture >> frame;32.s3 = frame.clone(); //第三帧33.34.cvtColor(previousframe, previousframe, CV_BGR2GRAY);35.cvtColor(currentframe, currentframe, CV_BGR2GRAY);36.cvtColor(s3,s3, CV_BGR2GRAY);37.38.39.absdiff(currentframe, previousframe, difframe);//做差求绝对值 1-240.absdiff(previousframe, s3, difframe2);//做差求绝对值 2-341.42.43.//准备做与运算,difframe3= difframe2^difframe44.// void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 & src245.bitwise_and(difframe, difframe2, difframe3); //46.47.48.threshold(difframe3, tempframe, 20, 255.0, CV_THRESH_BINARY);49.dilate(tempframe, tempframe, Mat());//膨胀50.erode(tempframe, tempframe, Mat());//腐蚀51.52.imshow("运动目标", tempframe);53.54.waitKey(50);55.}//end while56.}运行结果:希望对你有帮助。
基于MATLAB的三帧差分边缘检测算法研究

基于MATLAB的三帧差分边缘检测算法研究作者:梁禹韩舒羽来源:《计算机应用文摘》2022年第18期关键词:MATLAB;三帧差分边缘检测;目标重叠智能视频监控系统具有智能化与数字化优势,目前被广泛应用于交通与安防等领域[1]。
当下,一些常用的运动目标检测算法包括帧间差分法、背景差分法、光流法等,在分析这些方法的原理和流程后,可以对其优缺点进行比较[2]。
将以上三种方法进行对比发现,利用帧差法来实现运动目标的检测,实验表明,对于运动快且形状较大的运动目标,在运动图像检测中有良好的效果[3]。
帧间差分算法实现简单,程序计算复杂度低,运行速度快,而且对环境中的场景光线的变化不敏感,还能提高检测准确率[4]。
并且,该算法只对运动目标比较敏感,运行稳定,适合用于目标检测对复杂度要求低和资源利用低的场景。
帧间差分法直接比较连续两帧或多帧图像中对应像素的灰度值,然后在设置阈值的序列图像中提取运动目标的区域[5],该算法适合用于智能安防监控领域。
当多帧连续的视频画面中有运动目标时,帧间差分法对相邻两帧图像作差分运算并计算得到结果,通过该算法可以快速提取出运动的目标区域。
与其他算法相比,该算法也更易于在FPCA等硬件上实现。
本文在此基础上提出一种融合算法,该融合算法融合三帧差分法和改进的边缘检测算法,使用MATLAB进行仿真验证表明,该算法的优点是能降低检测目标的重叠性。
1三帧差分边缘检测算法图像是一种最直观的视觉内容,包含较多信息,其中边缘和轮廓是图像的最基本特征,蕴藏着图像中最为关键的信息。
Sobel算子的工作原理是:对图像的局部像素点进行平均化或加权平均化计算,利用灰度变化设置阈值判断像素点是否为边缘点,实现消除噪音和平滑图像的效果。
本文提出三帧差分边缘检测的融合算法,是将三帧差分算法和基于新的计算公式的边缘检测算法进行融合得到的目标检测算法,通过融合改进的边缘检测算法之后,使得提取的目标区域边缘更加连续,轨迹清晰,同时可提高算法的准确率,降低重叠性,且融合后的算法在FPCA上易于实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三帧差分法的问题
大家帮忙看看这个三帧差分法的代码哪里出了问题?参照论坛上的相邻帧差法,改造成三帧差分法。
clc;
clear;
targetavi='SampleVideo.avi'; %%原始视频
resultavi='result.avi'; %%检测结果视频%%%%%%%%%%%%%%%%%%%%%%读取视频
mov=aviread(targetavi);
%mov=mmreader(targetavi);
fnum=size(mov,2);
%%%%%%%%%%%%%%%%%%%%%%建立结果视频
aviobj = avifile(resultavi);
aviobj.Quality = 100;
aviobj.Fps = 15;
%pression='Indeo5';
pression='None';
%%%%%%%%%%%%%%%%%%%%%%帧间差分法
for i=2:fnum
x=mov(i-1).cdata(:,:,:);
y=mov(i).cdata(:,:,:);
z=mov(i+1).cdata(:,:,:);
m=rgb2gray(x);
m=medfilt2(m);
n=rgb2gray(y);
n=medfilt2(n);
o=rgb2gray(z);
o=medfilt2(o);
q=im2double(n);
w=im2double(m);
p=im2double(o);
c=q-w;%%前两帧差分
b=p-q;%%后两帧差分
t=40; %%阈值,此值可以调节
t=t/256;%%转化为double型数据
k=find(abs(c)>=t);%%find函数作用是找到图c中的值大于t的点坐标
d=find(abs(b)>=t);%%find函数作用是找到图b中的值大于t的点坐标
c(k)=255;%%二值化的一
b(d)=255;
k=find(abs(c)<t);
d=find(abs(b)<t);
c(k)=0;%%二值化的零
b(d)=0;
f=c&b;
imshow(f);
adata=cat(3,f,f,f);%%灰度图像生成视频必加此句
aviobj = addframe(aviobj,adata);%%生成视频
hold on;
drawnow;
hold off;
end
aviobj=close(aviobj);
显示的错误提示:
??? Error using ==> avifile.addframe>getInputType at 384
Invalid input argument. Each frame must be a numeric matrix, a MA TLAB movie structure, or a handle to a figure
or axis.
Error in ==> avifile.addframe at 58
inputType = getInputType(varargin{i});
Error in ==> ThreeFrameDifference at 61
aviobj = addframe(aviobj,adata);%%生成视频
TOP
Matlab中文函数大全上线,欢迎大
家完善!点。