BackgroundSubtractor算法
- 图像分割(GMM-高斯混合模型)
当前帧 - 背景模型 -> 阈值 = 前景图像
BackgroundSubtractorMOG2 - 机器学习(KNN-K个最近邻)//有学习过程
BackgroundSubtractorKNN
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
VideoCapture capture;
capture.open("../path.avi");
if (!capture.isOpened())
{
cout << "could not load video..." << endl;
return -1;
}
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));//形态学操作kernel
//①图像分割(GMM-高斯混合模型)
Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
Mat BackgroundSbutractoMaskMOG2;
//②机器学习(KNN-K个最近邻)
Ptr<BackgroundSubtractor> pkNN = createBackgroundSubtractorKNN();
Mat BackgroundSbutractoMaskKNN;
Mat frame;
namedWindow("Video_demo", WINDOW_AUTOSIZE);
while (capture.read(frame))
{
imshow("Video_demo", frame);
pMOG2->apply(frame, BackgroundSbutractoMaskMOG2);
//形态学操作//去图像噪声
morphologyEx(BackgroundSbutractoMaskMOG2, BackgroundSbutractoMaskMOG2, MORPH_OPEN, kernel, Point(-1, -1));
//pkNN->apply(frame, BackgroundSbutractoMaskKNN);
imshow("MOG2", BackgroundSbutractoMaskMOG2);
//imshow("KNN", BackgroundSbutractoMaskKNN);
char c = waitKey(50);
if (c == 27)
{
break;
}
}
capture.release();
waitKey(0);
return 0;
}
输出结果: