赞
踩
当观察场景的是一个固定的相机,背景几乎保持不变。在这种情况下,感兴趣的元素是在场景中运动的物体。我们将这些运动的物体称为前景,为了提取出这些前景物体,我们需要对背景建模,然后将当前帧的模型与背景模型进行比较,以检测前景物体。
运动前景对象的有效检测对于对象跟踪、目标分类、行为理解等后期处理至关重要。区分前景对象,关键的一个问题是:确定一个非常合适的背景。背景从象素的角度来理解,每一个象素就是有可能是前景点,也有可能是背景点,那么我们就要防止背景中误进入原属于前景点的对象,目前有几种常用的方法,但分别有利弊。
设定一个阈值, ∣ f r a m e ( i ) − b a c k g r o u n d ( i ) ∣ > T h |frame(i)-background(i)|>Th ∣frame(i)−background(i)∣>Th。由于背景是预先设定的固定的一幅图像,这里必然引入了四个问题:光照变化,摄像机抖动,高频率振荡背景,运动转静止物体的干扰。
优点:计算简单,易于实现。
缺点:摄象头要绝对静止,而且不适应光照变化。
∣ f r a m e ( i ) − f r a m e ( i − 1 ) ∣ > T h |frame(i) - frame(i-1)| > Th ∣frame(i)−frame(i−1)∣>Th,背景就是上一帧图像。每一帧与上一帧进行差分运算。提取效果显然与运动前景对象的速度和帧率有关(帧率指一秒钟有几张图片)。扩展下,建立在统计模型基础上的有选择的背景建模,实际上就是混合高斯法。
优点:速度较快,稳定性较好。
缺点:可能出现物体的“空洞现象”,空洞是由于某一大型运动物体,它的两帧之间存在象素十分接近的重合部分,所以导致这部分被差分剪去了。
基于混合高斯模型的自适应背景差分算法,类似于帧间差分法,使用混合高斯分布模型来表征图像帧中每一个像素点的特征,当获取新的图像帧时,适时更新混合高斯分布模型,某一时刻选取混合高斯模型中的一个子集表征当前背景,如果当前图像帧的某个像素点与混合高斯模型的背景子集匹配,则判定为背景,否则判定为前景点。总体来说是通过学习与训练计算出有没有运动对象时的背景。
在概念上略为复杂,在连续图像序列看成为有二维空间加上时间构成的三维空间,然后计算每一像点在各个时空梯度上的分量,最后通过高斯滤波平滑这些时空梯度分量得到运动能量。由于运动对象所包含的那些象素点基本上都是朝一个方向运动,国此这一方向上的运动能量较大。运动能量法能够消除杂乱运动的影响,检测出真正的运动对象。
优点:利于一些背景中存在振荡现象、规律性摆动的前景对象,如水波,树叶。
缺点:只能大概估计真正运动前景对象的位置,难以精确提取运动对象。
光流法概念源自光流场,当运动物体的影象在表面上的模式运动就是所谓的光流场,是一个二维速度场。而光流法根据连续多帧图像序列,计算各象素点运动的大小和方向,它反映了图像上每一像素点灰度的变化趋势。
优点:不需要背景建模,在无法预先获得场景的任何信息的情况下,也能够检测出独立的运动对象。
缺点:计算复杂,往往需要特殊的硬件支持,很难满足实时性要求。
准确提取前景对象之后,是如何来适当的方法来表示前景对象,为下一步的跟踪做准备:
A. 对象可以用点来描述。如质心或者点集。一般来说点适合描述在图像中占用比例较小的对象。大的对象容易被肢解为多个对象,或者多个对象被合并为一个质点。
B. 原始的几何形状,实际使用中,通常使用矩形来表示。用这种方法来存储对象,表示简单,但是丢失对象原有信息,对噪声比较敏感。
C. 用精确的对象轮廓来进行跟踪,这对于复杂轮廓的对象存储比较困难,并不实用。
void bgDetected() { Mat frame; Mat fgMaskMOG2; //创建背景前景分割基类对象 Ptr<BackgroundSubtractor> pMog2; int keyBboard=0; //采用基于高斯混合的背景/前景分割算法实现前景后景分割。 pMog2 = createBackgroundSubtractorMOG2(); //从自带的摄像头读取视频 VideoCapture cap(0); if (!cap.isOpened()) { cout << "can't open the video。" << endl; } while (char(keyBboard)!='q'&&(char)keyBboard!=27) { if (!cap.read(frame)) { cout << "can't read the next frame" << endl; } //采用基于混合高斯的算法计算前景蒙版 pMog2->apply(frame, fgMaskMOG2); imshow("frame", frame); //显示前景蒙版 imshow("fg mask mog2", fgMaskMOG2); if ((char)keyBboard != 's') { Mat imgTmp = fgMaskMOG2; Mat fgMaskMOG2_ip = imgTmp.clone(); imshow("dst", fgMaskMOG2_ip); fgMaskMOG2_ip.release(); } keyBboard = waitKey(30); } cap.release(); }
学习:
Opencv 自带提取前景(背景建模)
OpenCV学习笔记(二十九)——视频前景的提取Video
视频前景目标提取(一)
【计算机视觉】提取视频中的前景物体
opencv关于图像前景提取
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。