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(),可以去除一些视频中的干扰。

两种方法都能够有效的将背景去除掉,从而显示图像的动态变化情况。目前还没有很清楚这两者之间到底更适用于什么场景,以后遇到再加以分析。

猜你喜欢

转载自www.cnblogs.com/xiaodai-blog0110/p/10003466.html