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

📄 gm.cpp

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

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

}
void GM::initdata()
{
	for(int i=0;i<=2;i++)
	{
		gama[i]=1;
	}
	w=1.0/K;
}
/**
 * update w if the model is not a match
 */
void GM::updateData()
{
	w=(1-ALPHA)*w;
}
/**
 *update all the data if a model is a match
 */
void GM::updateData(int* xt)
{
	if(xt!=NULL)
	{
		w=(1-ALPHA)*w+ALPHA;
		update_u(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 GM::update_u(int* xt,int length)
{
	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]=u_return[i]+x_tmp[i];
	}
	delete [] x_tmp;
	delete [] u_return;

	return true;
}
/**
 * update gama, the variance value
 *@param xt the current pixel value
 */
bool GM::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;
	
	return true;

}

GM& GM::operator = (GM& g)
{
	for(int i=0;i<3;i++)
	{
		this->gama[i]=g.gama[i];
		this->u[i]=g.u[i];
	}
	this->newGMM=g.newGMM;
	this->w=g.w;
	return *this;
	
}
double vector_zhiji(double* x1,double* x2,int length)
{
	ASSERT(x1!=NULL && x2!=NULL);
	double tmp=0;
	for(int i=0;i<length;i++)
	{
		tmp+=x1[i]*x2[i];
	}

	return tmp;

}
double vector_zhiji(double* x1, int* x2, int length)
{
	ASSERT(x1!=NULL && x2!=NULL);
	double tmp=0;
	for(int i=0;i<length;i++)
	{
		tmp+=x1[i]*x2[i];
	}
	
	return tmp;
}
bool vectorSqrt(double* gm, double* gm_return,int length)
{
   ASSERT(gm!=NULL && gm_return!=NULL);
   for(int i=0;i<length;i++)
   {
	   gm_return[i]=sqrt(fabs(gm[i]));
   }

   return true;
}
bool vectorAdd(double* xt, double* u, double* add_return, int length)
{
	ASSERT(xt!=NULL && u!=NULL && add_return!=NULL);
	for(int i=0;i<length;i++)
	{
		add_return[i]=xt[i]+u[i];
	}

	return true;
}
bool vectorSub(int* xt, int* u, int* sub_return, int length)
{
	ASSERT(xt!=NULL && u!=NULL && sub_return!=NULL);
	for(int i=0;i<length;i++)
	{
		sub_return[i]=abs(xt[i]-u[i]);
	}
	
	return true;
}
bool vectorMul(double* vec1, double* vec2, double* mul_return, int length)
{
	ASSERT(vec1!=NULL && vec2!=NULL && mul_return!=NULL);
	for(int i=0;i<length;i++)
	{
		mul_return[i]=vec1[i]*vec2[i];
	}
	
	return true;

}
bool vectorMul(int* vec1, double* vec2, double* mul_return, int length)
{
	ASSERT(vec1!=NULL && vec2!=NULL && mul_return!=NULL);
	for(int i=0;i<length;i++)
	{
		mul_return[i]=vec1[i]*vec2[i];
	}
	
	return true;

}
bool vectorMul(int* vec1,int* vec2, double* mul_return, int length)
{
	ASSERT(vec1!=NULL && vec2!=NULL && mul_return!=NULL);
	for(int i=0;i<length;i++)
	{
		mul_return[i]=(double)vec1[i]*vec2[i];
	}
	
	return true;

}
bool vectorMulNum(double num, int* vec, int* mul_return,int length)
{
	ASSERT(vec!=NULL && mul_return!=NULL);
	for(int i=0;i<length;i++)
	{
		mul_return[i]=(int)(num*vec[i]);
	}
	
	return true;

}
bool vectorMulNum(double num, double* vec, double* mul_return,int length)
{
	ASSERT(vec!=NULL && mul_return!=NULL);
	for(int i=0;i<length;i++)
	{
		mul_return[i]=num*vec[i];
	}
	
	return true;
}
bool getDoubleVector(int* vec, double* vec_return, int length)
{
	ASSERT(vec!=NULL && vec_return!=NULL);
	for(int i=0;i<length;i++)
	{
		vec_return[i]=(double)vec[i];
	}

	return true;
}



⌨️ 快捷键说明

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