1. 程式人生 > >opencv3/C++視訊背景去除建模(BSM)

opencv3/C++視訊背景去除建模(BSM)

視訊背景建模主要使用到:

高斯混合模型(Mixture Of Gauss,MOG)

createBackgroundSubtractorMOG2(int history=500, double varThreshold=16,bool detectShadows=true);

K最近鄰(k-NearestNeighbor,kNN)

createBackgroundSubtractorKNN(int history=500, double dist2Threshold=400.0, bool detectShadows=true);

history:history的長度。
varThreshold:畫素和模型之間馬氏距離的平方的閾值。
detectShadows:預設為true,檢測陰影並標記它們(影子會被標記為灰色)。 會降低了部分速度。

例項:

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
    VideoCapture capture;
    capture.open("E:/image/01.avi");
    if(!capture.isOpened())
    {
        printf("can not open video file   \n");
        return -1;
    }
    Mat frame;
    namedWindow("input", CV_WINDOW_AUTOSIZE);
    namedWindow("MOG2"
, CV_WINDOW_AUTOSIZE); namedWindow("KNN", CV_WINDOW_AUTOSIZE); Mat maskMOG2, maskKNN; Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2(500,25,true); Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN(); Mat kernel = getStructuringElement(MORPH_RECT, Size(5
,5)); while (capture.read(frame)) { imshow("input", frame); pMOG2->apply(frame, maskMOG2); pKNN->apply(frame, maskKNN); //對處理後的幀進行開操作,減少視訊中較小的波動造成的影響 morphologyEx(maskMOG2,maskMOG2, MORPH_OPEN, kernel, Point(-1,-1)); morphologyEx(maskKNN,maskKNN, MORPH_OPEN, kernel, Point(-1,-1)); imshow("MOG2", maskMOG2); imshow("KNN", maskKNN); waitKey(3); } capture.release(); return 0; }

視訊中移動的玻璃球:
這裡寫圖片描述
MOG分離出的小球區域:
這裡寫圖片描述
KNN分離出的小球區域:
這裡寫圖片描述