Hauptseite | Liste aller Namensbereiche | Klassenhierarchie | Alphabetische Liste | Übersicht | Auflistung der Dateien | Elemente eines Namensbereiches | Datenstruktur-Elemente | Datei-Elemente

controller.h

gehe zur Dokumentation dieser Datei
00001 #ifndef MICROCONTROLLER_H
00002 #define MICROCONTROLLER_H
00003 
00004 #include "seemicro.h"
00005 #include <iostream>
00006 #include <list>
00007 #include <iomanip>
00008 #include "timer.h"
00009 
00010 using namespace std;
00011 
00012 namespace seemicro
00013 {
00014 
00021 int DEBUGLEVEL = 0;
00022 
00023 struct MicroController
00024 {
00028   Micro *ergebnis;
00029 
00033   Micro *kern;
00034 
00035   ImageSource *src;
00036 
00040   videoDevice *v;
00041 
00042   GrayModule* g;
00043   CannyModule *ca, *canny2;
00044   CorrelationModule *co;
00045   SearchRadiusModule *sr;
00046   SearchAnglesAdam *se;
00047   FindLEDSModule *sleds;
00048   HSVRange *range;
00049 #ifdef POLAR
00050   PolarModule *polar;
00051   PolarCorrelationModule *polarCorr;
00052 #endif
00053 
00059   list<RecognitionModule*> frameRecognitionList;
00060   list<OutputModule*> outputList;
00061 
00065   bool keyframe;
00066 
00067   Timer timer;
00068   long timeForFrame, timeForKeyFrame, timeForFrameOut, timeForKeyFrameOut;
00069 
00070   void modulesProcessFrame(void)
00071   {
00072     Timer t;
00073 #ifdef DEBUG
00074     if(DEBUGLEVEL>=3) cerr << " ProcessFrame: ";
00075 #endif
00076     myrect *ROI, ROI2;
00077 
00078     if(se) ROI=&se->rect;
00079     else if(co && co->micro.radiusValid && co->micro.mitteValid)
00080     {
00081       mypoint p = mypoint(int(co->micro.radius), int(co->micro.radius));
00082       ROI2 = myrect(co->micro.mitte - p, co->micro.mitte+p);
00083       ROI2.crop(co->src.img->width, co->src.img->height);
00084       ROI = &ROI2;
00085     }
00086     else ROI=NULL;
00087 
00088     list<RecognitionModule*>::iterator i;
00089     for(i = frameRecognitionList.begin();
00090         i != frameRecognitionList.end(); i++)
00091     {
00092 #ifdef DEBUG
00093       if(DEBUGLEVEL>=3) cerr << "+";
00094 #endif
00095       t.start();
00096       (*i)->processFrame(ROI);
00097       t.stop();
00098       (*i)->timeForFrame = t.get();
00099     }
00100   }
00101 
00102   void modulesProcessKeyFrame(void)
00103   {
00104     Timer t;
00105 #ifdef DEBUG
00106     if(DEBUGLEVEL>=3) cerr << " key: ";
00107 #endif
00108     list<RecognitionModule*>::iterator i;
00109     for(i = frameRecognitionList.begin();
00110         i != frameRecognitionList.end(); i++)
00111     {
00112 #ifdef DEBUG
00113     if(DEBUGLEVEL>=3) cerr << "+";
00114 #endif
00115       t.start();
00116       (*i)->processKeyFrame();
00117       t.stop();
00118       (*i)->timeForKeyFrame = t.get();
00119     }
00120   }
00121 
00122   void callOutputModules(bool keyframe)
00123   {
00124 #ifdef DEBUG
00125     if(DEBUGLEVEL>=3) cerr << " out: ";
00126 #endif
00127     list<OutputModule*>::iterator i;
00128     for(i = outputList.begin();
00129         i != outputList.end(); i++)
00130     {
00131 #ifdef DEBUG
00132     if(DEBUGLEVEL>=3) cerr << "#";
00133 #endif
00134       (*i)->output(keyframe);
00135     }
00136 #ifdef DEBUG
00137     if(DEBUGLEVEL>=3) cerr << ".\n";
00138 #endif
00139   }
00140 
00145   void reEvalIfParamChanged(void)
00146   {
00147 #ifdef DEBUG
00148     if(DEBUGLEVEL>=3) cerr << "Reeval: ";
00149 #endif
00150     bool cascade = false;
00151     list<RecognitionModule*>::iterator i;
00152     for(i = frameRecognitionList.begin();
00153         i != frameRecognitionList.end(); i++)
00154     {
00155 #ifdef DEBUG
00156       if(DEBUGLEVEL>=3) cerr << (cascade ? "+" : "-");
00157 #endif
00158       if((!cascade) && ((*i)->paramChanged)) cascade = true;
00159       if(!cascade) continue;
00160       (*i)->processKeyFrame();
00161     }
00162 #ifdef DEBUG
00163     if(DEBUGLEVEL>=3) cerr << ".";
00164 #endif
00165 
00166     if(cascade) callOutputModules(true);
00167   }
00168 
00178   void handleFrame()
00179   {
00180 #ifdef DEBUG
00181     if(DEBUGLEVEL>=3)
00182       cerr << "->MicroController::handleFrame\n";
00183 #endif
00184     assert(ergebnis);
00185     keyframe = !v || // kein videomodus
00186       !ergebnis->mitteValid || // mittelpunkt noch nicht bekannt
00187       !(v->framesCaptured % v->keyFrameRate);
00188 
00189     timer.start();
00190 
00191     if((DEBUGLEVEL>=2) && (v!=0))
00192     {
00193       cout << "\rframe: " << setw(2) <<
00194         (v->framesCaptured % v->keyFrameRate);
00195       cout << (keyframe ? " keyframe" : "          ") << flush;
00196     }
00197 
00198     if(keyframe) modulesProcessKeyFrame();
00199     else modulesProcessFrame();
00200 
00201     timer.stop();
00202     if(keyframe) timeForKeyFrame = timer.get();
00203     else timeForFrame = timer.get();
00204 
00205     timer.start();
00206     callOutputModules(keyframe);
00207     timer.stop();
00208     if(keyframe) timeForKeyFrameOut = timer.get();
00209     else timeForFrameOut = timer.get();
00210 
00211 #ifdef DEBUG
00212     if(DEBUGLEVEL>=3) cerr << "<-MicroController::handleFrame\n";
00213 #endif
00214   }
00215 
00221   MicroController()
00222   {
00223     range = NULL;
00224     sleds = NULL;
00225     g = NULL;
00226     se = NULL;
00227     sr = NULL;
00228     co = NULL;
00229     ca = NULL;
00230     kern = NULL;
00231   }
00232 
00233   MicroController(ImageSource *quelle, Micro *Amicro) : ergebnis(Amicro), src(quelle)
00234   {
00235     range = NULL;
00236     sleds = NULL;
00237     g = NULL;
00238     se = NULL;
00239     sr = NULL;
00240     co = NULL;
00241     ca = NULL;
00242     kern = NULL;
00243 
00244     // clone ergebnis to create kern of exactly same type
00245     kern = ergebnis->clone();
00246 
00247     // klappt immer. liefert NULL, wenn cast nicht möglich
00248     v = dynamic_cast<videoDevice*>(src);
00249 
00250     if(DEBUGLEVEL>=2) cerr << "Creating Recognition Modules...";
00251     src->registerMe(frameRecognitionList);
00252 
00253     if(src->img->nChannels>1)
00254     {
00255       g = new GrayModule(*src);
00256       g->registerMe(frameRecognitionList);
00257       ca = new CannyModule(*g);
00258 #ifdef POLAR
00259       polar = new PolarModule(*g, *ergebnis, 200, 200);
00260       polar->registerMe(frameRecognitionList);
00261       canny2 = new CannyModule(*polar);
00262       canny2->registerMe(frameRecognitionList);
00263       polarCorr = new PolarCorrelationModule(*ergebnis, *canny2);
00264       polarCorr->registerMe(frameRecognitionList);
00265 #endif
00266     }
00267     else
00268     {
00269       ca = new CannyModule(*src);
00270     }
00271     ca->registerMe(frameRecognitionList);
00272 
00273 
00274     co = new CorrelationModule(*ergebnis, *ca, kern);
00275     co->registerMe(frameRecognitionList);
00276 
00277     sr = new SearchRadiusModule(*co);
00278     sr->registerMe(frameRecognitionList);
00279 
00280     range = new HSVRange();
00281     range->registerMe(frameRecognitionList);
00282     // Dieses Modul verhält sich verschieden,
00283     // je nachdem ob es auf Adam oder Eva schaut
00284     sleds = new FindLEDSModule(*src, *ergebnis, *co, *range);
00285     sleds->registerMe(frameRecognitionList);
00286 
00287     // Only if we try to recognize a micro.Adam
00288     MicroAdam *adam = dynamic_cast<MicroAdam*>(ergebnis);
00289     if(adam)
00290     {
00291       se = new SearchAnglesAdam(*adam, *co, *ca);
00292       se->registerMe(frameRecognitionList);
00293     }
00294 
00295   }
00296 
00300   ~MicroController()
00301   {
00302     if(DEBUGLEVEL>=2) cerr << "sleds ";
00303     if(sleds)
00304     {
00305       delete sleds; sleds = NULL;
00306     }
00307     if(DEBUGLEVEL>=2) cerr << "se ";
00308     if(se)
00309     {
00310       delete se; se = NULL;
00311     }
00312     if(DEBUGLEVEL>=2) cerr << "sr ";
00313     if(sr)
00314     {
00315       delete sr; sr = NULL;
00316     }
00317     if(DEBUGLEVEL>=2) cerr << "co ";
00318     if(co)
00319     {
00320       delete co; co = NULL;
00321     }
00322     if(DEBUGLEVEL>=2) cerr << "ca ";
00323     if(ca)
00324     {
00325       delete ca;ca = NULL;
00326     }
00327     if(DEBUGLEVEL>=2) cerr << "g ";
00328     if(g)
00329     {
00330       delete g; g = NULL;
00331     }
00332     if(DEBUGLEVEL>=2) cerr << "kern ";
00333     if(kern)
00334     {
00335       delete kern; kern = NULL;
00336     }
00337 
00338   }
00339 
00340 }; // MicroController
00341 
00342 } // seemicro
00343 
00344 #endif

Erzeugt am Sun Oct 3 12:52:47 2004 für seemicro von doxygen 1.3.2