opencv 前景检测

Improved Background-Foreground Segmentation Methods

https://blog.csdn.net/Anderson_Y/article/details/82082095

sample

// bgfp vtest.avi
#include "opencv2/bgsegm.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/core/utility.hpp>
#include <iostream>

using namespace cv;
using namespace cv::bgsegm;

const String about =
    "\nA program demonstrating the use and capabilities of different background subtraction algorithms\n"
    "Using OpenCV version " + String(CV_VERSION) +
    "\n\nPress 'c' to change the algorithm"
    "\nPress 'm' to toggle showing only foreground mask or ghost effect"
    "\nPress 'n' to change number of threads"
    "\nPress SPACE to toggle wait delay of imshow"
    "\nPress 'q' or ESC to exit\n";

const String algos[7] = { "GMG", "CNT", "KNN", "MOG", "MOG2", "GSOC", "LSBP" };

static Ptr<BackgroundSubtractor> createBGSubtractorByName(const String& algoName)
{
    Ptr<BackgroundSubtractor> algo;
    if(algoName == String("GMG"))
        algo = createBackgroundSubtractorGMG(20, 0.7);
    else if(algoName == String("CNT"))
        algo = createBackgroundSubtractorCNT();
    else if(algoName == String("KNN"))
        algo = createBackgroundSubtractorKNN();
    else if(algoName == String("MOG"))
        algo = createBackgroundSubtractorMOG();
    else if(algoName == String("MOG2"))
        algo = createBackgroundSubtractorMOG2();
    else if(algoName == String("GSOC"))
        algo = createBackgroundSubtractorGSOC();
    else if(algoName == String("LSBP"))
        algo = createBackgroundSubtractorLSBP();

    return algo;
}

int main(int argc, char** argv)
{
    CommandLineParser parser(argc, argv, "{@video | vtest.avi | path to a video file}");
    parser.about(about);
    parser.printMessage();

    String videoPath = samples::findFile(parser.get<String>(0),false);

    Ptr<BackgroundSubtractor> bgfs = createBGSubtractorByName(algos[0]);

    VideoCapture cap;
    cap.open(videoPath);

    if (!cap.isOpened())
    {
        std::cerr << "Cannot read video. Try moving video file to sample directory." << std::endl;
        return -1;
    }

    Mat frame, fgmask, segm;

    int delay = 0;
    int algo_index = 0;
    int nthreads = getNumberOfCPUs();
    bool show_fgmask = false;

    for (;;)
    {
        cap >> frame;

        if (frame.empty())
        {
            cap.set(CAP_PROP_POS_FRAMES, 0);
            cap >> frame;
        }

        bgfs->apply(frame, fgmask);

        if (show_fgmask)
            segm = fgmask;
        else
        {
            frame.convertTo(segm, CV_8U, 0.5);
            add(frame, Scalar(100, 100, 0), segm, fgmask);
        }

        putText(segm, algos[algo_index], Point(10, 30), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255), 2, LINE_AA);
        putText(segm, format("%d threads", nthreads), Point(10, 60), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255), 2, LINE_AA);

        imshow("FG Segmentation", segm);

        int c = waitKey(delay);

        if (c == ' ')
            delay = delay == 30 ? 1 : 30;

        if (c == 'c' || c == 'C')
        {
            algo_index++;
            if ( algo_index > 6 )
                 algo_index = 0;

            bgfs = createBGSubtractorByName(algos[algo_index]);
        }

        if (c == 'n' || c == 'N')
        {
            nthreads++;
            if ( nthreads > 8 )
                 nthreads = 1;

            setNumThreads(nthreads);
        }

        if (c == 'm' || c == 'M')
            show_fgmask = !show_fgmask;

        if (c == 'q' || c == 'Q' || c  == 27)
            break;

    }

    return 0;
}

算法

GMG

Geometric Multigid

Andrew B Godbehere, Akihiro Matsukawa, and Ken Goldberg. Visual tracking of human visitors under variable-lighting conditions for a responsive audio art installation. In American Control Conference (ACC), 2012, pages 4305–4312. IEEE, 2012.

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.228.1735&rep=rep1&type=pdf

MOG2

MOG2用的是自适应的高斯混合模型(Adaptive GMM,Gaussian Mixture Model)

CNT

Background subtraction based on counting

在高配设备中于MOG2一样快,在低配设备中的速度是MOG2的两倍(树莓派Pi3)。