在我們使用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);
希望對讀者有所幫助,喜歡的話可以關注一下我的公衆號,我會把學習筆記發在上面,大家可以一起共同學習!