运动物体检测与跟踪——累积权重构建背景模型

本文介绍了一种通过建立背景模型进行运动物体检测的方法,并详细解释了动态背景模型的构建过程及其实现代码。

运动物体检测与跟踪中的帧差分法,除了相邻帧差分法和三帧差分法外,还有一种差分方法,可以通过建立不含前景的背景模型,用当前帧和背景模型做差,差值就可以体现运动物体大概的位置和大小信息。

相比相邻帧差分法和三帧差分法,背景模型做差法可以较为完整的体现运动物体的整体轮廓,运动物体的双重轮廓、“鬼影”、空洞现象改善明显,下文的对比效果可以看到这一点。


但背景模型的选取和建立的要求条件也更为苛刻:


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<vector<Point>> contours;  
		vector<Vec4i> hierarchy;  
		findContours(imageFront,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point());    
		for(int i=0;i<contours.size();i++)  
		{ 
			//绘制轮廓的最小外结矩形  
			RotatedRect rect=minAreaRect(contours[i]);  
			Point2f P[4];  
			rect.points(P);  
			for(int j=0;j<=3;j++)  
			{  
				line(image,P[j],P[(j+1)%4],Scalar(0,0,255),2);  
			}         
		}  
		imshow("Video",image);  
		imshow("Detection",imageFront);   
		imshow("背景模型",imageBackground);		
	}  
	return 0;
}



检测效果1:



效果2:



效果3:




### SAM 2 模型架构详解 SAM 2 是 Meta 推出的第二代“分割任意物体模型”,其核心目标是在视频和图像领域实现高效的可提示视觉分割任务(Promptable Visual Segmentation, PVS)。相比第一代 SAM 模型,SAM 2 不仅提升了静态图像分割的速度和精度,还在动态视频场景中表现出更高的鲁棒性和效率。 #### 架构设计 SAM 2 的主要创新在于引入了一个强大的 **数据引擎**,该引擎显著增强了模型训练数据之间的互动能力。这一机制使得 SAM 2 能够更好地适应复杂环境下的分割需求,例如处理视频中的运动、变形和遮挡等问题[^2]。 具体来说,SAM 2 的架构可以分为以下几个部分: 1. **编码器模块**: 编码器负责提取输入图像或视频帧的空间特征。它基于 Transformer 或卷积神经网络构建,能够捕捉全局上下文信息并生成高维特征表示。 2. **解码器模块**: 解码器接收来自编码器的特征图以及用户的提示信号(Prompts),并通过多层注意力机制生成最终的像素级掩膜预测。这种端到端的设计允许用户灵活指定感兴趣区域的位置或其他约束条件。 3. **时间一致性建模**: 针对视频分割任务,SAM 2 增加了一种专门的时间一致性建模组件。此模块利用跨帧关联性来稳定对象跟踪过程,并减少因快速移动而导致的误差累积现象。 4. **大规模预训练策略**: 利用新创建的大规模可提示视频分割数据集进行监督学习,从而赋予模型更强泛化能力和更低的人工干预成本。 --- ### 应用场景分析 由于具备卓越的技术特性,SAM 2 已经被广泛应用于多个实际领域之中。以下是几个典型的应用实例及其优势描述: #### 1. 医疗影像分析 牛津大学研究小组开发出了 Medical SAM 2 版本,在三维医学成像方面取得了突破性的成果。通过对 BTCV 数据集中多种器官结构的成功分离验证表明,MedSAM-2 显著超越了许多传统方法如 nnU-Net 和 TransUNet 等的表现水平[Dice Score 衡量标准下][^3]。这为临床诊断提供了更加精准可靠的工具支持。 #### 2. 自动驾驶感知系统 自动驾驶汽车需要实时理解周围环境变化情况,而 SAM 2 可以为此类应用提供高质量的目标检测服务。凭借出色的抗干扰特性和较低延迟响应速度,它可以有效识别道路上行人、车辆以及其他障碍物轮廓边界线位置关系。 #### 3. 影视后期制作 影视行业中经常涉及到绿幕抠图或者特效合成操作,这些工作往往耗时费力且容易出现瑕疵。借助 SAM 2 提供的强大语义理解功能,则可以让整个流程变得更加自动化高效完成。 #### 4. AR/VR 场景重建 增强现实(AR)/虚拟现实(VR)技术依赖于精确的地图绘制算法才能营造出身临其境般的沉浸体验感。因此采用 SAM 2 来辅助完成室内室外空间布局规划就显得尤为重要了——无论是家具摆放还是地形地貌模拟都能达到令人满意的效果质量水准之上。 --- ```python import torch from segment_anything import sam_model_registry, SamPredictor device = "cuda" if torch.cuda.is_available() else "cpu" model_type = "vit_h" # 加载 SAM 2 模型权重文件路径需替换为你本地保存地址 checkpoint_path = "./sam_vit_h_4b8939.pth" sam = sam_model_registry[model_type](checkpoint=checkpoint_path).to(device) predictor = SamPredictor(sam) image = cv2.imread("example.jpg") # 替换为目标图片名称 predictor.set_image(image) input_point = np.array([[500, 375]]) # 用户定义的兴趣点坐标 input_label = np.array([1]) # 对应标签类别编号 masks, scores, logits = predictor.predict( point_coords=input_point, point_labels=input_label, multimask_output=True, ) ``` 上述代码片段展示了如何加载并运行 SAM 2 模型以执行简单的交互式分割任务。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值