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;
}
