解释在 opencv 中实现的阴影检测代码的工作原理?
Explain the working of shadow detection code implemented in opencv?
我试图理解在 opencv 中实现的阴影检测代码 link Here
密码是
detectShadowGMM(const float* data, int nchannels, int nmodes,
const GMM* gmm, const float* mean,
float Tb, float TB, float tau)
{
float tWeight = 0;
// check all the components marked as background:
for( int mode = 0; mode < nmodes; mode++, mean += nchannels )
{
GMM g = gmm[mode];
float numerator = 0.0f;
float denominator = 0.0f;
for( int c = 0; c < nchannels; c++ )
{
numerator += data[c] * mean[c];
denominator += mean[c] * mean[c];
}
// no division by zero allowed
if( denominator == 0 )
return false;
// if tau < a < 1 then also check the color distortion
if( numerator <= denominator && numerator >= tau*denominator )
{
float a = numerator / denominator;
float dist2a = 0.0f;
for( int c = 0; c < nchannels; c++ )
{
float dD= a*mean[c] - data[c];
dist2a += dD*dD;
}
if (dist2a < Tb*g.variance*a*a)
return true;
};
tWeight += g.weight;
if( tWeight > TB )
return false;
};
return false;
}
我假设的 nchannels 是每个像素的 rgb 通道。我不确定 dist2a、分子和分母是什么。前景和背景可能是,但为什么我们要乘以 'data and mean' 和 'mean and mean'。这里实现的论文是 Zivkovic。 “用于背景减除的改进自适应高斯混合模型”,国际模式识别会议,英国,2004 年 8 月,
逻辑是:在 RGB 颜色中 space E 代表背景,I 代表每个像素 i 的前景。 E 和 I 之间的强度差异是通过最小化 (a) = (Ii-aEi)^2 给出的 'a' 来计算的
色差由 CDi = |Ii-aEi| 给出
如果值在阈值内,则像素被分类为阴影。
This image will better explain it
请帮我用代码映射逻辑。
论文中解释了实现
一种实时鲁棒背景减除和阴影检测的统计方法
经过
Thanarat Horprasert 大卫·哈伍德 拉里·S·戴维斯
存在于上述论文的参考文献中。
下面的link显示了用于实现的公式。
Click here for image
我试图理解在 opencv 中实现的阴影检测代码 link Here
密码是
detectShadowGMM(const float* data, int nchannels, int nmodes,
const GMM* gmm, const float* mean,
float Tb, float TB, float tau)
{
float tWeight = 0;
// check all the components marked as background:
for( int mode = 0; mode < nmodes; mode++, mean += nchannels )
{
GMM g = gmm[mode];
float numerator = 0.0f;
float denominator = 0.0f;
for( int c = 0; c < nchannels; c++ )
{
numerator += data[c] * mean[c];
denominator += mean[c] * mean[c];
}
// no division by zero allowed
if( denominator == 0 )
return false;
// if tau < a < 1 then also check the color distortion
if( numerator <= denominator && numerator >= tau*denominator )
{
float a = numerator / denominator;
float dist2a = 0.0f;
for( int c = 0; c < nchannels; c++ )
{
float dD= a*mean[c] - data[c];
dist2a += dD*dD;
}
if (dist2a < Tb*g.variance*a*a)
return true;
};
tWeight += g.weight;
if( tWeight > TB )
return false;
};
return false;
}
我假设的 nchannels 是每个像素的 rgb 通道。我不确定 dist2a、分子和分母是什么。前景和背景可能是,但为什么我们要乘以 'data and mean' 和 'mean and mean'。这里实现的论文是 Zivkovic。 “用于背景减除的改进自适应高斯混合模型”,国际模式识别会议,英国,2004 年 8 月,
逻辑是:在 RGB 颜色中 space E 代表背景,I 代表每个像素 i 的前景。 E 和 I 之间的强度差异是通过最小化 (a) = (Ii-aEi)^2 给出的 'a' 来计算的 色差由 CDi = |Ii-aEi| 给出 如果值在阈值内,则像素被分类为阴影。 This image will better explain it
请帮我用代码映射逻辑。
论文中解释了实现 一种实时鲁棒背景减除和阴影检测的统计方法 经过 Thanarat Horprasert 大卫·哈伍德 拉里·S·戴维斯 存在于上述论文的参考文献中。
下面的link显示了用于实现的公式。 Click here for image