Fixed an issue with weight assignment causing the resulting GMM weights to be unsorte...
authorFirat Kalaycilar <fkalaycilar@gmail.com>
Tue, 18 Mar 2014 15:26:24 +0000 (17:26 +0200)
committerFirat Kalaycilar <fkalaycilar@gmail.com>
Tue, 18 Mar 2014 15:26:24 +0000 (17:26 +0200)
modules/gpu/src/cuda/bgfg_mog.cu
modules/ocl/src/opencl/bgfg_mog.cl

index 89ad5ff..055c9e0 100644 (file)
@@ -489,7 +489,7 @@ namespace cv { namespace gpu { namespace device
             {
                 //need only weight if fit is found
                 float weight = alpha1 * gmm_weight(mode * frame.rows + y, x) + prune;
-
+                int swap_count = 0;
                 //fit not found yet
                 if (!fitsPDF)
                 {
@@ -540,6 +540,7 @@ namespace cv { namespace gpu { namespace device
                             if (weight < gmm_weight((i - 1) * frame.rows + y, x))
                                 break;
 
+                            swap_count++;
                             //swap one up
                             swap(gmm_weight, 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--;
                 }
 
-                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;
             }
 
index 6a95316..a7479b9 100644 (file)
@@ -376,7 +376,7 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob
         for (int mode = 0; mode < nmodes; ++mode)
         {
             float _weight = alpha1 * weight[(mode * frame_row + y) * weight_step + x] + prune;
-
+            int swap_count = 0;
             if (!fitsPDF)
             {
                 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])
                             break;
+                        swap_count++;
                         swap(weight, x, y, i - 1, frame_row, weight_step);
                         swap(variance, x, y, i - 1, frame_row, var_step);
                         #if defined (CN1)
@@ -421,7 +422,7 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob
                 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;
         }