1. 程式人生 > >Opencv之背景消除建模(BSM)

Opencv之背景消除建模(BSM)

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(),可以去除一些視訊中的干擾。

兩種方法都能夠有效的將背景去除掉,從而顯示影象的動態變化情況。目前還沒有很清楚這兩者之間到底更適用於什麼場景,以後遇到再加以分析。