opencv2.3混合高斯模型背景显示

ps:我很久没有上csdn了,同时这篇文章是我一年前弄得,现在很多忘了。对于各位朋友碰到的问题,不能一一解答表示抱歉。重新说一句:这个代码是基于opencv2.3版本(具体版本我忘了)实现的,并且一定能行!如果你们有问题,请你们先确定一下opencv的版本。还有后续opencv版本的更新中,貌似支持显示背景了。你们可以尝试不使用updateBackground这个函数,这个函数是用来更新背景的。2013.4.27

--------------------------------------------------------------------------------------------------------------


相信许多朋友多用过了opencv2.3版本中的混合高斯模型,大部分人可能多碰到了这样一个问头,2.3版本中的,混合高斯模型,不能读取模型建立的背景。

我上网搜了一下,发现了解决方法(这篇文章算不上原创啦大笑)。

这是中文提示的网站http://blog.pzxbc.com/?p=176,该文中所提及的解决方法来自外国网站https://code.ros.org/trac/opencv/ticket/317

接下来就是我在vs2010下编好的代码,一定能跑!

#include<stdio.h>
#include<cv.h>
#include<cxcore.h>
#include<highgui.h>
#include<cvaux.h>
typedef struct MyCvGaussBGValues
{
    float match_sum;
    float weight;
    float mean[3];
    float variance[3];
}
MyCvGaussBGValues;

static void updateBackground(CvGaussBGModel* bg_model){
    int K = bg_model->params.n_gauss;
    int nchannels = bg_model->background->nChannels;
    int height = bg_model->background->height;
    int width = bg_model->background->width;
    MyCvGaussBGValues *g_point = (MyCvGaussBGValues *) ((CvMat*)(bg_model->g_point))->data.ptr;
    MyCvGaussBGValues *mptr = g_point;

    for(int y=0; y<height; y++){
        for (int x=0; x<width; x++, mptr+=K){
			int pos = bg_model->background->widthStep*y + x*nchannels;
            float mean[3] = {0.0, 0.0, 0.0};

            for(int k=0; k<K; k++){
                for(int m=0; m<nchannels; m++){
                    mean[m] += mptr[k].weight * mptr[k].mean[m];
                }
            }

            for(int m=0; m<nchannels; m++){
                bg_model->background->imageData[pos+m] = (uchar) (mean[m]+0.5);
            }
        }
    }
}
int main(int argc,char **argv){
	IplImage *pFrame=NULL;
	IplImage *pFrImg=NULL;
	IplImage *pBkImg=NULL;
	CvCapture *pCapture=NULL;
	CvBGStatModel *bg_model=NULL;
	int nFrmNum=0;
	//int region_count=0;
	
	cvNamedWindow("video",1);
	cvNamedWindow("background",1);
	cvNamedWindow("foreground",1);
	cvMoveWindow("video",30,0);
	cvMoveWindow("background",450,0);
	cvMoveWindow("foreground",900,0);
	pCapture=cvCaptureFromFile(argv[1]);
	while(pFrame=cvQueryFrame(pCapture)){
		nFrmNum++;
		if(nFrmNum==1){
			pBkImg=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,3);
			pFrImg=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);
			bg_model=(CvBGStatModel*)cvCreateGaussianBGModel(pFrame,0);
		}
		else{
			cvUpdateBGStatModel(pFrame,(CvBGStatModel*)bg_model);
			updateBackground((CvGaussBGModel*)bg_model);
			cvClearMemStorage(bg_model->storage);
    		cvCopy(bg_model->foreground,pFrImg,0);
			cvCopy(bg_model->background,pBkImg,0);
		}
		cvShowImage("video",pFrame);
		cvShowImage("background",pBkImg);
		cvShowImage("foreground",pFrImg);
		if(cvWaitKey(22)>=0)
			break;
	}
  
	cvReleaseBGStatModel((CvBGStatModel**)&bg_model);
	cvDestroyAllWindows();
	cvReleaseImage(&pFrImg);
	cvReleaseImage(&pBkImg);
	cvReleaseCapture(&pCapture);
	return 0;
}


评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值