#include <iostream>

#include "vislearning/features/localfeatures/sift.h"
#include "vislearning/features/localfeatures/LocalFeatureOpponnentSift.h"

using namespace OBJREC;
using namespace std;
using namespace NICE;

LocalFeatureOpponnentSift::LocalFeatureOpponnentSift ( const Config *conf ) : LocalFeatureRGBSift ( conf )
{
}

LocalFeatureOpponnentSift::~LocalFeatureOpponnentSift()
{
}

int LocalFeatureOpponnentSift::getDescriptors ( const NICE::ColorImage & cimg,
    VVector & positions,
    VVector & descriptors ) const
{
  NICE::ColorImage opimg ( cimg.width(), cimg.height() );

  for ( int y = 0; y < ( int ) cimg.height(); y++ )
  {
    for ( int x = 0; x < ( int ) cimg.width(); x++ )
    {
      // Farbkanaele auslesen
      int r = cimg.getPixel ( x, y, 0 );
      int g = cimg.getPixel ( x, y, 1 );
      int b = cimg.getPixel ( x, y, 2 );

      // Transformation in den Opponent Farbraum nach Van de Sande
      int o1 = ( int ) ( ( ( double ) ( r - g ) + 255.0 ) / 2.0 );
      int o2 = ( int ) ( ( ( double ) ( r + g - b ) + 510.0 ) / 4.0 );
      int o3 = ( int ) ( ( double ) ( r + g + b ) / 3.0 );

      opimg.setPixel ( x, y, o1, o2, o3 );
    }
  }

  return LocalFeatureRGBSift::getDescriptors ( opimg, positions, descriptors );
}
