opencv提供两种BS算法:
1.基于图像分割(GMM-高斯混合模型);
2.机器学习(KNN-K近邻)。
下面是基于以上两种BS算法的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture capture;
capture.open("1.avi");
if(!capture.isOpened())
{
cout << "could not find the video file ..." << endl;
return -1;
}
Mat frame;
Mat bsmaskMOG2;
Mat bsmaskKNN;
namedWindow("input video", CV_WINDOW_AUTOSIZE);
namedWindow("MOG2", CV_WINDOW_AUTOSIZE);
namedWindow("KNN", CV_WINDOW_AUTOSIZE);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));//形态学开操作
//init BS
Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN();
while(capture.read(frame))
{
imshow("input video", frame);
//BSM MOG
pMOG2->apply(frame, bsmaskMOG2);
morphologyEx(bsmaskMOG2, bsmaskMOG2, MORPH_OPEN,kernel, Point(-1, -1));//形态学开操作去噪点
imshow("MOG2", bsmaskMOG2);
//BSM KNN
pKNN->apply(frame, bsmaskKNN);
morphologyEx(bsmaskKNN, bsmaskKNN, MORPH_OPEN,kernel, Point(-1, -1));//形态学开操作去噪点
imshow("KNN", bsmaskKNN);
char c = waitKey(100);
if(c == 27)
{
break;
}
}
capture.release();
waitKey(0);
return 0;
}