shadow detection in opencv code

来源:互联网 发布:囚徒健身软件 编辑:程序博客网 时间:2024/05/29 18:15
//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;}