#ifndef GRAYMODULE_H
#define GRAYMODULE_H

#include "imagesource.h"
extern "C"
{
  #include <opencv/highgui.h>
}

namespace seemicro
{

/**
  * Wandelt eventuelles RGB-Bild in src
  * in ein Graystufenbild in img um.
  * Falls src schon ein Graustufenbild ist,
  * wird es kopiert (langsam!).
  */
struct GrayModule : public ImageSource
{
  ImageSource *src;

  GrayModule(ImageSource *As) : src(As)
  {
    img = cvCreateImage(cvSize(src->img->width, src->img->height),
      IPL_DEPTH_8U, 1);
  }

  ~GrayModule()
  {
    cvReleaseImage(&img);
  }

  void processFrame(myrect *ROI)
  {
    myrect ROI2;
    if(!ROI) ROI2 = myrect(0, 0, src->img->width, src->img->height);
    else ROI2 = *ROI;
    // Eingabeausschnitt
    CvMat ausschnitt1;
    cvGetSubRect(src->img, &ausschnitt1, ROI2);

    // Zielausschnitt
    CvMat ausschnitt2;
    cvGetSubRect(img, &ausschnitt2, ROI2);

    if(src->img->nChannels==1)
    {
      // GrayModule sollte nicht in der Modulliste sein!
      cvCopy(src->img, img);
      return;
    }

    cvConvertImage(&ausschnitt1, &ausschnitt2);

#ifdef DEBUG
    if(DEBUGLEVEL>=3) cerr << "<-GrayModule::processFrame()\n";
#endif
  }

  void processKeyFrame(void)
  {
#ifdef DEBUG
    if(DEBUGLEVEL>=3) cerr << "->GrayModule::processKeyFrame()\n";
#endif
    if(src->img->nChannels==1)
    {
      // GrayModule sollte nicht in der Modulliste sein!
      cvCopy(src->img, img);
      return;
    }
    cvConvertImage(src->img, img);

  }

}; // CannyModule

} // seemicro

#endif // RECOGNITIONMODULE_H
