//shadow detection performed per pixel
// should work for rgb data, could be usefull for gray scale and depth data as well
// See: Prati,Mikic,Trivedi,Cucchiarra,"Detecting Moving Shadows...",IEEE PAMI,2003.
CV_INLINE int _icvRemoveShadowGMM(float* data, int nD,
unsigned char nModes,
CvPBGMMGaussian* pGMM,
float m_fTb,
float m_fTB,
float m_fTau)
{
float tWeight = 0;
float numerator, denominator;
// check all the components marked as background:
for (int iModes=0;iModes<nModes;iModes++)
{
CvPBGMMGaussian g=pGMM[iModes];
numerator = 0.0f;
denominator = 0.0f;
for (int iD=0;iD<nD;iD++)
{
numerator += data[iD] * g.mean[iD];
denominator += g.mean[iD]* g.mean[iD];
}
// no division by zero allowed
if (denominator == 0)
{
return 0;
};
float a = numerator / denominator;
// if tau < a < 1 then also check the color distortion
if ((a <= 1) && (a >= m_fTau))
{
float dist2a=0.0f;
for (int iD=0;iD<nD;iD++)
{
float dD= a*g.mean[iD] - data[iD];
dist2a += (dD*dD);
}
if (dist2a<m_fTb*g.variance*a*a)
{
return 2;
}
};
tWeight += g.weight;
if (tWeight > m_fTB)
{
return 0;
};
};
return 0;
}
shadow detection in opencv code
最新推荐文章于 2024-02-07 22:12:37 发布