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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM