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