Merge pull request #2473 from euphrat:mog2_weight_bugfix

pull/2490/merge
Roman Donchenko 11 years ago committed by OpenCV Buildbot
commit 68c57a1e82
  1. 5
      modules/gpu/src/cuda/bgfg_mog.cu
  2. 5
      modules/ocl/src/opencl/bgfg_mog.cl
  3. 5
      modules/video/src/bgfg_gaussmix2.cpp

@ -489,7 +489,7 @@ namespace cv { namespace gpu { namespace device
{ {
//need only weight if fit is found //need only weight if fit is found
float weight = alpha1 * gmm_weight(mode * frame.rows + y, x) + prune; float weight = alpha1 * gmm_weight(mode * frame.rows + y, x) + prune;
int swap_count = 0;
//fit not found yet //fit not found yet
if (!fitsPDF) if (!fitsPDF)
{ {
@ -540,6 +540,7 @@ namespace cv { namespace gpu { namespace device
if (weight < gmm_weight((i - 1) * frame.rows + y, x)) if (weight < gmm_weight((i - 1) * frame.rows + y, x))
break; break;
swap_count++;
//swap one up //swap one up
swap(gmm_weight, x, y, i - 1, frame.rows); swap(gmm_weight, x, y, i - 1, frame.rows);
swap(gmm_variance, x, y, i - 1, frame.rows); swap(gmm_variance, x, y, i - 1, frame.rows);
@ -557,7 +558,7 @@ namespace cv { namespace gpu { namespace device
nmodes--; nmodes--;
} }
gmm_weight(mode * frame.rows + y, x) = weight; //update weight by the calculated value gmm_weight((mode - swap_count) * frame.rows + y, x) = weight; //update weight by the calculated value
totalWeight += weight; totalWeight += weight;
} }

@ -376,7 +376,7 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob
for (int mode = 0; mode < nmodes; ++mode) for (int mode = 0; mode < nmodes; ++mode)
{ {
float _weight = alpha1 * weight[(mode * frame_row + y) * weight_step + x] + prune; float _weight = alpha1 * weight[(mode * frame_row + y) * weight_step + x] + prune;
int swap_count = 0;
if (!fitsPDF) if (!fitsPDF)
{ {
float var = variance[(mode * frame_row + y) * var_step + x]; float var = variance[(mode * frame_row + y) * var_step + x];
@ -404,6 +404,7 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob
{ {
if (_weight < weight[((i - 1) * frame_row + y) * weight_step + x]) if (_weight < weight[((i - 1) * frame_row + y) * weight_step + x])
break; break;
swap_count++;
swap(weight, x, y, i - 1, frame_row, weight_step); swap(weight, x, y, i - 1, frame_row, weight_step);
swap(variance, x, y, i - 1, frame_row, var_step); swap(variance, x, y, i - 1, frame_row, var_step);
#if defined (CN1) #if defined (CN1)
@ -421,7 +422,7 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob
nmodes--; nmodes--;
} }
weight[(mode * frame_row + y) * weight_step + x] = _weight; //update weight by the calculated value weight[((mode - swap_count) * frame_row + y) * weight_step + x] = _weight; //update weight by the calculated value
totalWeight += _weight; totalWeight += _weight;
} }

@ -319,7 +319,7 @@ struct MOG2Invoker : ParallelLoopBody
for( int mode = 0; mode < nmodes; mode++, mean_m += nchannels ) for( int mode = 0; mode < nmodes; mode++, mean_m += nchannels )
{ {
float weight = alpha1*gmm[mode].weight + prune;//need only weight if fit is found float weight = alpha1*gmm[mode].weight + prune;//need only weight if fit is found
int swap_count = 0;
//// ////
//fit not found yet //fit not found yet
if( !fitsPDF ) if( !fitsPDF )
@ -384,6 +384,7 @@ struct MOG2Invoker : ParallelLoopBody
if( weight < gmm[i-1].weight ) if( weight < gmm[i-1].weight )
break; break;
swap_count++;
//swap one up //swap one up
std::swap(gmm[i], gmm[i-1]); std::swap(gmm[i], gmm[i-1]);
for( int c = 0; c < nchannels; c++ ) for( int c = 0; c < nchannels; c++ )
@ -401,7 +402,7 @@ struct MOG2Invoker : ParallelLoopBody
nmodes--; nmodes--;
} }
gmm[mode].weight = weight;//update weight by the calculated value gmm[mode-swap_count].weight = weight;//update weight by the calculated value
totalWeight += weight; totalWeight += weight;
} }
//go through all modes //go through all modes

Loading…
Cancel
Save