高斯混合模型

混合高斯模型用多个高斯分布的加权平均来平滑地近似任意形状的密度分布函数。

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv/cvaux.hpp>
using namespace std;

int main()
{
    IplImage *pFrame=NULL;
    IplImage *pFrImg=NULL;
    IplImage *pBkImg=NULL;
    CvCapture *pCapture=NULL;
    pCapture= cvCreateFileCapture("video.avi");

    cvNamedWindow("video",1);
    cvNamedWindow("background",1);
    cvNamedWindow("foreground",1);
    cvMoveWindow("video",30,0);
    cvMoveWindow("background",450,0);
    cvMoveWindow("foreground",900,0);

    CvGaussBGStatModelParams* params = new CvGaussBGStatModelParams;
    params->win_size=2;
    params->n_gauss=5;
    params->bg_threshold=0.7;
    params->std_threshold=3.5;
    params->minArea=15;
    params->weight_init=0.05;
    params->variance_init=30;

    pFrame=cvQueryFrame(pCapture);
    CvBGStatModel * bg_model = cvCreateGaussianBGModel(pFrame ,params);

    int nFrmNum=0;
    while(pFrame=cvQueryFrame(pCapture))
    {
        nFrmNum++;
        if(nFrmNum==1)
        {
            pBkImg=cvCreateImage(cvSize(pFrame->width, pFrame->height),IPL_DEPTH_8U,3);
            pFrImg=cvCreateImage(cvSize(pFrame->width, pFrame->height),IPL_DEPTH_8U,3);
        }
        else
        {
            cvUpdateBGStatModel(pFrame,bg_model);
            pFrImg=bg_model->foreground;
            pBkImg=bg_model->background;
            cvShowImage("video",pFrame);
            cvShowImage("background",pBkImg);
            cvShowImage("foreground",pFrImg);

        }

        if(cvWaitKey(22)>=0)
            break;
    }

    cvReleaseBGStatModel(&bg_model);
    cvDestroyAllWindows();
    cvReleaseImage(&pFrImg);
    cvReleaseImage(&pBkImg);
    cvReleaseCapture(&pCapture);
    return 0;
}

 程序运行结果:

可以看到,background无法显示,http://blog.pzxbc.com/?p=176中提供了解决方法,不过没有成功啊魂淡!

原文地址:https://www.cnblogs.com/juaner767/p/3678804.html