나는 링크 코드는opencv에서 구현 된 그림자 탐지 코드 작업을 설명 하시겠습니까?
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;
}
내가 각 픽셀의 RGB 채널입니다 가정합니다 nchannels입니다 Here
입니다있는 그림자 감지 OpenCV의 구현 코드를 이해하려고 노력하고 있습니다. dist2a, 분자 및 분모가 무엇인지 확신 할 수 없습니다. 전경과 배경이있을 수 있지만 왜 우리는 '데이터와 평균'과 '평균과 평균'을 곱합니까? 여기에 구현 된 논문은 지 코빅 (Zivkovic)이다. "백그라운드 감산을위한 적응 형 가우시안 혼합 모델 개선", 영국, 2004 년 8 월
논리는 다음과 같습니다. RGB 색 공간에서 E는 각 픽셀 i에 대한 배경과 전경을 나타냅니다. E와 I 사이의 강도 차이는 (a) = (Ii-aEi)^2에 의해 주어진 'a'를 최소화함으로써 계산됩니다. 그리고 색차는 CDi = | Ii-aEi | 값이 임계 값 내에 있으면 픽셀이 그림자로 분류됩니다.
로직을 코드와 매핑하십시오.