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

📄 sgm.cpp

📁 动态场景中运动目标检测提取与跟踪 对新手很有用
💻 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 + -