⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmoriginal.cpp

📁 动态场景中运动目标检测提取与跟踪 对新手很有用
💻 CPP
字号:
#include "GMOriginal.h"
#include <math.h>
#include "gmm.h"

/*
 *用来建立最初的GMM模型,所有w是平均分配的,gama[i]=1
*/
GMOriginal::GMOriginal()
{
	w=1.0/K;//a small w
	wf=1.0/K;
	for(int i=0;i<3;i++)
	{
		u[i]=0;
		this->gama=1;
	}
	newGMM=false;
}
/*
 *用来建立一个新加入的GM模型,所有w是一个较小的值,gama[i]是一个较大的值V0
*/
GMOriginal::GMOriginal(int xt[3])
{
	w=0.05;//a small w
	wf=0.95;
	for(int i=0;i<3;i++)
	{
		u[i]=xt[i];
		this->gama=V0;
	}
	newGMM=true;
}
GMOriginal::~GMOriginal()
{

}
void GMOriginal::initdata()
{
	//for(int i=0;i<=2;i++)
	//{
		gama=1;
	//}
	w=1.0/K;
}
/**
 * update w if the model is not a match
 */
void GMOriginal::updateData()
{
	w=(1-ALPHA)*w;
}
/**
 *update all the data if a model is a match
 */
void GMOriginal::updateData(int* xt)
{
	if(xt!=NULL)
	{
		w=(1-ALPHA)*w+ALPHA;
		update_u_gama(xt,3);
		//update_gama(xt,3);
	}
	else
	{
		AfxMessageBox("in updateData(int *xt),the xt is null");
	}
}
/**
 * update u, the mean value
 *@param xt the current pixel value
 */
bool GMOriginal::update_u_gama(int* xt,int length)
{
	ASSERT(xt!=NULL);
	//int* u_return=new int[length];
	//vectorMulNum(1-ALPHA,u,u_return,length);
	//int* x_tmp=new int[length];
	//vectorMulNum(ALPHA,xt,x_tmp,length);
	for(int i=0;i<length;i++)
	{
		u[i]=(int)((1-ALPHA)*u[i]+ALPHA*xt[i]);
	}

	double gama_tmp=0.3*abs(xt[0]-u[0])+0.59*abs(xt[1]-u[1])+0.11*abs(xt[2]-u[2]);
	gama=(1-ALPHA)*gama+(ALPHA*gama_tmp*gama_tmp);
	//gama=gama*gama;
	//delete [] x_tmp;
//	delete [] u_return;

	return true;
}
double GMOriginal::update_wf(bool b)
{
	if(b)
	{
		wf=(1-ALPHA)*wf+ALPHA;
	}
	else
	{
		wf=(1-ALPHA)*wf;
	}
		return wf;
}
/**
 * update gama, the variance value
 *@param xt the current pixel value
 */
bool GMOriginal::update_gama(int* xt, int length)
{
	/*ASSERT(xt!=NULL);
	double* gama_return=new double[length];	
	vectorMulNum(1-ALPHA,gama,gama_return,length);
	int* tmp=new int [length];
	vectorSub(xt,u,tmp,length);
	double* gama_tmp=new double[length];
	vectorMul(tmp,tmp,gama_tmp,length);
	
	double* Mul_tmp=new double[length];
	vectorMulNum(ALPHA,gama_tmp,Mul_tmp,length);
	vectorAdd(gama_return,Mul_tmp,gama,length);

	delete [] gama_return;
	delete [] tmp;
	delete [] gama_tmp;
	delete [] Mul_tmp;*/
	double gama_tmp=0.3*(xt[0]-u[0])+0.59*(xt[1]-u[1])+0.11*(xt[3]-u[3]);
	gama=(1-ALPHA)*gama+(ALPHA*gama_tmp*gama_tmp);
	
	return true;

}

GMOriginal& GMOriginal::operator = (GMOriginal& g)
{
	for(int i=0;i<3;i++)
	{
		this->u[i]=g.u[i];
	}
	this->gama=g.gama;
	this->newGMM=g.newGMM;
	this->w=g.w;
	return *this;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -