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 ||
00186 !ergebnis->mitteValid ||
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
00245 kern = ergebnis->clone();
00246
00247
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
00283
00284 sleds = new FindLEDSModule(*src, *ergebnis, *co, *range);
00285 sleds->registerMe(frameRecognitionList);
00286
00287
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 };
00341
00342 }
00343
00344 #endif