📄 sgm.cpp
字号:
// GM.cpp: implementation of the GM class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "sGM.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
float ALPHA = (float)0.002;
sGM::sGM()
// : ALPHA(0.01)
{
m_mean = NULL;
match=false;
}
sGM::~sGM()
{
if(m_mean != NULL)
{
delete []m_mean;
}
}
void sGM::Init(BYTE size, float *mean)
{
m_size = size;
m_mean = new float[size];
ASSERT(m_mean != NULL);
memcpy(m_mean, mean, size * sizeof(float));
m_variance = 20;
m_weight = 1.0;
m_wfore=0;
m_time &= 0;
}
void sGM::Init(float *mean, float weight)
{
memcpy(m_mean, mean, m_size * sizeof(float));
m_variance = 20;
m_weight = weight;
m_wfore=1-m_weight;
m_background = false;
m_time &= 0;
}
BOOL sGM::IsValid(float *value, float &distance)
{
/*
int i, j;
distance = 0.0;
for(i=j=0; i<m_size; i++)
{
float diff = fabs(value[i] - m_mean[i]);
if(diff > 2.5 * m_variance)
{
j++;//return false;
}
distance += diff * diff;
}
if(j > 1) return false;
else return true;
*/
///*
distance = 0.0;
for(int i=0; i<m_size; i++)
{
float diff = (float)fabs(value[i] - m_mean[i]);
if(diff > 2.5 * m_variance)
{
return false;
}
distance += diff * diff;
}
return true;
//*/
}
void sGM::Update(void)
{
m_weight *= (1 - ALPHA);
m_wfore = m_wfore * (1 - ALPHA) + ALPHA;
}
void sGM::Update(float *value, float &distance)
{
m_weight = m_weight * (1 - ALPHA) + ALPHA;
m_wfore *= (1 - ALPHA);
float ratio = ALPHA / m_weight;
for(int i=0; i<m_size; i++)
{
m_mean[i] = m_mean[i] * (1 - ratio) + value[i] * ratio;
}
m_variance = (float)sqrt(m_variance * m_variance * (1 - ratio) + distance * ratio);
//if(m_variance < 5.0)//限制方差的最小值
//{
// m_variance = 5.0;
//}
}
void sGM::Init_Update(float *value, float &distance)
{
m_weight = (float)(m_weight + 1.0);
for(int i=0; i<m_size; i++)
{
m_mean[i] += (value[i] - m_mean[i]) / m_weight;
}
m_variance = m_variance * m_variance;
m_variance += (distance - m_variance) / m_weight;
m_variance = (float)sqrt(m_variance);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -