2015-01-20 1 views
0

나는 링크 코드는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 | 값이 임계 값 내에 있으면 픽셀이 그림자로 분류됩니다.

로직을 코드와 매핑하십시오.

답변

0

구현은 용지 상기 용지의 기준으로 존재 Thanarat Horprasert 데이비드 우드 래리 S. 데이비스 의해 실시간 강력한 배경 차감 및 그림자 검출하기위한 통계적 접근 방식을 설명한다.

아래 링크는 구현에 사용되는 수식을 보여줍니다. Click here for image

관련 문제