Browse Source

ConvolutionFeature: using HSV color space

Sven Sickert 10 years ago
parent
commit
800acc0da8
1 changed files with 61 additions and 29 deletions
  1. 61 29
      features/fpfeatures/ConvolutionFeature.cpp

+ 61 - 29
features/fpfeatures/ConvolutionFeature.cpp

@@ -9,6 +9,7 @@
 
 #include "ConvolutionFeature.h"
 #include "vislearning/cbaselib/FeaturePool.h"
+#include "vislearning/baselib/cc.h"
 
 using namespace OBJREC;
 
@@ -121,27 +122,42 @@ NICE::Vector ConvolutionFeature::getFeatureVector( const Example *example ) cons
 
     int halfwsx = std::floor ( window_size_x / 2 );
     int halfwsy = std::floor ( window_size_y / 2 );
-    int numChannels = img->channels();
+    int step = window_size_x*window_size_y;
 
     int k = 1;
-    for ( int c = 0; c < numChannels; c++ )
-        for ( int v = -halfwsy; v <= halfwsy; v++ )
-            for ( int u = -halfwsx; u <= halfwsx; u++, k++ )
+    for ( int v = -halfwsy; v <= halfwsy; v++ )
+        for ( int u = -halfwsx; u <= halfwsx; u++, k++ )
+        {
+            int uu = u;
+            int vv = v;
+            if (x+u < 0 || x+u >= xsize) uu=-u;
+            if (y+v < 0 || y+v >= ysize) vv=-v;
+
+            if ( x+uu > 0
+                 && x+uu < xsize
+                 && y+vv > 0
+                 && y+vv < ysize
+                 && k < vec.size() )
             {
-                int uu = u;
-                int vv = v;
-                if (x+u < 0 || x+u >= xsize) uu=-u;
-                if (y+v < 0 || y+v >= ysize) vv=-v;
-
-                if ( x+uu > 0
-                     && x+uu < xsize
-                     && y+vv > 0
-                     && y+vv < ysize
-                     && k < vec.size() )
+                if (isColor)
+                {
+                    // using HSV color space
+                    double h,s,v;
+                    double r = img->get(x+uu,y+vv,0);
+                    double g = img->get(x+uu,y+vv,1);
+                    double b = img->get(x+uu,y+vv,2);
+
+                    ColorConversion::ccRGBtoHSV(r, g, b, &h, &s, &v);
+                    vec[k] = h;
+                    vec[k+step] = s;
+                    vec[k+step+step] = v;
+                }
+                else
                 {
-                    vec[k] = img->get(x+uu,y+vv,c);
+                    vec[k] = img->get(x+uu,y+vv);
                 }
             }
+        }
 
     return vec;
 }
@@ -200,26 +216,42 @@ double ConvolutionFeature::val ( const Example *example ) const
 
     int halfwsx = std::floor ( window_size_x / 2 );
     int halfwsy = std::floor ( window_size_y / 2 );
-    int numChannels = img->channels();
+    int step = window_size_x*window_size_y;
 
     int k = 1;
-    for ( int c = 0; c < numChannels; c++ )
-        for ( int v = -halfwsy; v <= halfwsy; v++ )
-            for ( int u = -halfwsx; u <= halfwsx; u++, k++ )
+    for ( int v = -halfwsy; v <= halfwsy; v++ )
+        for ( int u = -halfwsx; u <= halfwsx; u++, k++ )
+        {
+            int uu = u;
+            int vv = v;
+            if (x+u < 0 || x+u >= xsize) uu=-u;
+            if (y+v < 0 || y+v >= ysize) vv=-v;
+            if ( x+uu > 0
+                 && x+uu < xsize
+                 && y+vv > 0
+                 && y+vv < ysize
+                 && k < beta->size() )
             {
-                int uu = u;
-                int vv = v;
-                if (x+u < 0 || x+u >= xsize) uu=-u;
-                if (y+v < 0 || y+v >= ysize) vv=-v;
-                if ( x+uu > 0
-                     && x+uu < xsize
-                     && y+vv > 0
-                     && y+vv < ysize
-                     && k < beta->size() )
+                if (isColor)
                 {
-                    val1 += (double)img->get(x+uu,y+vv,c) * beta->operator [](k);
+                    // using HSV color space
+                    double h,s,v;
+                    double r = img->get(x+uu,y+vv,0);
+                    double g = img->get(x+uu,y+vv,1);
+                    double b = img->get(x+uu,y+vv,2);
+
+                    ColorConversion::ccRGBtoHSV(r, g, b, &h, &s, &v);
+                    val1 += h * beta->operator [](k);
+                    val1 += s * beta->operator [](k+step);
+                    val1 += v * beta->operator [](k+step+step);
                 }
+                else
+                {
+                    val1 += (double)img->get(x+uu,y+vv) * beta->operator [](k);
+                }
+
             }
+        }
 
     return val1;
 }