Opencv学习笔记(九)背景消除建模(BSM)

在我们使用Opencv进行视频处理跟踪对象时,我们通常可以借助视频原先的背景与当前的获取帧进行比较,通过一定的比较方法和API,我们可以有效地区分开视频中的背景和前景。这种方法我们称为背景减除(Background Subtraction)。

在这里插入图片描述

我们在比较背景和当前帧时,通常采用两种算法:图像分割GMM-高斯混合模型)和机器学习KNN-K邻值算法

高斯混合模型分离算法:

将图像分为3-5个高斯模型,一个像素点来了,如果该像素点离任何一个高斯模型的距离大于其2倍的标准差,则为前景即运动物体,否则则是背景

使用API:BackgroundSubtractorMOG2

使用步骤:

1、构造高斯混合模型
Ptr pMOG2 = createBackgroundSubtractorMOG2();

2、定义矩阵(size表示矩阵的大小)
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

3、进行拟合
ptrMOG2->apply(frame, bgMask_MOG2);

TOP:为了使效果更佳,我们可以对得到的拟合结果进行降噪。

代码演示:

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

using namespace cv;
using namespace std;

int main(int argc, char**) 
{
 VideoCapture capture(0);
 if (!capture.isOpened())
  {
  printf("could not find the video file...\n");
  return -1;
 }
 Mat frame;
 Mat bsmaskMOG2, bsmaskKNN;
 namedWindow("input video", WINDOW_AUTOSIZE);
 namedWindow("MOG2", WINDOW_AUTOSIZE);
 
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
while (capture.read(frame))
 {
     imshow("input video", frame);
     pMOG2->apply(frame, bsmaskMOG2);
     imshow("MOG2", bsmaskMOG2);
     char c = waitKey(100);
     if (c == 27) {
     break;
  }
 }
 capture.release();
 waitKey(0);
 return 0;
}

效果展示:

初始背景帧:

在这里插入图片描述

而当我们伸手被电脑摄像头捕捉到时:

在这里插入图片描述

K最近邻分类算法(KNN算法)

数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

使用API:BackgroundSubtractorKNN

使用方法与上述一致,这里不作详细介绍。
1、Ptr pKNN = createBackgroundSubtractorKNN();

2、Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

3、pKNN->apply(frame, bsmaskKNN);

希望对读者有所帮助,喜欢的话可以关注一下我的公众号,我会把学习笔记发在上面,大家可以一起共同学习!

在这里插入图片描述
Alt

发布了15 篇原创文章 · 获赞 10 · 访问量 3932
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章