📄 gm.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 + -