/*********************** Sort Gaussian model by 'weight / sigma' End ****************************/
/*********************** Create new Gaussian component Start ****************************/
if(num_fit == GMM_MAX_COMPONT && 0 == m_weight[GMM_MAX_COMPONT - 1].at<float>(i, j))
{
//if there is no exit component fit,then start a new component
//当有新值出现的时候,若目前分布个数小于M,新添一个分布,以新采样值作为均值,并赋予较大方差和较小权值
for(int k = 0 ; k < GMM_MAX_COMPONT; k++)
{
if(0 == m_weight[k].at<float>(i, j))
{
m_weight[k].at<float>(i, j) = GMM_LEARN_ALPHA;
m_mean[k].at<uchar>(i, j) = _image.at<uchar>(i, j);
m_sigma[k].at<float>(i, j) = 15.0;
//normalization the weight,let they sum to 1
for(int q = 0; q < GMM_MAX_COMPONT && q != k; q++)
{
//对其他的高斯模型的权值进行更新,保持权值和为1
/****update the other unfit's weight,u and sigma remain unchanged****/
m_weight[q].at<float>(i, j) *= (1 - GMM_LEARN_ALPHA);
}
break; //找到第一个权值不为0的即可
}
}
}
else if(num_fit == GMM_MAX_COMPONT && m_weight[GMM_MAX_COMPONT -1].at<float>(i, j) != 0)
{
//如果GMM_MAX_COMPONT都曾经赋值过,则用新来的高斯代替权值最弱的高斯,权值不变,只更新均值和方差
m_mean[GMM_MAX_COMPONT-1].at<uchar>(i, j) = _image.at<uchar>(i, j);