OpenCV视频篇——背景/前景提取

一、前景提取

当观察场景的是一个固定的相机,背景几乎保持不变。在这种情况下,感兴趣的元素是在场景中运动的物体。我们将这些运动的物体称为前景,为了提取出这些前景物体,我们需要对背景建模,然后将当前帧的模型与背景模型进行比较,以检测前景物体。

运动前景对象的有效检测对于对象跟踪、目标分类、行为理解等后期处理至关重要。区分前景对象,关键的一个问题是:确定一个非常合适的背景。背景从象素的角度来理解,每一个象素就是有可能是前景点,也有可能是背景点,那么我们就要防止背景中误进入原属于前景点的对象,目前有几种常用的方法,但分别有利弊。

1. 固定背景提取法

设定一个阈值, f r a m e ( i ) b a c k g r o u n d ( i ) > T h |frame(i)-background(i)|>Th 。由于背景是预先设定的固定的一幅图像,这里必然引入了四个问题:光照变化,摄像机抖动,高频率振荡背景,运动转静止物体的干扰。

优点:计算简单,易于实现。
缺点:摄象头要绝对静止,而且不适应光照变化。

2. 根据视频序列动态建立背景

1)均值法、中值法、滑动均值滤波、单高斯
2)帧间差分法

f r a m e ( i ) f r a m e ( i 1 ) > T h |frame(i) - frame(i-1)| > Th ,背景就是上一帧图像。每一帧与上一帧进行差分运算。提取效果显然与运动前景对象的速度和帧率有关(帧率指一秒钟有几张图片)。扩展下,建立在统计模型基础上的有选择的背景建模,实际上就是混合高斯法。

优点:速度较快,稳定性较好。
缺点:可能出现物体的“空洞现象”,空洞是由于某一大型运动物体,它的两帧之间存在象素十分接近的重合部分,所以导致这部分被差分剪去了。

3)混合高斯法

基于混合高斯模型的自适应背景差分算法,类似于帧间差分法,使用混合高斯分布模型来表征图像帧中每一个像素点的特征,当获取新的图像帧时,适时更新混合高斯分布模型,某一时刻选取混合高斯模型中的一个子集表征当前背景,如果当前图像帧的某个像素点与混合高斯模型的背景子集匹配,则判定为背景,否则判定为前景点。总体来说是通过学习与训练计算出有没有运动对象时的背景。

4)能量分析法

在概念上略为复杂,在连续图像序列看成为有二维空间加上时间构成的三维空间,然后计算每一像点在各个时空梯度上的分量,最后通过高斯滤波平滑这些时空梯度分量得到运动能量。由于运动对象所包含的那些象素点基本上都是朝一个方向运动,国此这一方向上的运动能量较大。运动能量法能够消除杂乱运动的影响,检测出真正的运动对象。

优点:利于一些背景中存在振荡现象、规律性摆动的前景对象,如水波,树叶。
缺点:只能大概估计真正运动前景对象的位置,难以精确提取运动对象。

5)光流法

光流法概念源自光流场,当运动物体的影象在表面上的模式运动就是所谓的光流场,是一个二维速度场。而光流法根据连续多帧图像序列,计算各象素点运动的大小和方向,它反映了图像上每一像素点灰度的变化趋势

优点:不需要背景建模,在无法预先获得场景的任何信息的情况下,也能够检测出独立的运动对象。
缺点:计算复杂,往往需要特殊的硬件支持,很难满足实时性要求。

6) codebook 码本模型

准确提取前景对象之后,是如何来适当的方法来表示前景对象,为下一步的跟踪做准备:

   A. 对象可以用点来描述。如质心或者点集。一般来说点适合描述在图像中占用比例较小的对象。大的对象容易被肢解为多个对象,或者多个对象被合并为一个质点。

   B. 原始的几何形状,实际使用中,通常使用矩形来表示。用这种方法来存储对象,表示简单,但是丢失对象原有信息,对噪声比较敏感。

   C. 用精确的对象轮廓来进行跟踪,这对于复杂轮廓的对象存储比较困难,并不实用。

二、前景提取

1. 与前景提取有关的类

OpenCV视频篇——背景/前景分割类

2. 举例

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关于图像前景提取

背景建模与前景检测(一)——混合高斯GMM

OpenCV—python 视频分析背景提取与前景提取

发布了182 篇原创文章 · 获赞 81 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_41498261/article/details/103633583