OpenCV学习之路(五)——BSM背景差分法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kilotwo/article/details/88887333

背景差分基本原理

在这里插入图片描述

Opencv–背景消除建模(BSM)

背景差分法相对于帧间差分法来说,虽可以克服“空洞”的现象,提取出的运动目标轮廓也较完整,但它对场景中光线的变化特别敏感,背景更新相对较慢,存在物体的动静转换产生“鬼影”等问题。
BS ,Background Subtraction 背景消除
在opencv中有两种方法可以进行背景消除:
其一、基于机器学习(KNN–K个最近邻)背景消除建模
其二、基于图像分割(GMM,高斯混合模型抗干扰图像分割)背景消除建模

相关API

  1. BackgroundSubtractor

  2. BackgroundSubtractorMOG2 图像分割方法

  3. BackgroundSubtractorKNN 机器学习(KNN)最近邻方法

其中GMM法可以有效抗噪,防止每帧之间微弱变化带来的噪声影响。

代码实现

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	VideoCapture capture;
	capture.open("video.avi");
	if (!capture.isOpened())
	{
		printf("Open ERROR!\n");
		return -1;
	}
	Mat frame;
	Mat bsmaskMOG2;
	double FPS = capture.get(CV_CAP_PROP_FPS);
	printf("FPS:%f",FPS);
	namedWindow("Origin Video", CV_WINDOW_AUTOSIZE);
	namedWindow("BSM Video", CV_WINDOW_AUTOSIZE);
	Ptr<BackgroundSubtractor>pMOG2 = createBackgroundSubtractorMOG2();
	while (capture.read(frame))
	{
		
		//cvtColor(frame, gray, COLOR_BGR2GRAY);
		//threshold(gray, bin, 0, 255, THRESH_BINARY | THRESH_OTSU);
		imshow("Origin Video", frame);
		pMOG2->apply(frame, bsmaskMOG2);
		imshow("BSM Video", bsmaskMOG2);
		
		char c  =	waitKey(100);//100ms 返回值为当前键盘按键值 ESC ASCII码是27
	if (c == 27)
		{
		break;
		}
	}
	waitKey(0);
	return 0;
}

在这里插入图片描述

对视频进行形态学滤波处理

  • 开运算,即为先腐蚀后膨胀的过程,可以用来消除小物体(类似椒盐噪声,噪点),在纤细点处分离物体,并且在平滑较大物体的边界时不明显改变面积。
  • 闭运算,先膨胀后腐蚀的过程称为闭运算,闭运算能够排除小型黑洞(黑色区域)。
    morphologyEx(bsmaskMOG2, bsmaskMOG2, MORPH_OPEN, element);
    输入图像,输出图像,形态学变换方法,运算内核
    运算内核的创建
    Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
    内核的形状,尺寸

形态学滤波后代码实现

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	VideoCapture capture;
	capture.open("video.avi");
	if (!capture.isOpened())
	{
		printf("Open ERROR!\n");
		return -1;
	}
	Mat frame;
	Mat bsmaskMOG2;
	double FPS = capture.get(CV_CAP_PROP_FPS);
	printf("FPS:%f",FPS);
	namedWindow("Origin Video", CV_WINDOW_AUTOSIZE);
	namedWindow("BSM Video", CV_WINDOW_AUTOSIZE);
	Ptr<BackgroundSubtractor>pMOG2 = createBackgroundSubtractorMOG2();
	//定义核
	Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));

	while (capture.read(frame))
	{
		
		//cvtColor(frame, gray, COLOR_BGR2GRAY);
		//threshold(gray, bin, 0, 255, THRESH_BINARY | THRESH_OTSU);
		imshow("Origin Video", frame);
		pMOG2->apply(frame, bsmaskMOG2);
		//进行形态学操作
		morphologyEx(bsmaskMOG2, bsmaskMOG2, MORPH_OPEN, element);
		imshow("BSM Video", bsmaskMOG2);
		
		char c  =	waitKey(100);//100ms 返回值为当前键盘按键值 ESC ASCII码是27
	if (c == 27)
		{
		break;
		}
	}
	waitKey(0);
	return 0;
}

在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页