Opencv--背景消除建模(BSM)
在opencv中有兩種方法可以進行背景消除:
其一、基於機器學習(Knn--K個最近鄰)背景消除建模
其一、基於圖像分割(GMM,抗干擾圖像分割)背景消除建模
BS ,Background Subtraction
相關API
1、BackgroundSubtractor
2、BackgroundSubtractorMOG2 圖像分割方法
3、BackgroundSubtractorKNN 機器學習(Knn)最近鄰方法
具體代碼和效果圖如下:
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main(int argc, char** argv) { VideoCapture capture; capture.open("D:/software/opencv1/picture/vtest.avi"); if (!capture.isOpened()) { printf("could not load the video!"); return -1; } Mat frame; Mat bsmaskMOG2,bsmaskKNN; namedWindow("input video", CV_WINDOW_AUTOSIZE); namedWindow("MOG2 Model",CV_WINDOW_AUTOSIZE); namedWindow("kKNNoutput Model", CV_WINDOW_AUTOSIZE); Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1)); //初始化BS Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2(); Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN(); while (capture.read(frame)) { imshow("input video", frame); // MOG BS pMOG2->apply(frame, bsmaskMOG2); //形態學操作--開操作,去除小的噪聲morphologyEx() morphologyEx(bsmaskMOG2, bsmaskMOG2, MORPH_OPEN, kernel, Point(-1, -1)); imshow("MOG2 Model", bsmaskMOG2); // KNN BS mask pKNN->apply(frame, bsmaskKNN); imshow("KNNoutput Model", bsmaskKNN); char c = waitKey(100); if (c == 27) { break; } } capture.release(); waitKey(0); return 0; }
其中MOG2 實現方法運用了形態學操作--開操作,去除小的噪聲,用到一個API,morphologyEx(),可以去除一些視頻中的干擾。
兩種方法都能夠有效的將背景去除掉,從而顯示圖像的動態變化情況。目前還沒有很清楚這兩者之間到底更適用於什么場景,以后遇到再加以分析。