#ifndef CANNYMODULE_H
#define CANNYMODULE_H

#include "../recognition/videodevice.h"
#include "imagesource.h"

namespace seemicro
{

struct CannyModule : public ImageSource
{
  int canny1, canny2;
  ImageSource& src;

  CannyModule(ImageSource& As) : src(As)
  {
    canny1 = 50;
    canny2 = 80;
    img = cvCreateImage(cvSize(src.img->width, src.img->height), IPL_DEPTH_8U, 1);
  }

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

  /**
    * Vorbereitung auf searchAngles(),
    * correlate() wird nicht unterstützt
    * erwartet Graustufenbild in *image
    * führt Canny für den interessanten Bereich aus,
    * speichert Ergebnis in Membervariable "in",
    * ffin wird nicht initialisiert
    */
  void processFrame(myrect *ROI)
  {
    // cvCanny() trägt ROI keine Rechnung!
    // Man kann das testen mit 'cvZero(canny_ausgabe);'
    // Nach Aufruf von cvCanny() sind auch ausserhalb
    // der ROI Kantenpixel in canny_ausgabe gesetzt!
    // Deshalb: Konstruktion von Ausschnitten

    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);

    cvCanny(&ausschnitt1, &ausschnitt2,
	canny1, // threshold1
	canny2, // threshold2, see opencv docs
	3); // sobel aperture

    paramChanged = false;
    outputChanged = true;
#ifdef DEBUG
    if(DEBUGLEVEL>=3) cerr << "<-CannyModule::processFrame()\n";
#endif
  }

  void processKeyFrame(void)
  {
#ifdef DEBUG
    if(DEBUGLEVEL>=3) cerr << "->CannyModule::processKeyFrame()\n";
#endif
    cvCanny(src.img, img,
	canny1, // threshold1
	canny2, // threshold2, see opencv docs
	3); // sobel aperture

    paramChanged = false;
    outputChanged = true;
#ifdef DEBUG
    if(DEBUGLEVEL>=3) cerr << "<-CannyModule::processKeyFrame()\n";
#endif
}

  }; // CannyModule

} // seemicro

#endif // RECOGNITIONMODULE_H
