目标检测(一):背景差分法

 

       目标检测是将运动的物体从背景中检测出来,人们希望设计能适用于各种监控环境,不受光照、天气等外界因素影响的目标检测算法。但这种算法难免复杂度大,现有一些算法大多是针对某一类问题提出的,主要包括背景减法、相邻帧差法和光流法等

1.1背景减法

       背景减法(backgroundsubtraction)是目前运动目标检测的主流方法,其基本思想是将当前每一帧图像与事先存储或实时获取的背景图像相减,计算出与背景偏离超过一定阀值的区域作为运动区域。该算法实现简单,相减结果直接给出目标的位置、大小、形状等信息,能够提供关于运动目标区域的完整描述,特别是对于摄像机静止的情况,背景减法是实现运动目标实时检测和提取的首选方法。
       背景减法实现的关键是背景模型的获取和更新。背景获取算法通常要求在场景中存在运动目标的情况下获取背景图像,更新过程使背景能够适应场景的各种变化和干扰,如外界光线的改变,背景中对象的扰动和固定对象的移动,阴影的影响等。一种典型的背景建模方法是用混合高斯模型描述背景图像像素值的分布,目标检测过程中判断图像的当前像素值是否符合该分布,若是被判为前景点,否则为背景点。同时根据新获取的图像,对背景图像参数进行自适应更新。该方法能够可靠处理光照变化、背景混乱运动的干扰以及长时间的场景变化等。在此基础上,对背景、静止目标和运动目标三者采取不同的更新策略,以减弱背景更新过程中运动目标对背景的影响。

1.2 BS算法

   OpenCV提供的BS算法:

  • 图像分割(GMM - 高斯混合模型)
  • 机器学习(KNN - K个最近邻)

   以下代码将通过GMM和KNN两种方法,实现了实时检测运动目标效果的对比。

代码:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
	VideoCapture cap(0);

	if (!cap.isOpened())
	{
		printf("\nCan not open camera \n");
		return -1;
	}
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

	// intialization BS
	Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
   //Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN();

	Mat tmp_frame;
	Mat bsmaskMOG2, bsmaskKNN;

	for (;;)
	{
		cap >> tmp_frame;
		if (tmp_frame.empty())
			break;
		// MOG BS
		pMOG2->apply(tmp_frame, bsmaskMOG2);
		morphologyEx(bsmaskMOG2, bsmaskMOG2, MORPH_OPEN, kernel, Point(-1, -1));
		imshow("MOG2", bsmaskMOG2);

		// KNN BS mask
		//pKNN->apply(tmp_frame, bsmaskKNN);
		//imshow("KNN Model", bsmaskKNN);

		imshow("video", tmp_frame);
		
		char keycode = (char)waitKey(30);//按ESC推出
		if (keycode == 27)
			break;
	}
	cap.release();
	return 0;
}

  

  • 4
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!运动目标检测是计算机视觉中的重要任务之一。背景是一种常用的运动目标检测之一,其基本原理是通过比较当前帧图像与背景模型的异来识别出运动目标。 在MATLAB中,你可以使用以下步骤来实现基于背景的运动目标检测: 1. 首先,建立一个背景模型。这可以通过采集一段静态视频或者从静态图像序列中选择一些帧作为背景图像来实现。你需要将这些背景图像取平均或者进行其他合适的操作来得到一个背景模型。 2. 加载视频帧或图像序列,并将当前帧与背景模型进行分。你可以使用`imabsdiff`函数来计算两幅图像的异。 3. 对分结果进行阈值处理,以得到二值图像。你可以使用`im2bw`函数将分结果转换成二值图像,并设定适当的阈值。 4. 对二值图像进行形态学运算,以去除噪声并连接相邻区域。你可以使用`imopen`和`imclose`函数来进行开运算和闭运算操作。 5. 根据目标特征对二值图像中的连通区域进行检测和分析。你可以使用`regionprops`函数获取连通区域的属性,例如面积、边界框等。 以上是背景在MATLAB中的基本流程。当然,你还可以根据实际需求进行适当的优化和改进,例如应用自适应背景更新、使用多帧背景模型等方来提高检测效果和鲁棒性。希望对你有所帮助!如有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值