1. 基本原理
BSM适用于背景不变的情况下。
2. 相关API
3. 代码演示
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture capture;
capture.open("E:/技能学习/Opencv视频分析与对象跟踪/video_003.avi");
if (!capture.isOpened())
{
cout << "could not find the video file..." << endl;
return -1;
}
Mat frame;
Mat bsmaskMOG2, bsmaskKNN;
namedWindow("input video", WINDOW_AUTOSIZE);
namedWindow("MOG2", WINDOW_AUTOSIZE);
namedWindow("KNN", WINDOW_AUTOSIZE);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
//图像分割(GMM - 高斯混合模型)背景建模
Ptr<BackgroundSubtractor>pMOG2 = createBackgroundSubtractorMOG2();
//机器学习(KNN - K个最近邻)背景建模
Ptr<BackgroundSubtractor>pKNN = createBackgroundSubtractorKNN();
while (capture.read(frame))
{
imshow("input video", frame);
//MOG BS
pMOG2->apply(frame, bsmaskMOG2);
morphologyEx(bsmaskMOG2, bsmaskMOG2, MORPH_OPEN, kernel, Point(-1, -1)); //形态学开操作
imshow("MOG2", bsmaskMOG2);
//KNN BS mask
pKNN->apply(frame, bsmaskKNN, -1);
imshow("KNN", bsmaskKNN);
char c = waitKey(50);
if (c == 27)
{
break;
}
}
capture.release();
waitKey(0);
destroyAllWindows();
return 0;
}