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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章