00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 #define NUM_DIRS        8   
00040 #define NUM_CS          2
00041  
00042 
00043 #include "Image/OpenCVUtil.H"
00044 
00045 #include "Component/ModelManager.H"
00046 #include "Media/FrameSeries.H"
00047 
00048 #include "Image/Image.H"
00049 #include "Image/CutPaste.H"
00050 #include "Image/ColorOps.H"
00051 #include "Image/MathOps.H"
00052 #include "Image/FilterOps.H"
00053 #include "Image/ShapeOps.H"
00054 #include "Image/Pixels.H"
00055 #include "Raster/Raster.H"
00056 #include "Image/MatrixOps.H"
00057 
00058 
00059 
00060 #include "Util/Timer.H"
00061 
00062 #include <stdio.h>
00063 
00064 #include "Robots/Beobot2/Navigation/FOE_Navigation/FoeDetector.H"
00065 #include "Robots/Beobot2/Navigation/FOE_Navigation/MotionOps.H"
00066 
00067 
00068 struct ViSTARSmodelState
00069 {
00070   ViSTARSmodelState() { };
00071 
00072   std::vector<std::vector<Image<double> > > I;
00073   std::vector<std::vector<Image<double> > > a;
00074   std::vector<std::vector<Image<double> > > b;
00075   std::vector<std::vector<Image<double> > > x;
00076   std::vector<std::vector<Image<double> > > y;
00077   std::vector<std::vector<Image<double> > > z;
00078 
00079   std::vector<std::vector<std::vector<Image<double> > > > c;
00080   std::vector<std::vector<std::vector<Image<double> > > > e;
00081   std::vector<std::vector<Image<double> > > f;
00082 
00083   std::vector<Image<double> > q;  
00084   std::vector<Image<double> > Q;  
00085   std::vector<Image<double> > m;  
00086 
00087   std::vector<double> r;
00088 
00089   
00090   std::vector<double> R; 
00091 };
00092 
00093 struct ViSTARSmodel
00094 {
00095   ViSTARSmodel() { };
00096 
00097   
00098   
00099   
00100   
00101   
00102   
00103   
00104   
00105   
00106 
00107   uint p_NumSpeeds;
00108 
00109   
00110   double p_A1; 
00111   double p_B1;
00112   double p_C1;
00113   double p_D1;
00114   double p_phi1;
00115   double p_E1;
00116   Image<double> p_Fxy; 
00117   double p_G1;
00118 
00119   
00120   double p_A2;
00121   double p_B2;
00122   double p_C2;
00123   double p_D2;
00124   double p_K2;
00125 
00126   
00127   double p_A3;
00128   double p_B3;
00129   double p_C3;
00130   double p_K3;
00131   double p_A4;
00132   double p_B4;
00133   double p_C4;
00134   double p_K4;
00135 
00136   
00137   double p_A5;
00138   double p_B5;
00139   double p_C5;
00140 
00141   
00142   double p_A6;   
00143   double p_B6;
00144   double p_C6;
00145   double p_D6;
00146   double p_theta6;  
00147   std::vector<double> p_vdD;
00148 
00149   double p_A7;
00150   double p_B7;
00151   double p_C7;
00152   double p_D7;
00153   double p_E7;
00154   double p_G7;
00155   double p_theta7;
00156   rutz::shared_ptr<std::vector<std::vector<Image<double> > > > p_w; 
00157   double p_M; 
00158   double p_N;
00159   rutz::shared_ptr<std::vector<Image<double> > > p_L; 
00160 
00161   std::vector<Point2D<int> > Rlocs;
00162 
00163   rutz::shared_ptr<ViSTARSmodelState> state;
00164 };
00165 
00166 
00167 Point2D<int> getFOE(ViSTARSmodel &model, Image<double> stim);
00168 void updateFrame(ViSTARSmodel &model, Image<double> stim);
00169 
00170 Point2D<int> bgm_2007(ViSTARSmodel &model);
00171 
00172 std::vector< Image<double> > 
00173 sumFxyI(Image<double> F, std::vector<Image<double> > I);
00174 
00175 Image<double> combine(Image<double> y, double f);
00176 
00177 std::vector<Image<double> > 
00178 sumLxy(rutz::shared_ptr<std::vector<Image<double> > > L, 
00179        std::vector<Image<double> > I);
00180 
00181 std::vector<Image<double> > 
00182 sumRz(std::vector<double> R, 
00183       rutz::shared_ptr<std::vector<std::vector<Image<double> > > > w);
00184 
00185 std::vector<Image<double> >
00186 sumvD(std::vector<double>v, std::vector<Image<double> > I);
00187 
00188 int dof(int x);
00189 
00190 Image<double> filter2(Image<double> f, Image<double> d);
00191 
00192 void report(ViSTARSmodel &model);
00193 
00194 
00195 ViSTARSmodel setupParams(uint comp, Dims size); 
00196 
00197 
00198 
00199 std::pair<rutz::shared_ptr<std::vector<std::vector<Image<double> > > >,
00200           std::vector<Point2D<int> > >
00201 generate_w (Dims sz, std::vector<double> vert_pos, uint horz_spac, uint scale);
00202 
00203 
00204 rutz::shared_ptr<std::vector<Image<double> > > 
00205 generate_L(double l, double sigx, double sigy, double k);
00206 
00207 void initializeModel(ViSTARSmodel &model, Image<double> stim);
00208 
00209 Image<double> shrink(Image<double> y, double f);
00210 
00211 double min(double a, double b)
00212 {
00213   if(a<b) return a;
00214   else    return b;
00215 }
00216 
00217 double max(double a, double b)
00218 {
00219   if(a>b) return a;
00220   else    return b;
00221 }
00222 
00223 double tstep = .1;
00224 
00225 
00226 int main(const int argc, const char **argv)
00227 {
00228   MYLOGVERB = LOG_INFO;  
00229 
00230   
00231   ModelManager manager("Test Optic Flow");
00232 
00233   nub::ref<InputFrameSeries> ifs(new InputFrameSeries(manager));
00234   manager.addSubComponent(ifs);
00235 
00236   nub::ref<OutputFrameSeries> ofs(new OutputFrameSeries(manager));
00237   manager.addSubComponent(ofs);
00238 
00239   
00240   
00241   
00242 
00243   manager.exportOptions(MC_RECURSE);
00244 
00245   if (manager.parseCommandLine((const int)argc, (const char**)argv,
00246                                "", 0, 0) == false)
00247     return(1);
00248 
00249   
00250   
00251   
00252   
00253   
00254   
00255 
00256   
00257   manager.start();
00258 
00259   Timer timer(1000000);
00260   timer.reset();  
00261   int frame = 0;
00262   bool keepGoing = true;
00263   const FrameState is = ifs->updateNext();
00264 
00265   ViSTARSmodel model = setupParams(1, ifs->peekDims()); 
00266   Image< PixRGB<byte> > image;
00267   Image<double> stim;
00268   if (is == FRAME_COMPLETE) keepGoing = false;
00269   else 
00270     {
00271       image = ifs->readRGB();
00272       stim = luminance(image)/255.0;
00273 
00274       
00275       initializeModel(model, stim);
00276     }
00277 
00278   while (keepGoing)
00279     {
00280       if (ofs->becameVoid())
00281         {
00282           LINFO("quitting because output stream was closed or became void");
00283           break;
00284         }
00285 
00286       Point2D<int> pt = getFOE(model, stim);      
00287       Image<PixRGB<byte> > disp = image;
00288       drawFilledRect
00289         (disp,Rectangle::tlbrI(pt.j, pt.i, pt.j+4, pt.i+4), 
00290          PixRGB<byte>(255,0,0));
00291 
00292       ofs->writeRGB(disp, "Optic Flow");
00293       const FrameState os = ofs->updateNext();
00294       
00295 
00296       
00297 
00298       if (os == FRAME_FINAL) break;
00299 
00300       const FrameState is = ifs->updateNext();
00301       if (is == FRAME_COMPLETE) break; 
00302       image = ifs->readRGB();
00303       stim  = luminance(image)/255.0;
00304       frame++;
00305     }
00306 
00307   
00308   manager.stop();
00309 
00310   
00311   return 0;
00312 }
00313 
00314 
00315 ViSTARSmodel setupParams(uint comp, Dims size)
00316 {
00317   ViSTARSmodel model;
00318   model.p_NumSpeeds = 3;
00319 
00320   
00321   model.p_A1   = 0.001;
00322   model.p_B1   = 1.0;
00323   model.p_C1   = 2.0;
00324   model.p_D1   = 0.25;
00325   model.p_phi1 = 0.1;
00326   model.p_E1   = 10.225;    
00327 
00328   
00329 
00330   
00331   Image<double> xImg(7,7,ZEROS);
00332   for(int i = 0; i < 7; i++)
00333     {
00334       int x = i - 3;
00335       for(int j = 0; j < 7; j++) xImg.setVal(i,j, x);
00336     }
00337 
00338   
00339   Image<double> txImg = transpose(xImg);
00340   Image<double> xxImg = toPower(xImg*xImg + txImg*txImg, .5);
00341 
00342   
00343   Image<double> xxxImg = transpose(exp(xxImg*xxImg*-1.0)*(model.p_E1/(2*M_PI)));  
00344   model.p_Fxy = xxxImg;
00345 
00346       
00347       
00348       
00349       
00350       
00351       
00352       
00353 
00354 
00355   model.p_G1 = 0.031623;
00356 
00357   
00358   model.p_A2 = 10.0;
00359   model.p_B2 = 1.0;
00360   model.p_C2 = 2.0;
00361   model.p_D2 = 0.01;
00362   model.p_K2 = 20.0;
00363 
00364   
00365   model.p_A3 = 1.0;
00366   model.p_B3 = 1.0;
00367   model.p_C3 = 1.0;
00368   model.p_K3 = 2.0;
00369   model.p_A4 = 10.0;
00370   model.p_B4 = 1.0;
00371   model.p_C4 = 1.0;
00372   model.p_K4 = 2.0;
00373   
00374   
00375   model.p_A5 = 0.1;
00376   model.p_B5 = 1.0;
00377   model.p_C5 = 0.01;
00378 
00379   
00380   model.p_A6 = 0.5;   
00381   model.p_B6 = 1.0;
00382   model.p_C6 = 0.5;
00383   model.p_D6 = 0.5;
00384   model.p_theta6 = 0.2;
00385 
00386   
00387   if(comp == 0)
00388     {
00389       
00390       model.p_vdD.push_back(0.0);
00391       model.p_vdD.push_back(0.0);
00392       model.p_vdD.push_back(0.0);
00393       model.p_vdD.push_back(0.0);
00394       model.p_vdD.push_back(0.0);
00395     }
00396   else if(comp == 1) 
00397     {
00398       
00399       model.p_vdD.push_back(0.0);
00400       model.p_vdD.push_back(0.5);
00401       model.p_vdD.push_back(1.0);
00402       model.p_vdD.push_back(1.0);
00403       model.p_vdD.push_back(10.0);
00404     }
00405   else if(comp == 2)
00406     {
00407       
00408       model.p_vdD.push_back(0.0);
00409       model.p_vdD.push_back(0.0);
00410       model.p_vdD.push_back(0.0);
00411       model.p_vdD.push_back(0.0);
00412       model.p_vdD.push_back(5.0);
00413     }
00414   else if(comp == 3)
00415     {
00416       
00417       model.p_vdD.push_back(0.25);
00418       model.p_vdD.push_back(0.25);
00419       model.p_vdD.push_back(1.0);
00420       model.p_vdD.push_back(0.25);
00421       model.p_vdD.push_back(10.0);
00422     }
00423   else LFATAL("no such competitive environment");
00424 
00425   model.p_A7 = 0.5;
00426   model.p_B7 = 1.0;
00427   model.p_C7 = 4.0;
00428   model.p_D7 = 0.25;
00429   model.p_E7 = 0.25;
00430   model.p_G7 = 0.1;
00431   model.p_theta7 = 0.2;
00432   
00433   Dims sz(size.w()/(pow(2, model.p_NumSpeeds-1)),
00434           size.h()/(pow(2, model.p_NumSpeeds-1)) );
00435 
00436   
00437   
00438   
00439   
00440 
00441   
00442   std::vector<double> vert_pos;
00443   vert_pos.push_back(.25);    
00444   vert_pos.push_back(5.0/16.0);    
00445   vert_pos.push_back(.375);  
00446   uint horz_spac = 5;
00447 
00448   
00449   
00450   
00451   
00452   
00453 
00454   std::pair<rutz::shared_ptr<std::vector<std::vector<Image<double> > > >,
00455     std::vector<Point2D<int> > > temp =
00456   generate_w(sz, vert_pos, horz_spac, uint(pow(2, model.p_NumSpeeds-1)));
00457   model.p_w   = temp.first; 
00458   model.Rlocs = temp.second;
00459   model.p_M = vert_pos.size() * (sz.w()/horz_spac); 
00460 
00461   rutz::shared_ptr<std::vector<std::vector<Image<double> > > > p_w 
00462     = model.p_w;
00463   double min = 0;
00464   for(uint l = 0; l < model.p_w->size(); l++)
00465     {
00466       double total = 0;
00467       for(uint dir = 0; dir < 8; dir++)
00468         total += sum((*p_w)[l][dir]);
00469       if(total < min || l == 0)  min = total; 
00470     }
00471   model.p_N = min;
00472 
00473   model.p_L = generate_L(2,2,3,0.25);
00474 
00475   return model;
00476 }
00477 
00478 
00479 
00480 
00481  rutz::shared_ptr<std::vector<Image<double> > > 
00482 generate_L(double l, double sigx, double sigy, double k)
00483  {
00484    
00485     int wid = 25;
00486     int mid = 13;
00487     double th = 0.005;
00488 
00489     
00490     rutz::shared_ptr<std::vector<Image<double> > > 
00491       L(new std::vector<Image<double> >());
00492 
00493     
00494     
00495     Image<double> rot45(Dims(2,2),NO_INIT);
00496     rot45.setVal(0,0,  cos(45*(M_PI/180)));
00497     rot45.setVal(1,0, -sin(45*(M_PI/180)));
00498     rot45.setVal(0,1,  sin(45*(M_PI/180)));
00499     rot45.setVal(1,1,  cos(45*(M_PI/180)));
00500 
00501     Image<double> temp1(wid, wid, ZEROS);
00502     Image<double> temp8(wid, wid, ZEROS);
00503     for(int i = 0; i < wid; i++)
00504       {
00505         for(int j = 0; j < wid; j++)
00506           {
00507             int x = i-mid+1; int y = j-mid+1;
00508 
00509             
00510             double val =
00511               (l/(2*M_PI*sigx*sigy))*exp(-k*(pow(x/sigx, 2.0) + pow(y/sigy, 2.0)));
00512             temp1.setVal(j,i, val); 
00513 
00514             
00515             Image<double> t(1,2,NO_INIT);
00516             t.setVal(0,0, x); t.setVal(0,1, y);
00517             Image<double> nxy = matrixMult(rot45,t)*sqrt(2.0);
00518             double v1 = nxy.getVal(0,0); double v2 = nxy.getVal(0,1);
00519             nxy.setVal(0,0, round(v1)+ mid);
00520             nxy.setVal(0,1, round(v2)+ mid);
00521 
00522             
00523             uint i8 = uint(max(min(double(nxy.getVal(0)-x), double(wid)),1))-1; 
00524             uint j8 = uint(max(min(double(nxy.getVal(1)  ), double(wid)),1))-1;
00525             temp8.setVal(j8,i8, val);
00526           }
00527       }
00528 
00529     
00530     for(int i = 0; i < wid; i++)
00531       for(int j = 0; j < wid; j++)
00532         {
00533           double val  = temp1.getVal(i,j);
00534           temp1.setVal(i,j, (val>th)*val);
00535         }
00536 
00537     
00538     for(int i = 0; i < wid; i++)
00539       for(int j = 0; j < wid; j++)
00540         {
00541           double val  = temp8.getVal(i,j);
00542           temp8.setVal(i,j, (val>th)*val);
00543         }
00544 
00545     
00546 
00547     
00548     Image<double> temp5 = temp1;
00549     Image<double> temp3(wid,wid,NO_INIT);
00550     int w2 = wid/2;
00551     for(int i = 0; i < wid; i++)
00552       for(int j = 0; j < wid; j++)
00553         temp3.setVal(w2 + (j - w2), w2 - (i - w2), temp1.getVal(i,j));
00554     Image<double> temp7 = temp3;
00555 
00556     
00557     Image<double> temp4 = temp8;
00558     Image<double> temp2(wid,wid,NO_INIT);
00559     for(int i = 0; i < wid; i++)
00560       for(int j = 0; j < wid; j++)
00561         temp2.setVal(int(wid-1) - i, j, temp8.getVal(i,j));
00562     Image<double> temp6 = temp2;
00563 
00564     L->push_back(temp1);
00565     L->push_back(temp2);
00566     L->push_back(temp3);
00567     L->push_back(temp4);
00568     L->push_back(temp5);
00569     L->push_back(temp6);
00570     L->push_back(temp7);
00571     L->push_back(temp8);
00572 
00573     return L;
00574  }
00575    
00576 
00577 
00578 
00579 std::pair<rutz::shared_ptr<std::vector<std::vector<Image<double> > > >,
00580           std::vector<Point2D<int> > >
00581 generate_w
00582 (Dims sz, std::vector<double> vert_pos, uint horz_spac, uint scale)
00583 {
00584   int smax = sz.w(); if(smax < sz.h()) smax = sz.h();
00585   int sizx = round(2*smax);
00586 
00587   Image<double> U(sizx*2+1, sizx*2+1, NO_INIT);
00588   Image<double> V(sizx*2+1, sizx*2+1, NO_INIT); 
00589 
00590   
00591   
00592   for(int i = 0; i < sizx*2+1; i++)
00593     {
00594       int x = i - sizx;
00595       for(int j = 0; j < sizx*2+1; j++)
00596         {
00597           U.setVal(i,j, x);
00598           V.setVal(j,i, x);
00599         }
00600     }
00601 
00602    
00603    Image<double> d(sizx*2+1, sizx*2+1, NO_INIT);
00604    for(int i = 0; i < sizx*2+1; i++)
00605      {
00606        for(int j = 0; j < sizx*2+1; j++)
00607          {
00608            double val = 
00609              4*atan2(V.getVal(i,j),U.getVal(i,j))/M_PI + 1.0;
00610            double val2 = val + (val<1)*8;
00611            d.setVal(i,j, val2);
00612          }
00613      }
00614 
00615    
00616    std::vector<Image<double> > tw;
00617    Image<double> res(sizx*2+1, sizx*2+1, NO_INIT);
00618    
00619    for(int i = 0; i < sizx*2+1; i++)
00620      {
00621        for(int j = 0; j < sizx*2+1; j++)
00622          {
00623            double val  = d.getVal(i,j);
00624            double val2 = double(val<2)*(2-val) + double(val>8)*(val-8);
00625            res.setVal(i,j, val2);
00626          }
00627      }
00628    tw.push_back(res);
00629 
00630    
00631    for(int i = 0; i < sizx*2+1; i++)
00632      {
00633        for(int j = 0; j < sizx*2+1; j++)
00634          {
00635            double val  = d.getVal(i,j);
00636            double val2 = double((val<3)&(val>=2))*(3-val) + 
00637              double((val>1)&(val<2))*(val-1);
00638            res.setVal(i,j, val2);
00639          }
00640      }
00641    tw.push_back(res);
00642 
00643    
00644    for(int i = 0; i < sizx*2+1; i++)
00645      {
00646        for(int j = 0; j < sizx*2+1; j++)
00647          {
00648            double val  = d.getVal(i,j);
00649            double val2 = double((val<4)&(val>=3))*(4-val) + 
00650              double((val>2)&(val<3))*(val-2);
00651            res.setVal(i,j, val2);
00652          }
00653      }
00654    tw.push_back(res);
00655 
00656    
00657    for(int i = 0; i < sizx*2+1; i++)
00658      {
00659        for(int j = 0; j < sizx*2+1; j++)
00660          {
00661            double val  = d.getVal(i,j);
00662            double val2 = double((val<5)&(val>=4))*(5-val) + 
00663              double((val>3)&(val<4))*(val-3);
00664            res.setVal(i,j, val2);
00665          }
00666      }
00667    tw.push_back(res);
00668 
00669    
00670    for(int i = 0; i < sizx*2+1; i++)
00671      {
00672        for(int j = 0; j < sizx*2+1; j++)
00673          {
00674            double val  = d.getVal(i,j);
00675            double val2 = double((val<6)&(val>=5))*(6-val) + 
00676              double((val>4)&(val<5))*(val-4);
00677            res.setVal(i,j, val2);
00678          }
00679      }
00680    tw.push_back(res);
00681 
00682    
00683    for(int i = 0; i < sizx*2+1; i++)
00684      {
00685        for(int j = 0; j < sizx*2+1; j++)
00686          {
00687            double val  = d.getVal(i,j);
00688            double val2 = double((val<7)&(val>=6))*(7-val) + 
00689              double((val>5)&(val<6))*(val-5);
00690            res.setVal(i,j, val2);
00691          }
00692      }
00693    tw.push_back(res);
00694 
00695    
00696    for(int i = 0; i < sizx*2+1; i++)
00697      {
00698        for(int j = 0; j < sizx*2+1; j++)
00699          {
00700            double val  = d.getVal(i,j);
00701            double val2 = double((val<8)&(val>=7))*(8-val) + 
00702              double((val>6)&(val<7))*(val-6);
00703            res.setVal(i,j, val2);
00704          }
00705      }
00706    tw.push_back(res);
00707 
00708    
00709    for(int i = 0; i < sizx*2+1; i++)
00710      {
00711        for(int j = 0; j < sizx*2+1; j++)
00712          {
00713            double val  = d.getVal(i,j);
00714            double val2 = double(val>=8)*(9-val) + 
00715              double((val>7)&(val<8))*(val-7);
00716            res.setVal(i,j, val2);
00717          }
00718      }
00719    tw.push_back(res);
00720 
00721    
00722    for(uint i = 0; i < 8; i++) tw[i].setVal(sizx,sizx, 1.0);
00723 
00724    
00725    
00726    rutz::shared_ptr<std::vector<std::vector<Image<double> > > > 
00727      w(new std::vector<std::vector<Image<double> > >());
00728 
00729    std::vector<Point2D<int> > rlocs;
00730 
00731    uint maxVert = vert_pos.size();  
00732    uint maxHorz = sz.w()/horz_spac;
00733    
00734    
00735    
00736    for(uint i = 0; i < maxVert; i++)
00737      {
00738        int  vert = round(vert_pos[i]*sz.h());
00739        for(uint j = 0; j < maxHorz; j++)
00740          {
00741            int horz = (horz_spac/2) + j*horz_spac;
00742 
00743            std::vector<Image<double> > temp;
00744 
00745            
00746            
00747            
00748            int t = sizx-vert - 1;
00749            int b = sizx+((sz.h()-1) -vert) - 1;
00750            int l = sizx-horz+0;
00751            int r = sizx+((sz.w()-1) - horz+0);
00752            for(uint k = 0; k < 8; k++)
00753              {
00754                temp.push_back(crop(tw[k],Rectangle::tlbrI(t,l,b,r)));
00755              }
00756            
00757            
00758            w->push_back(temp);
00759 
00760            rlocs.push_back(Point2D<int>(horz*scale, vert*scale));
00761            
00762          }
00763      }
00764 
00765    std::pair<rutz::shared_ptr<std::vector<std::vector<Image<double> > > >,
00766     std::vector<Point2D<int> > > temp(w, rlocs);   
00767   return temp;
00768 }
00769 
00770 
00771 void initializeModel(ViSTARSmodel &model, Image<double> stim)
00772 {
00773   rutz::shared_ptr<ViSTARSmodelState> 
00774     state( new ViSTARSmodelState());
00775 
00776   uint ws = 0, hs = 0;
00777   for(uint i = 0; i < model.p_NumSpeeds; i++)
00778     {
00779       
00780       
00781       
00782       
00783       
00784       
00785       std::vector<Image<double> > tI;
00786       if(i == 0) 
00787         {
00788           
00789           tI.push_back(stim);
00790           tI.push_back((stim*-1.0) + 1.0);
00791         }
00792       else   
00793         {
00794           Image<double> temp = shrink(stim, pow(2, i));
00795           tI.push_back(temp);
00796           tI.push_back((temp*-1.0) + 1.0);
00797         }
00798 
00799       
00800       
00801       
00802       
00803       
00804       
00805       
00806       
00807       
00808       
00809       
00810       
00811       
00812       
00813       
00814       
00815       
00816 
00817       state->I.push_back(tI);
00818       
00819       uint width  = tI[0].getWidth();
00820       uint height = tI[0].getHeight();
00821 
00822       
00823       std::vector<Image<double> > tA;
00824       Image<double> tA1(width, height, ZEROS);
00825       Image<double> tA2(width, height, ZEROS);
00826       tA.push_back(tA1);
00827       tA.push_back(tA2);
00828       state->a.push_back(tA);
00829 
00830       
00831       std::vector<Image<double> > tB;
00832       Image<double> tB1(width, height, ZEROS);
00833       Image<double> tB2(width, height, ZEROS);
00834       tB.push_back(tB1);
00835       tB.push_back(tB2);
00836       state->b.push_back(tB);
00837 
00838       
00839       std::vector<Image<double> > tX;
00840       Image<double> tX1(width, height, ZEROS);
00841       Image<double> tX2(width, height, ZEROS);
00842       tX.push_back(tX1);
00843       tX.push_back(tX2);
00844       state->x.push_back(tX);
00845 
00846       
00847       std::vector<Image<double> > tY;
00848       Image<double> tY1(width, height, ZEROS);
00849       Image<double> tY2(width, height, ZEROS);
00850       tY.push_back(tY1);
00851       tY.push_back(tY2);
00852       state->y.push_back(tY);
00853 
00854       
00855       std::vector<Image<double> > tZ;
00856       Image<double> tZ1(width, height, ZEROS);
00857       Image<double> tZ2(width, height, ZEROS);
00858       tZ.push_back(tZ1+1.0);
00859       tZ.push_back(tZ2+1.0);
00860       state->z.push_back(tZ);
00861 
00862       
00863       std::vector<std::vector<Image<double> > > tC;
00864       for(uint j = 0; j < NUM_DIRS; j++)
00865         {
00866           std::vector<Image<double> > tC1;
00867 
00868           Image<double> tC11(width, height, ZEROS);
00869           Image<double> tC12(width, height, ZEROS);
00870           tC1.push_back(tC11);
00871           tC1.push_back(tC12);
00872 
00873           tC.push_back(tC1);
00874         }
00875       state->c.push_back(tC);
00876       
00877       
00878       std::vector<std::vector<Image<double> > > tE;
00879       for(uint j = 0; j < NUM_DIRS; j++)
00880         {
00881           std::vector<Image<double> > tE1;
00882 
00883           Image<double> tE11(width, height, ZEROS);
00884           Image<double> tE12(width, height, ZEROS);
00885           tE1.push_back(tE11);
00886           tE1.push_back(tE12);
00887 
00888           tE.push_back(tE1);
00889         }
00890       state->e.push_back(tE);
00891 
00892       
00893       std::vector<Image<double> > tF;
00894       for(uint j = 0; j < NUM_DIRS; j++)
00895         {
00896           Image<double> tF1(width, height, ZEROS);
00897           tF.push_back(tF1);
00898         }
00899       state->f.push_back(tF);
00900 
00901       if(i == model.p_NumSpeeds-1)
00902         {
00903           ws = width;
00904           hs = height;
00905         }
00906     }
00907 
00908   
00909   std::vector<Image<double> > tq;
00910   for(uint i = 0; i < NUM_DIRS; i++)
00911     {
00912       Image<double> tq1(ws, hs, ZEROS);
00913       tq.push_back(tq1);
00914     }
00915   state->q = tq;
00916 
00917   
00918   std::vector<Image<double> > tQ;
00919   for(uint i = 0; i < NUM_DIRS; i++)
00920     {
00921       Image<double> tQ1(ws, hs, ZEROS);
00922       tQ.push_back(tQ1);
00923     }
00924   state->Q = tQ;
00925 
00926   
00927   std::vector<Image<double> > tm;
00928   for(uint i = 0; i < NUM_DIRS; i++)
00929     {
00930       Image<double> tm1(ws, hs, ZEROS);
00931       tm.push_back(tm1);
00932     }
00933   state->m = tm;
00934 
00935   
00936   state->r = std::vector<double>(model.p_M);
00937   for(uint i = 0; i < model.p_M; i++)
00938     state->r[i] = 0.0;
00939 
00940   
00941   state->R = std::vector<double>(model.p_M);
00942   for(uint i = 0; i < model.p_M; i++)
00943     state->R[i] = 0.0;
00944 
00945   model.state = state;
00946 }
00947 
00948 
00949 
00950 
00951 Image<double> shrink(Image<double> y, double f)
00952 {
00953   
00954   
00955   double ff;
00956   if(f> 1) { ff = 1/f; }
00957   else     { ff = f; f = 1/ff; } 
00958 
00959   uint w = y.getWidth();
00960   uint h = y.getHeight();
00961   uint width  = floor(w*ff);
00962   uint height = floor(h*ff);
00963   Image<double> x(width, height, NO_INIT);
00964 
00965   
00966 
00967   
00968 
00969   
00970   
00971   for(uint i = 0; i < width; i++)
00972     for(uint j = 0; j < height; j++)
00973       {       
00974         
00975         double val = 0.0;
00976         uint sk = uint((i+1)*f-f);
00977         uint ek = uint((i+1)*f);
00978 
00979         uint sl = uint((j+1)*f-f);
00980         uint el = uint((j+1)*f);
00981         
00982         for(uint k = sk; k < ek; k++)
00983           for(uint l = sl; l < el; l++)
00984               val += y.getVal(k,l);
00985         
00986         val /= (f*f);
00987         
00988         x.setVal(i,j,val);       
00989 
00990         
00991         
00992       }
00993 
00994   return x;
00995 }
00996 
00997 
00998 Point2D<int> getFOE(ViSTARSmodel &model, Image<double> stim)
00999 {  
01000   
01001   updateFrame(model, stim);
01002 
01003   Point2D<int> foe;
01004   uint nstep = uint(1.0/tstep);
01005   for(uint i = 0; i < nstep; i++)
01006     {
01007       
01008       foe = bgm_2007(model);
01009 
01010       
01011       report(model); 
01012     }
01013 
01014   FILE *fp;      
01015   LINFO("FOE%d %d", foe.i, foe.j);
01016   if((fp = fopen("BMG_walking.txt","at")) == NULL) LFATAL("not found");
01017   fputs(sformat("%d %d \n", foe.i, foe.j).c_str(), fp);
01018   fclose (fp);  
01019 
01020   return foe;
01021 }
01022 
01023 
01024 void updateFrame(ViSTARSmodel &model, Image<double> stim)
01025 {
01026   
01027   std::vector<std::vector<Image<double> > > tI(model.p_NumSpeeds);
01028   for(uint i = 0; i < model.p_NumSpeeds; i++)
01029     {
01030       
01031       
01032       
01033       
01034       
01035       
01036       std::vector<Image<double> > tIcs;
01037       if(i == 0) 
01038         {
01039           
01040           tIcs.push_back(stim);
01041           tIcs.push_back((stim*-1.0) + 1.0);
01042         }
01043       else   
01044         {
01045           Image<double> temp = shrink(stim, pow(2, i));
01046           tIcs.push_back(temp);
01047           tIcs.push_back((temp*-1.0) + 1.0);
01048         }
01049       tI[i] = tIcs;
01050     }
01051   model.state->I = tI;
01052 }
01053 
01054 uint mainIndex = 0;
01055 
01056 Point2D<int> bgm_2007(ViSTARSmodel &model)
01057 {
01058   
01059   
01060   
01061   
01062   
01063 
01064   
01065   
01066   
01067   
01068   
01069   
01070 
01071   std::vector<std::vector<Image<double> > > oI(model.p_NumSpeeds);
01072   std::vector<std::vector<Image<double> > > oa(model.p_NumSpeeds);
01073   std::vector<std::vector<Image<double> > > ob(model.p_NumSpeeds);
01074   std::vector<std::vector<Image<double> > > ox(model.p_NumSpeeds);
01075   std::vector<std::vector<Image<double> > > oy(model.p_NumSpeeds);
01076   std::vector<std::vector<Image<double> > > oz(model.p_NumSpeeds);
01077   std::vector<std::vector<std::vector<Image<double> > > > oc(model.p_NumSpeeds);
01078   std::vector<std::vector<std::vector<Image<double> > > > oe(model.p_NumSpeeds);
01079   std::vector<std::vector<Image<double> > > of(model.p_NumSpeeds);
01080   std::vector<Image<double> > om(NUM_DIRS);
01081       
01082   for(uint s = 0; s < model.p_NumSpeeds; s++)
01083     {
01084       
01085       
01086      
01087       
01088       
01089       
01090       
01091       std::vector<Image<double> > I   = model.state->I[s];
01092       std::vector<Image<double> > a   = model.state->a[s];
01093       std::vector<Image<double> > b   = model.state->b[s];
01094       std::vector<Image<double> > oIs = model.state->I[s];
01095       std::vector<Image<double> > oas(NUM_CS);
01096       std::vector<Image<double> > obs(NUM_CS);
01097 
01098       std::vector<Image<double> > sumfxy = sumFxyI(model.p_Fxy,I);
01099       for(uint cs = 0; cs < NUM_CS; cs++)
01100         {
01101           
01102           
01103           oas[cs] = a[cs] +  ((a[cs]*-model.p_A1) + 
01104                               ((a[cs]*-1.0) + model.p_B1)*I[cs]*model.p_C1 -
01105                               (a[cs] + model.p_D1)*sumfxy[cs]
01106                               )*tstep;
01107 
01108           
01109           uint w = oas[cs].getWidth();
01110           uint h = oas[cs].getHeight();
01111           Image<double> temp = oas[cs] - model.p_phi1;
01112           Image<double> temp2(w, h, ZEROS);
01113           Image<double> temp3 = takeMax(temp,temp2);
01114           Image<double> tr = temp3*temp3;
01115 
01116  
01117  
01118  
01119  
01120  
01121  
01122  
01123  
01124  
01125  
01126  
01127  
01128  
01129  
01130  
01131  
01132  
01133  
01134 
01135 
01136  
01137  
01138  
01139  
01140                     
01141 
01142 
01143  
01144  
01145  
01146  
01147  
01148  
01149  
01150  
01151  
01152  
01153 
01154 
01155  
01156  
01157  
01158  
01159  
01160  
01161  
01162  
01163  
01164        
01165  
01166  
01167  
01168  
01169 
01170  
01171  
01172 
01173  
01174  
01175  
01176 
01177  
01178  
01179  
01180 
01181           
01182           
01183           
01184           
01185           
01186           
01187           
01188 
01189           
01190 
01191 
01192           
01193           
01194           
01195           
01196           
01197           
01198           
01199           
01200          
01201           
01202           
01203           
01204           
01205           
01206           
01207           
01208           
01209 
01210 
01211           
01212           obs[cs] = tr / (tr + pow(model.p_G1,2.0));
01213 
01214   
01215   
01216   
01217   
01218   
01219   
01220   
01221   
01222   
01223  
01224 
01225 
01226 
01227 
01228 
01229 
01230 
01231         }
01232       
01233 
01234 
01235       
01236       
01237       
01238       
01239       std::vector<Image<double> > x  = model.state->x[s];
01240       std::vector<Image<double> > y  = model.state->y[s];
01241       std::vector<Image<double> > z  = model.state->z[s];
01242 
01243       std::vector<Image<double> > oxs(NUM_CS);
01244       std::vector<Image<double> > oys(NUM_CS);
01245       std::vector<Image<double> > ozs(NUM_CS);
01246 
01247       for(uint cs = 0; cs < NUM_CS; cs++)
01248         {
01249           
01250  
01251  
01252  
01253  
01254  
01255  
01256  
01257  
01258 
01259  
01260  
01261  
01262  
01263  
01264  
01265  
01266  
01267 
01268 
01269 
01270 
01271 
01272 
01273 
01274 
01275 
01276 
01277 
01278           
01279           oxs[cs] =  x[cs] + (((x[cs]*-model.p_B2) + 
01280                                ((x[cs]*-1.0) + model.p_C2)*b[cs])*model.p_A2)*tstep;
01281 
01282           
01283           
01284 
01285           
01286           
01287           
01288 
01289 
01290  
01291 
01292 
01293 
01294 
01295 
01296           
01297           
01298           ozs[cs] =  z[cs] + (((z[cs]*-1.0) - (x[cs]*z[cs]*model.p_K2) + 1.0)*model.p_D2)*tstep;          
01299 
01300           
01301           uint w = oxs[cs].getWidth();
01302           uint h = oxs[cs].getHeight();
01303           Image<double> temp(w, h, ZEROS);
01304           oys[cs] = takeMax(oxs[cs]*ozs[cs], temp);
01305 
01306 
01307  
01308  
01309  
01310  
01311  
01312  
01313  
01314 
01315  
01316  
01317  
01318  
01319  
01320  
01321  
01322 
01323  
01324  
01325  
01326  
01327  
01328  
01329  
01330 
01331 
01332  
01333  
01334  
01335  
01336 
01337 
01338         }
01339 
01340       
01341       
01342       
01343       
01344       
01345       
01346       std::vector<std::vector<Image<double> > > c  = model.state->c[s];
01347       std::vector<std::vector<Image<double> > > e  = model.state->e[s];
01348 
01349       std::vector<std::vector<Image<double> > >ocs(NUM_DIRS);
01350       std::vector<std::vector<Image<double> > >oes(NUM_DIRS);
01351       
01352       
01353       
01354       
01355       
01356       
01357       
01358       
01359       
01360       
01361       
01362       
01363       
01364       
01365       
01366       
01367       
01368 
01369       for(uint cs = 0; cs < NUM_CS; cs++)
01370         {
01371 
01372           
01373           
01374 
01375           
01376           uint cWidth  = c[0][cs].getWidth();
01377           uint cHeight = c[0][cs].getHeight();
01378 
01379           
01380           
01381           Image<double> XY0(cWidth,cHeight,ZEROS);
01382           for(uint i = 0; i < cWidth-1; i++)
01383             for(uint j = 0; j < cHeight; j++)
01384               {
01385                 double v = c[4][cs].getVal(i+1,j);
01386                 double val = 0.0;
01387                 if(v > 0.0) val = v;
01388                 XY0.setVal(i,j, val);
01389               }
01390 
01391           
01392           
01393           
01394           ocs[0].push_back
01395             (c[0][cs] + 
01396              (((c[0][cs]*-model.p_B3) + 
01397                y[cs]*model.p_C3 - XY0*model.p_K3)*model.p_A3)*tstep);
01398 
01399           
01400           
01401           
01402           oes[0].push_back
01403             (e[0][cs] + 
01404              (((e[0][cs]*-model.p_B4) + 
01405                y[cs]*model.p_C4 - XY0*model.p_K4)*model.p_A4)*tstep);          
01406 
01407           
01408           
01409           
01410           Image<double> XY1(cWidth,cHeight,ZEROS);
01411           for(uint i = 0; i < cWidth-1; i++)
01412             for(uint j = 0; j < cHeight-1; j++)
01413               {
01414                 double v = c[5][cs].getVal(i+1,j+1);
01415                 double val = 0.0;
01416                 if(v > 0.0) val = v;
01417                 XY1.setVal(i,j, val);
01418               }
01419 
01420           
01421           
01422           
01423           ocs[1].push_back
01424             (c[1][cs] + 
01425              (((c[1][cs]*-model.p_B3) + 
01426                y[cs]*model.p_C3 - XY1*model.p_K3)*model.p_A3)*tstep);
01427 
01428           
01429           
01430           
01431           oes[1].push_back
01432             (e[1][cs] + 
01433              (((e[1][cs]*-model.p_B4) + 
01434                y[cs]*model.p_C4 - XY1*model.p_K4)*model.p_A4)*tstep);          
01435                     
01436           
01437           
01438           Image<double> XY2(cWidth,cHeight,ZEROS);
01439           for(uint i = 0; i < cWidth; i++)
01440             for(uint j = 0; j < cHeight-1; j++)
01441               {
01442                 double v = c[6][cs].getVal(i,j+1);
01443                 double val = 0.0;
01444                 if(v > 0.0) val = v;
01445                 XY2.setVal(i,j, val);
01446               }
01447 
01448           
01449           
01450           
01451           ocs[2].push_back
01452             (c[2][cs] + 
01453              (((c[2][cs]*-model.p_B3) + 
01454                y[cs]*model.p_C3 - XY2*model.p_K3)*model.p_A3)*tstep);
01455 
01456           
01457           
01458           
01459           oes[2].push_back
01460             (e[2][cs] + 
01461              (((e[2][cs]*-model.p_B4) + 
01462                y[cs]*model.p_C4 - XY2*model.p_K4)*model.p_A4)*tstep);          
01463                     
01464           
01465           
01466           
01467           Image<double> XY3(cWidth,cHeight,ZEROS);
01468           for(uint i = 1; i < cWidth; i++)
01469             for(uint j = 0; j < cHeight-1; j++)
01470               {
01471                 double v = c[7][cs].getVal(i-1,j+1);
01472                 double val = 0.0;
01473                 if(v > 0.0) val = v;
01474                 XY3.setVal(i,j, val);
01475               }
01476 
01477           
01478           
01479           
01480           ocs[3].push_back
01481             (c[3][cs] + 
01482              (((c[3][cs]*-model.p_B3) + 
01483                y[cs]*model.p_C3 - XY3*model.p_K3)*model.p_A3)*tstep);
01484 
01485           
01486           
01487           
01488           oes[3].push_back
01489             (e[3][cs] + 
01490              (((e[3][cs]*-model.p_B4) + 
01491                y[cs]*model.p_C4 - XY3*model.p_K4)*model.p_A4)*tstep);
01492           
01493           
01494           
01495           Image<double> XY4(cWidth,cHeight,ZEROS);
01496           for(uint i = 1; i < cWidth; i++)
01497             for(uint j = 0; j < cHeight; j++)
01498               {
01499                 double v = c[0][cs].getVal(i-1,j);
01500                 double val = 0.0;
01501                 if(v > 0.0) val = v;
01502                 XY4.setVal(i,j, val);
01503               }
01504 
01505           
01506           
01507           
01508           ocs[4].push_back
01509             (c[4][cs] + 
01510              (((c[4][cs]*-model.p_B3) + 
01511                y[cs]*model.p_C3 - XY4*model.p_K3)*model.p_A3)*tstep);
01512 
01513           
01514           
01515           
01516           oes[4].push_back
01517             (e[4][cs] + 
01518              (((e[4][cs]*-model.p_B4) + 
01519                y[cs]*model.p_C4 - XY4*model.p_K4)*model.p_A4)*tstep);          
01520 
01521           
01522           
01523           
01524           Image<double> XY5(cWidth,cHeight,ZEROS);
01525           for(uint i = 1; i < cWidth; i++)
01526             for(uint j = 1; j < cHeight; j++)
01527               {
01528                 double v = c[1][cs].getVal(i-1,j-1);
01529                 double val = 0.0;
01530                 if(v > 0.0) val = v;
01531                 XY5.setVal(i,j, val);
01532               }
01533 
01534           
01535           
01536           
01537           ocs[5].push_back
01538             (c[5][cs] + 
01539              (((c[5][cs]*-model.p_B3) + 
01540                y[cs]*model.p_C3 - XY5*model.p_K3)*model.p_A3)*tstep);
01541 
01542           
01543           
01544           
01545           oes[5].push_back
01546             (e[5][cs] + 
01547              (((e[5][cs]*-model.p_B4) + 
01548                y[cs]*model.p_C4 - XY5*model.p_K4)*model.p_A4)*tstep);          
01549           
01550           
01551           
01552           Image<double> XY6(cWidth,cHeight,ZEROS);
01553           for(uint i = 0; i < cWidth; i++)
01554             for(uint j = 1; j < cHeight; j++)
01555               {
01556                 double v = c[2][cs].getVal(i,j-1);
01557                 double val = 0.0;
01558                 if(v > 0.0) val = v;
01559                 XY6.setVal(i,j, val);
01560               }
01561 
01562           
01563           
01564           
01565           ocs[6].push_back
01566             (c[6][cs] + 
01567              (((c[6][cs]*-model.p_B3) + 
01568                y[cs]*model.p_C3 - XY6*model.p_K3)*model.p_A3)*tstep);
01569 
01570           
01571           
01572           
01573           oes[6].push_back
01574             (e[6][cs] + 
01575              (((e[6][cs]*-model.p_B4) + 
01576                y[cs]*model.p_C4 - XY6*model.p_K4)*model.p_A4)*tstep);          
01577           
01578           
01579           
01580           
01581           Image<double> XY7(cWidth,cHeight,ZEROS);
01582           for(uint i = 0; i < cWidth-1; i++)
01583             for(uint j = 1; j < cHeight; j++)
01584               {
01585                 double v = c[3][cs].getVal(i+1,j-1);
01586                 double val = 0.0;
01587                 if(v > 0.0) val = v;
01588                 XY7.setVal(i,j, val);
01589               }
01590 
01591           
01592           
01593           
01594           ocs[7].push_back
01595             (c[7][cs] + 
01596              (((c[7][cs]*-model.p_B3) + 
01597                y[cs]*model.p_C3 - XY7*model.p_K3)*model.p_A3)*tstep);
01598 
01599           
01600           
01601           
01602           oes[7].push_back
01603             (e[7][cs] + 
01604              (((e[7][cs]*-model.p_B4) + 
01605                y[cs]*model.p_C4 - XY7*model.p_K4)*model.p_A4)*tstep);          
01606    
01607           
01608           
01609           
01610         }
01611       
01612 
01613       
01614       
01615       
01616       
01617       
01618       std::vector<Image<double> > f  = model.state->f[s];      
01619       std::vector<Image<double> > ofs(NUM_DIRS);
01620 
01621       uint w = f[0].getWidth();
01622       uint h = f[0].getHeight();
01623       std::vector<Image<double> > sump(NUM_DIRS);
01624       Image<double> sumDp(w,h, ZEROS);
01625       
01626       for(uint dir = 0; dir < NUM_DIRS; dir++)
01627         {
01628           Image<double> temp(w,h,ZEROS);
01629           for(uint cs = 0; cs < NUM_CS; cs++)
01630             {
01631               Image<double> temp2(w,h, ZEROS);
01632               Image<double> temp3 = takeMax(temp2, e[dir][cs]);
01633               temp += temp3;
01634             }
01635           sump[dir] = temp;
01636           sumDp += temp;
01637           
01638           
01639         }
01640 
01641       
01642       std::vector<Image<double> > sumDnedSump(NUM_DIRS);
01643       for(uint dir = 0; dir < NUM_DIRS; dir++)
01644         {
01645           sumDnedSump[dir] = sumDp - sump[dir];
01646           
01647           
01648           
01649 
01650         }
01651       
01652       
01653       
01654       for(uint dir = 0; dir < NUM_DIRS; dir++)
01655         {
01656           ofs[dir] = f[dir] + ((f[dir]*-model.p_A5) + 
01657                                ((f[dir]*-1.0)+model.p_B5)*sump[dir] - 
01658                                (f[dir]+model.p_C5)*sumDnedSump[dir])*tstep;
01659         }
01660 
01661 
01662       
01663       
01664       
01665       
01666       
01667       
01668       
01669       
01670 
01671       
01672       
01673       
01674       
01675       
01676       
01677       
01678 
01679       
01680       
01681       
01682       
01683       
01684       
01685       
01686 
01687       
01688       
01689       
01690       
01691       
01692       
01693       
01694 
01695 
01696 
01697 
01698 
01699 
01700 
01701 
01702 
01703 
01704 
01705 
01706 
01707 
01708 
01709 
01710 
01711 
01712 
01713 
01714 
01715 
01716 
01717 
01718 
01719 
01720 
01721 
01722 
01723 
01724 
01725 
01726 
01727 
01728       
01729 
01730 
01731       
01732       
01733 
01734       
01735       
01736       
01737       
01738       
01739       
01740       uint n = uint(pow(2.0, model.p_NumSpeeds - s - 1));
01741       
01742       for(uint dir = 0; dir < NUM_DIRS; dir++)
01743         {
01744           
01745           if(s == 0)
01746             {
01747               
01748               
01749               om[dir] = 
01750                 combine(takeMax(ofs[dir],Image<double>(w,h,ZEROS)), n)*(1.0/n);
01751             }
01752           
01753           else if(s == model.p_NumSpeeds-1)
01754             {
01755               
01756               
01757               om[dir] = 
01758                 om[dir] + takeMax(ofs[dir],Image<double>(w,h,ZEROS))*(1.0/n);
01759             }
01760           
01761           else
01762             {
01763               
01764               
01765               om[dir] = 
01766                 om[dir] + 
01767                 combine(takeMax(ofs[dir],Image<double>(w,h,ZEROS)), n)*(1.0/n);
01768             }
01769         }
01770 
01771 
01772 
01773 
01774 
01775 
01776  
01777  
01778  
01779  
01780  
01781  
01782  
01783  
01784  
01785 
01786 
01787 
01788 
01789       oI[s] = oIs;
01790       oa[s] = oas;
01791       ob[s] = obs;
01792       ox[s] = oxs;
01793       oy[s] = oys;
01794       oz[s] = ozs;
01795       oc[s] = ocs;
01796       oe[s] = oes;
01797       of[s] = ofs;
01798     }
01799 
01800  
01801  
01802  
01803  
01804  
01805  
01806  
01807  
01808  
01809  
01810 
01811   
01812   
01813   
01814   
01815   
01816   
01817   uint wom = om[0].getWidth();
01818   uint hom = om[0].getHeight();
01819   for(uint dir = 0; dir < NUM_DIRS; dir++)
01820     {
01821       
01822       for(uint i = 0; i < wom; i++)
01823         {
01824           om[dir].setVal(i, 0    , 0.0);
01825           om[dir].setVal(i, hom-1, 0.0);
01826         }
01827 
01828       
01829       for(uint j = 0; j < hom; j++)
01830         {
01831           om[dir].setVal(0    , j, 0.0);
01832           om[dir].setVal(wom-1, j, 0.0);
01833         }
01834     }
01835 
01836   
01837   
01838   
01839   
01840   std::vector<Image<double> > q = model.state->q;
01841   std::vector<Image<double> > Q = model.state->Q;
01842   std::vector<double> r = model.state->r;
01843   std::vector<double> R = model.state->R;
01844 
01845   std::vector<Image<double> > oq(NUM_DIRS);
01846   std::vector<Image<double> > oQ(NUM_DIRS);
01847   std::vector<Image<double> > qEx(NUM_DIRS);
01848 
01849   std::vector<Image<double> > m = model.state->m;
01850 
01851   
01852   std::vector<Image<double> > sumrz  = sumRz(R, model.p_w);
01853   std::vector<Image<double> > sumlxy = sumLxy(model.p_L, m);
01854   for(uint dir = 0; dir < NUM_DIRS; dir++)
01855     {
01856       qEx[dir] = sumlxy[dir] * (sumrz[dir]*(model.p_C6/model.p_M) +1.0) + 
01857         Q[dir]*model.p_D6; 
01858     }
01859 
01860   
01861   std::vector<Image<double> > sumvd = sumvD(model.p_vdD, Q);
01862   for(uint dir = 0; dir < NUM_DIRS; dir++)
01863     {
01864       oq[dir] =  q[dir] + 
01865         ((q[dir]*-model.p_A6) + ((q[dir]*-1.0)+model.p_B6) * 
01866          qEx[dir] - q[dir]*sumvd[dir])*tstep; 
01867     }
01868 
01869   
01870   uint wq = q[0].getWidth(); 
01871   uint hq = q[0].getHeight(); 
01872   for(uint dir = 0; dir < NUM_DIRS; dir++)
01873     {
01874       oQ[dir] = toPower(takeMax(q[dir]-model.p_theta6, 
01875                                 Image<double>(wq,hq,ZEROS)), 2.0);
01876     }
01877 
01878 
01879  
01880  
01881  
01882  
01883  
01884 
01885  
01886  
01887 
01888  
01889  
01890  
01891 
01892  
01893  
01894  
01895 
01896 
01897  
01898 
01899 
01900 
01901 
01902   
01903   
01904   
01905   
01906   std::vector<double> rEx(model.p_w->size());
01907   for(uint ri = 0; ri < model.p_w->size(); ri++)
01908     {
01909       double total = 0.0;
01910       for(uint dir = 0; dir < NUM_DIRS; dir++)
01911         {            
01912           
01913           
01914           for(uint i = 0; i < wq; i++)
01915             for(uint j = 0; j < hq; j++)
01916               total += (*model.p_w)[ri][dir].getVal(i,j)*Q[dir].getVal(i,j);
01917         }
01918       rEx[ri] = total;
01919       
01920 
01921     }
01922 
01923   
01924   
01925   
01926   std::vector<double> orr(r.size());
01927   double sumR = 0.0;
01928   for(uint i = 0; i < r.size(); i++) sumR += R[i];  
01929 
01930   for(uint i = 0; i < r.size(); i++)
01931     {
01932       orr[i] = r[i] + tstep*(-model.p_A7*r[i] + 
01933                             (model.p_B7-r[i])*((model.p_C7/model.p_N)*rEx[i] + 
01934                                                model.p_D7*R[i]) 
01935                              - model.p_E7*r[i]*(sumR-R[i])); 
01936       
01937       
01938       
01939       
01940       
01941       
01942       
01943       
01944     }
01945 
01946    
01947    
01948    
01949    
01950 
01951    
01952    
01953 
01954    
01955    
01956    
01957 
01958    
01959    
01960    
01961    
01962 
01963   
01964   
01965   std::vector<double> rminth(r.size());
01966   for(uint i = 0; i < r.size(); i++)
01967     {
01968       rminth[i] = pow(max(orr[i]-model.p_theta7,0.0), 2.0);
01969 
01970       
01971     }
01972   
01973   
01974   std::vector<double> oR(r.size());
01975   for(uint i = 0; i < r.size(); i++)
01976     {
01977       oR[i] =  rminth[i]/(pow(model.p_G7, 2.0) + rminth[i]);
01978 
01979       
01980     }
01981 
01982   
01983   model.state->a = oa;
01984   model.state->b = ob;
01985   model.state->x = ox;
01986   model.state->y = oy;
01987   model.state->z = oz;
01988   model.state->c = oc;
01989   model.state->e = oe;
01990   model.state->f = of;
01991   model.state->q = oq;
01992   model.state->Q = oQ;
01993   model.state->m = om;
01994   model.state->r = orr;
01995   model.state->R = oR;
01996 
01997 
01998 
01999 
02000 
02001 
02002 
02003 
02004 
02005   
02006   
02007   
02008  
02009  
02010  
02011  
02012  
02013  
02014  
02015  
02016 
02017  
02018  
02019  
02020  
02021  
02022  
02023  
02024  
02025 
02026   
02027   
02028   
02029   
02030   
02031   
02032   
02033   
02034 
02035  
02036  
02037  
02038  
02039  
02040  
02041  
02042  
02043 
02044  
02045  
02046  
02047  
02048  
02049  
02050  
02051  
02052  
02053 
02054   
02055   
02056   
02057   
02058   
02059   
02060   
02061   
02062 
02063 
02064   
02065   
02066   
02067   
02068   
02069   
02070   
02071 
02072   
02073   
02074   
02075   
02076   
02077   
02078   
02079 
02080   
02081   
02082   
02083   
02084   
02085   
02086   
02087 
02088  
02089  
02090  
02091  
02092  
02093  
02094  
02095  
02096   
02097   
02098   
02099   
02100   
02101   
02102   
02103   
02104 
02105 
02106 
02107 
02108 
02109 
02110 
02111 
02112 
02113 
02114 
02115 
02116 
02117 
02118  
02119  
02120  
02121  
02122 
02123  
02124  
02125  
02126  
02127 
02128  
02129  
02130  
02131  
02132 
02133 
02134   
02135 
02136           
02137           
02138           
02139           
02140           
02141           
02142           
02143           
02144 
02145 
02146   
02147   uint hind = 0; double max= oR[0];
02148   for(uint i = 0; i < oR.size(); i++)
02149     if(max<oR[i]){ max = oR[i]; hind = i; }
02150 
02151   LINFO("[[%d]]heading[%d]:(%3d %3d) %f ", 
02152         mainIndex, hind, model.Rlocs[hind].i, model.Rlocs[hind].j, max);
02153   mainIndex++;
02154 
02155   return model.Rlocs[hind];
02156 }
02157 
02158 
02159 
02160 
02161 
02162 std::vector<Image<double> > sumFxyI(Image<double> F, std::vector<Image<double> > I)
02163 {
02164   
02165   
02166 
02167   std::vector<Image<double> > out;
02168 
02169   
02170   for(uint o = 0; o < NUM_CS; o++)
02171     {
02172       uint fw = F.getWidth();
02173       uint fh = F.getHeight();
02174 
02175       
02176       if(fw*fh == 1) 
02177         {
02178           LFATAL("NOT YET TESTED");
02179           LERROR("SumFxyI: filter is scalar.");
02180           out.push_back(matrixMult(F,I[o]));        
02181         }
02182       
02183       else if((fw == 1)||(fh == 1))    
02184         {
02185           LFATAL("NOT YET TESTED");
02186           Image<double> temp = filter2(F/sum(F), I[o]);
02187           out.push_back(filter2(transpose((F/sum(F))), temp));
02188         }
02189       else 
02190         out.push_back(filter2(F, I[o]));
02191     }
02192   return out;
02193 }
02194 
02195 
02196 Image<double> filter2(Image<double> f, Image<double> d)
02197 {
02198   uint fw = f.getWidth();
02199   uint fh = f.getHeight();
02200 
02201   uint fwh = fw/2;
02202   uint fhh = fh/2;
02203 
02204   uint dw = d.getWidth();
02205   uint dh = d.getHeight();
02206   
02207   Image<double> ret(dw, dh, NO_INIT);
02208 
02209   
02210   for(uint di = 0; di < dw; di++)
02211     for(uint dj = 0; dj < dh; dj++)
02212       {
02213         double val = 0.0;
02214         for(uint fi = 0; fi < fw; fi++)
02215           for(uint fj = 0; fj < fh; fj++)
02216             {
02217               int i = di+fi-fwh;
02218               int j = dj+fj-fhh;
02219               if(i >= 0 && j >= 0 && i < int(dw) && j < int(dh)) 
02220                 {
02221                   val += d.getVal(i,j)*f.getVal(fi,fj);
02222                   
02223                   
02224                   
02225                 }
02226             }       
02227         ret.setVal(di,dj, val);
02228       }
02229   return ret;
02230 }
02231 
02232 
02233 
02234 
02235 Image<double> combine(Image<double> y, double f)
02236 {
02237   
02238   
02239   double ff;
02240   if(f > 1) { ff = 1/f; }
02241   else      { ff = f; f = 1/ff; } 
02242 
02243   uint w = y.getWidth();
02244   uint h = y.getHeight();
02245   uint width  = floor(w*ff);
02246   uint height = floor(h*ff);
02247   Image<double> x(width, height, NO_INIT);
02248 
02249   
02250 
02251   
02252   
02253   for(uint i = 0; i < width; i++)
02254     for(uint j = 0; j < height; j++)
02255       {
02256         
02257         double val = 0.0;
02258         uint sk = uint((i+1)*f-f);
02259         uint ek = uint((i+1)*f);
02260 
02261         uint sl = uint((j+1)*f-f);
02262         uint el = uint((j+1)*f);
02263 
02264         for(uint k = sk; k < ek; k++)
02265           for(uint l = sl; l < el; l++)
02266             {
02267               val += y.getVal(k,l);
02268               
02269               
02270               
02271               
02272                   
02273               
02274             }
02275 
02276 
02277         x.setVal(i,j,val);
02278 
02279       }
02280 
02281 
02282   
02283 
02284   return x;
02285 }
02286 
02287 
02288 
02289 
02290 std::vector<Image<double> > 
02291 sumLxy(rutz::shared_ptr<std::vector<Image<double> > > L, 
02292        std::vector<Image<double> > I)
02293 {
02294   std::vector<Image<double> > out(NUM_DIRS);
02295   
02296   
02297   
02298   for(uint dir = 0; dir < NUM_DIRS; dir++)
02299     {
02300       
02301       out[dir] = filter2((*L)[dir],I[dir]);
02302     }
02303   return out;
02304 }
02305 
02306 
02307 
02308 
02309 std::vector<Image<double> > 
02310 sumRz(std::vector<double> R, 
02311       rutz::shared_ptr<std::vector<std::vector<Image<double> > > > w)
02312 {
02313   
02314   std::vector<Image<double> > out(NUM_DIRS);
02315   uint width  = (*w)[0][0].getWidth();
02316   uint height = (*w)[0][0].getHeight();
02317   for(uint dir = 0; dir < NUM_DIRS; dir++)
02318     out[dir] = Image<double>(width, height, ZEROS);
02319 
02320   
02321   for(uint dir = 0; dir < NUM_DIRS; dir++)
02322     for(uint z = 0; z < R.size(); z++)
02323       
02324       out[dir] = out[dir] + (*w)[z][dir]*R[z]; 
02325 
02326   return out;
02327 }
02328 
02329 
02330 
02331 
02332 std::vector<Image<double> >
02333 sumvD(std::vector<double>v, std::vector<Image<double> > I)
02334 {
02335   std::vector<Image<double> > out(NUM_DIRS);
02336 
02337   
02338   for(uint dir = 0; dir < NUM_DIRS; dir++)
02339     {
02340       int d = int(dir)+1;
02341       
02342       
02343       
02344       
02345       
02346       
02347       
02348 
02349       
02350       
02351       
02352       
02353       
02354       out[dir] = 
02355         I[dir]*v[0] + 
02356         (I[dof(d+1)-1] + I[dof(d-1)-1])*v[1] + 
02357         (I[dof(d+2)-1] + I[dof(d-2)-1])*v[2] + 
02358         (I[dof(d+3)-1] + I[dof(d-3)-1])*v[3] + 
02359         (I[dof(d+4)-1])*v[4];
02360 
02361       
02362 
02363     }
02364 
02365   return out;
02366 }
02367 
02368 
02369 
02370 int dof(int x)
02371 {
02372   
02373   int y = (x+8)%8;
02374   
02375 
02376   
02377   y = (y==0)*8 + y;
02378   
02379 
02380   return y;
02381 }    
02382 
02383 
02384 void report(ViSTARSmodel &model)
02385 {
02386   
02387   
02388 
02389     
02390   
02391 
02392   
02393 
02394   
02395 
02396   
02397 
02398   
02399 
02400   
02401 
02402   
02403   
02404   
02405   
02406   
02407   
02408 
02409   
02410   
02411 }
02412            
02413            
02414            
02415            
02416            
02417            
02418            
02419            
02420            
02421            
02422            
02423            
02424 
02425 
02426 
02427 
02428 
02429 
02430