运动检测与跟踪之动态背景的更新
转载自http://blog.csdn.net/dcrmg/article/details/52263532
运动物体检测与跟踪中的帧差分法,除了相邻帧差分法和三帧差分法外,还有一种差分方法,可以通过建立不含前景的背景模型,用当前帧和背景模型做差,差值就可以体现运动物体大概的位置和大小信息。
相比相邻帧差分法和三帧差分法,背景模型做差法可以较为完整的体现运动物体的整体轮廓,运动物体的双重轮廓、“鬼影”、空洞现象改善明显,下文的对比效果可以看到这一点。
但背景模型的选取和建立的要求条件也更为苛刻:
1. 背景模型中不能包含前景物体,如果包含前景物体,则在之后检测到的运动物体结果中,会一直保留有前景运动物体初始的轮廓。
例如下边这个例子,选取了第一帧作为背景模型,不幸的是,第一帧中含有运动物体,用红色框标示出:
检测效果:
正如前边所说的,在之后检测到的运动物体结果中,3个前景运动物体初始的轮廓一直存在,即使运动物体早已经不在初始的位置,用红色框标示出。
若使用完全不包含前景物体的背景图像作为背景模型,上述情况就不会出现了,检测效果也比较好。
比如使用下边这个图像作为背景模型:
由于这个视频没有完全不包含前景物体的背景图像,我的方法是求所有视频帧序列和的平均值作为背景模型,在一定程度上可以代表不含前景的背景图,部分位置处移动物体停留的事件比较久,所以有一些黑影出现,如图像中部区域。
检测效果:
检测效果中不再有之前的3个“伪影像”,并且可以看到,相比相邻帧差分法和三帧差分法,背景模型做差法可以较为完整的体现运动物体的整体轮廓,运动物体的双重轮廓、“鬼影”、空洞现象改善明显。
2. 背景模型对环境的变化非常敏感,比如光照的变化、背景模型建立之后监控中加入的静止的物体、或背景模型中原本的物体位置被挪动等等,这些因素都会造成静止的物体被当做运动物体检测出来。造成误检,
还以上一个视频为例,当背景模型中原本静止的物体位置被挪动:
建立背景模型时视频中彩带的位置在下图用蓝色线段标示出,之后由于一些原因彩带的位置发生了改变,用红色线段标示,位置改变后,即使彩带一直保持静止,在检测结果中仍然会错误的检测出静止的彩带。
现实情况中,想要消除以上两点影响,一次性建立一个理想的背景模型,几乎是不可能的。基于此,我们可以建立一个动态的背景模型,这个动态模型实现以下两个功能:
1. 如果初始建立的背景模型中包含有前景物体,动态模型应该能够快速将前景物体的影响降低或消除掉;
2. 对于背景模型中静止的物体位置改变或者新加入视频画面中静止的物体,动态模型应该能够快速觉察到这种变化, 并把这种改变纳入到下一轮的背景模型构建中。
基于这两个基本的要求,构建动态背景模型的步骤如下:
1. 以初始第一帧作为第一个背景模型
2. 检测第二帧中运动物体,得到前景图像
3. 把第二帧图像抠除检测到的前景物体后,以一定比例系数累加到上一轮构建的背景模型中
4. 更新背景模型,在随后帧上,重复1,2,3
Opencv中,accumulateWeighted方法可以实现以上构建动态模型的要求。
方法原型:
- void accumulateWeighted( InputArray src, InputOutputArray dst,
- double alpha, InputArray mask=noArray() );
第一个参数:src,新加入的构建背景模型的图像矩阵;
第二个参数:dst,累计新元素src后生成的新的背景模型;
第三个参数:alpha,新加入原型src的系数,公式表述为:
dst = dst*(1-alpha) + src*alpha;
即alpha越大,当前新元素对构建动态模型的影响越大。如下,当alpha取值为0.9时,背景模型为:
此时新加入背景模型的新元素占比较大,对新的背景模型的影响也大,从上图可以看到,除有少许拖 影外 ,基本跟上一帧图像特征一致。
当alpha取值为0.2时,背景模型为:
此时,新加入背景模型的元素占比较小,意味着之前加入的元素比重相应较大,累计的背景模型有很 重的“鬼影”,每一个虚影代表了最近新加入背景模型的一个元素。
第四个参数:mask,英文释义“面具”,顾名思义,指在背景模型中需要减去的,不予考虑的部分,可以使用在当前背 景模型下检出的前景物体作为mask,进一步减少对背景模型的干扰。可以为空。
累积权重构建背景模型代码实现:
运动物体检测与跟踪中的帧差分法,除了相邻帧差分法和三帧差分法外,还有一种差分方法,可以通过建立不含前景的背景模型,用当前帧和背景模型做差,差值就可以体现运动物体大概的位置和大小信息。
相比相邻帧差分法和三帧差分法,背景模型做差法可以较为完整的体现运动物体的整体轮廓,运动物体的双重轮廓、“鬼影”、空洞现象改善明显,下文的对比效果可以看到这一点。
但背景模型的选取和建立的要求条件也更为苛刻:
1. 背景模型中不能包含前景物体,如果包含前景物体,则在之后检测到的运动物体结果中,会一直保留有前景运动物体初始的轮廓。
例如下边这个例子,选取了第一帧作为背景模型,不幸的是,第一帧中含有运动物体,用红色框标示出:
检测效果:
正如前边所说的,在之后检测到的运动物体结果中,3个前景运动物体初始的轮廓一直存在,即使运动物体早已经不在初始的位置,用红色框标示出。
若使用完全不包含前景物体的背景图像作为背景模型,上述情况就不会出现了,检测效果也比较好。
比如使用下边这个图像作为背景模型:
由于这个视频没有完全不包含前景物体的背景图像,我的方法是求所有视频帧序列和的平均值作为背景模型,在一定程度上可以代表不含前景的背景图,部分位置处移动物体停留的事件比较久,所以有一些黑影出现,如图像中部区域。
检测效果:
检测效果中不再有之前的3个“伪影像”,并且可以看到,相比相邻帧差分法和三帧差分法,背景模型做差法可以较为完整的体现运动物体的整体轮廓,运动物体的双重轮廓、“鬼影”、空洞现象改善明显。
2. 背景模型对环境的变化非常敏感,比如光照的变化、背景模型建立之后监控中加入的静止的物体、或背景模型中原本的物体位置被挪动等等,这些因素都会造成静止的物体被当做运动物体检测出来。造成误检,
还以上一个视频为例,当背景模型中原本静止的物体位置被挪动:
建立背景模型时视频中彩带的位置在下图用蓝色线段标示出,之后由于一些原因彩带的位置发生了改变,用红色线段标示,位置改变后,即使彩带一直保持静止,在检测结果中仍然会错误的检测出静止的彩带。
现实情况中,想要消除以上两点影响,一次性建立一个理想的背景模型,几乎是不可能的。基于此,我们可以建立一个动态的背景模型,这个动态模型实现以下两个功能:
1. 如果初始建立的背景模型中包含有前景物体,动态模型应该能够快速将前景物体的影响降低或消除掉;
2. 对于背景模型中静止的物体位置改变或者新加入视频画面中静止的物体,动态模型应该能够快速觉察到这种变化, 并把这种改变纳入到下一轮的背景模型构建中。
基于这两个基本的要求,构建动态背景模型的步骤如下:
1. 以初始第一帧作为第一个背景模型
2. 检测第二帧中运动物体,得到前景图像
3. 把第二帧图像抠除检测到的前景物体后,以一定比例系数累加到上一轮构建的背景模型中
4. 更新背景模型,在随后帧上,重复1,2,3
Opencv中,accumulateWeighted方法可以实现以上构建动态模型的要求。
方法原型:
- void accumulateWeighted( InputArray src, InputOutputArray dst,
- double alpha, InputArray mask=noArray() );
第一个参数:src,新加入的构建背景模型的图像矩阵;
第二个参数:dst,累计新元素src后生成的新的背景模型;
第三个参数:alpha,新加入原型src的系数,公式表述为:
dst = dst*(1-alpha) + src*alpha;
即alpha越大,当前新元素对构建动态模型的影响越大。如下,当alpha取值为0.9时,背景模型为:
此时新加入背景模型的新元素占比较大,对新的背景模型的影响也大,从上图可以看到,除有少许拖 影外 ,基本跟上一帧图像特征一致。
当alpha取值为0.2时,背景模型为:
此时,新加入背景模型的元素占比较小,意味着之前加入的元素比重相应较大,累计的背景模型有很 重的“鬼影”,每一个虚影代表了最近新加入背景模型的一个元素。
第四个参数:mask,英文释义“面具”,顾名思义,指在背景模型中需要减去的,不予考虑的部分,可以使用在当前背 景模型下检出的前景物体作为mask,进一步减少对背景模型的干扰。可以为空。
累积权重构建背景模型代码实现:
#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include "iostream"using namespace std;
using namespace cv; int main(int argc,char *argv[])
{VideoCapture videoCap(argv[1]);if(!videoCap.isOpened()){return -1;}Mat image;Mat imageBackground; //动态背景模型Mat imageFront; //前景 double videoFPS=videoCap.get(CV_CAP_PROP_FPS); //获取帧率 double videoPause=1000/videoFPS;videoCap>>imageBackground; //第一帧作为初始背景模型 cvtColor(imageBackground,imageBackground,CV_RGB2GRAY); Mat element=getStructuringElement(0,Size(3,3)); //腐蚀核while(true) { videoCap>>image; if(image.empty()||waitKey(videoPause)==27) //视频播放完成,或Esc键退出{ break; } Mat image1;cvtColor(image,image1,CV_RGB2GRAY); absdiff(image1,imageBackground,imageFront); imageBackground.convertTo(imageBackground,CV_32FC1); //扩展至32位做运算accumulateWeighted(image1,imageBackground,0.6,imageFront);imageBackground.convertTo(imageBackground,CV_8UC1); //转换回8位threshold(imageFront,imageFront,0,255,CV_THRESH_OTSU); //阈值分割 morphologyEx(imageFront,imageFront,CV_MOP_OPEN,element); //消除孤立的点//膨胀操作,消除孔洞dilate(imageFront,imageFront,element);dilate(imageFront,imageFront,element);dilate(imageFront,imageFront,element);dilate(imageFront,imageFront,element);dilate(imageFront,imageFront,element);vector> contours; vectorhierarchy; findContours(imageFront,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point()); for(int i=0;i
检测效果1:
效果2:
效果3:
运动检测与跟踪之动态背景的更新相关推荐
- 基于opencV的动态背景下运动目标检测及跟踪(修改版)
基于openCV的动态背景下的运动目标检测 from: http://www.mianfeiwendang.com/doc/89c6692a222a84b2ced0d502/1 摘要:介绍在动态背景下 ...
- 动态背景下目标跟踪算法目标跟踪
1.问题描述: 动态背景下目标跟踪算法目标跟踪 2.部分程序: % Programming By ALireza Fasih % Email: ar_fasih@yahoo.com % Please ...
- 目标跟踪经典算法汇总(持续更新...)
如题,虽然这个问题是经典目标跟踪算法,但事实上,可能我们并不需要那些曾经辉煌但已被拍在沙滩上的tracker(目标跟踪算法),而是那些即将成为经典的,或者就目前来说最好用.速度和性能都看的过去trac ...
- 针对无人机航拍视频中动态背景下的目标检测
目录 目录 传统目标检测技术 传统目标检测技术 1. 帧间差分 通过连续两帧相同位置像素点间的灰度差来确定目标移动.但只适用于静态背景和目标单一条件的目标检测.仅适用于无人机悬停状态下的目标检测. 2 ...
- 【opencv】动态背景下运动目标检测 SURF配准差分
主要思路是,读入视频,隔帧采用SURF计算匹配的特征点,进而计算两图的投影映射矩阵,做差分二值化,连通域检测,绘制目标. 如果背景是静态的采用camshift即可. 本文方法速度debug下大概2-3 ...
- JS实现线条动态背景
[Top] JS实现线条动态背景 线条随机运动,鼠标移动过程中,有吸附性,话不多说,直接上代码吧! !function () {let num = 100;//设置所画线的颜色let colorLin ...
- 知识跟踪的深度知识跟踪和动态学生分类 Deep Knowledge Tracing and Dynamic Student Classification for Knowledge Tracing
Deep Knowledge Tracing and Dynamic Student Classification for Knowledge Tracing(译) 知识跟踪的深度知识跟踪和动态学生分 ...
- 项目看板开发经验分享(一)——光伏绿色能源看板(可复用组件、条件动态背景图、flex布局应用、v-for遍历列表多重绝对定位)
今天新开一个系列,专门介绍近期工作中开发的几个比较酷炫的看板的开发思路与经验分享.第一节我们就来介绍下这个光伏绿色能源看板,整体浏览如下: UED提供的原设计图,这波还原的还不错吧? 那就直接进入正题 ...
- 有趣的HTML实例(八) 一个很有趣的动态背景(css+js)
小时候,谁都觉得自己的未来闪闪发光,不是吗?但是一旦长大,没有一件事会遂自己心愿. --<被嫌弃的松子的一生> 目录 一.前言 二.往期作品回顾 三.作品介绍 四.本期代码介绍 五.效果显 ...
最新文章
- get,put,post,delete含义与区别
- session outline for different culture
- 利用Inotify和Rsync将webproject文件自己主动同步到多台应用server
- java object 引用类型_java中的四种引用类型
- JVM实用参数(八)GC日志
- Base PyQt4, Simple Web APP Framwork
- 一、策略模式(Strategy Pattern)
- Mysql高级之游标
- LBS由ip查经纬度
- es6继承 vs js原生继承(es5)
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-2.中大型公司里面项目开发流程讲解...
- 简单高效的短链接生成服务C#实现
- docker入门、docker基本命令
- 浅析Vue源码(二)—— initMixin(上)
- 三分求单峰/单谷函数极值
- ORACLE SQL 优化的若干方法详细
- 江南大学物联网工程学院数据库课程实验一作业1实验报告
- Python爬虫实战案例讲解——爬虫爬取地铁线路图
- Javascript 与 或 非 符号
- 数值越界mysql_Mysql数据读取越界问题