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 #include "Component/ModelManager.H"
00040 #include "Devices/DeviceOpts.H"
00041 #include "Devices/FrameGrabberConfigurator.H"
00042 #include "Devices/FrameGrabberFactory.H"
00043 #include "GUI/XWindow.H"
00044 #include "Image/DrawOps.H"
00045 #include "Image/CutPaste.H"
00046 #include "Image/Image.H"
00047 #include "Image/Pixels.H"
00048 #include "Image/MathOps.H"
00049 #include "Neuro/EnvVisualCortex.H"
00050 #include "Util/Timer.H"
00051 #include "Util/log.H"
00052 #include "Learn/Bayes.H"
00053 #include "Devices/BeoHead.H"
00054 #include "Envision/env_image_ops.h"
00055
00056 #include "GUI/DebugWin.H"
00057 #include <ctype.h>
00058 #include <deque>
00059 #include <iterator>
00060 #include <stdlib.h>
00061 #include <string>
00062 #include <vector>
00063 #include <map>
00064
00065 #define NumFeatureNames 7
00066 const char *featureNames[7] = {
00067 "red/green",
00068 "blue/yellow",
00069 "intensity",
00070 "steerable(01/04)",
00071 "steerable(02/04)",
00072 "steerable(03/04)",
00073 "steerable(04/04)"
00074 };
00075
00076
00077 void display(Image<PixRGB<byte> > &leftImg,
00078 const Image<byte> &leftSmap,
00079 const Point2D<int> &leftWinner,
00080 const byte maxVal);
00081 void display(const Image<PixRGB<byte> > &img,
00082 const Image<PixRGB<byte> > &smap, Point2D<int> &winner, Rectangle &rect);
00083 Rectangle getBoundBox();
00084 void showHist(std::vector<double> &hist, int pos);
00085 void showProb(int pos);
00086 void showFeatures(std::vector<double> &fv, int pos);
00087 void findMinMax(std::vector<double> &vec, double &min, double &max);
00088
00089 ModelManager *mgr;
00090 XWinManaged *xwin;
00091 XWinManaged *debugXWin;
00092 Timer timer;
00093 Image<PixRGB<byte> > disp;
00094 Point2D<int> curWinner;
00095 Point2D<int> learnPos;
00096 Dims imageDims;
00097 Bayes* bayesNet;
00098 byte SmaxVal = 0;
00099
00100 struct BiasParam
00101 {
00102 double mean;
00103 double var;
00104 };
00105
00106 #define NBINS 16
00107 #define NFEATURES NBINS
00108 #define FSIZE 75
00109
00110 std::map<const std::string, std::vector<double> > featuresHist;
00111 std::vector<double> featuresVal(NumFeatureNames,0);
00112
00113
00114 enum State {TRAIN, BIAS, MOVE, NO_BIAS};
00115 State state = NO_BIAS;
00116 Point2D<int> lastWinner;
00117 int smap_level = -1;
00118
00119 void normalize(std::vector<double> &hist)
00120 {
00121 double sum = 0;
00122 for(uint i=0; i<hist.size(); i++)
00123 {
00124 sum += hist[i];
00125 }
00126
00127 for(uint i=0; i<hist.size(); i++)
00128 {
00129 if (sum > 0)
00130 hist[i] *= (1/sum);
00131 else
00132 hist[i] = 0;
00133 }
00134 }
00135
00136
00137 double compBhattHist(const std::vector<double> &a_hist,
00138 const std::vector<double> &b_hist)
00139 {
00140 double bsum = 0;
00141 for(uint i=0; i<a_hist.size(); i++)
00142 {
00143 bsum += sqrt(a_hist[i]*b_hist[i]);
00144 }
00145 return (1-sqrt(1-bsum));
00146 }
00147
00148
00149 double compEquHist(const std::vector<double> &a_hist,
00150 const std::vector<double> &b_hist)
00151 {
00152 double bsum = 0;
00153 for(uint i=0; i<a_hist.size(); i++)
00154 {
00155 bsum += (a_hist[i]-b_hist[i])*(a_hist[i]-b_hist[i]);
00156 }
00157 return (1-sqrt(bsum));
00158 }
00159
00160
00161 double compProbHist(const std::vector<double> &a_hist,
00162 const std::vector<double> &b_hist)
00163 {
00164 double bsum = 0;
00165 for(uint i=0; i<a_hist.size(); i++)
00166 {
00167 double mean = bayesNet->getMean(0, i);
00168 double var = bayesNet->getStdevSq(0, i);
00169 double val = a_hist[i];
00170 if (var != 0)
00171 {
00172 double delta = -(val - mean) * (val - mean);
00173 double newVal = log(exp(delta/(2*var))/sqrt(2*M_PI*var));
00174
00175
00176
00177 bsum += newVal;
00178 }
00179 }
00180
00181 return (exp(bsum)/a_hist.size());
00182 }
00183
00184 int cMapLearnProc(const char *tagName, struct env_image *cmap)
00185 {
00186 intg32* src = cmap->pixels;
00187 int winX = learnPos.i >> smap_level;
00188 int winY = learnPos.j >> smap_level;
00189
00190 int foveaWidth = (FSIZE >> smap_level)/2;
00191 int foveaHeight = (FSIZE >> smap_level)/2;
00192
00193
00194 env_max_normalize_none_inplace(cmap, 0, 255);
00195
00196 int featureIdx = -1;
00197 for(int i=0; i<NumFeatureNames; i++)
00198 {
00199 if (!(strcmp(featureNames[i], tagName))){
00200 featureIdx = i;
00201 break;
00202 }
00203 }
00204
00205
00206 double maxVal = 0; int i= 0;
00207 for(int y=winY-foveaHeight; y<winY+foveaHeight; y++)
00208 for(int x=winX-foveaWidth; x<winX+foveaWidth; x++)
00209 {
00210 byte val = src[y*cmap->dims.w+x];
00211
00212 maxVal += val;
00213 i++;
00214
00215 }
00216 maxVal = maxVal;
00217
00218
00219
00220
00221
00222 featuresVal[featureIdx] = maxVal;
00223
00224 return 0;
00225 }
00226
00227 int cMapLeftBiasProc(const char *tagName, struct env_image *cmap)
00228 {
00229 intg32* src = cmap->pixels;
00230
00231 uint winX = learnPos.i >> smap_level;
00232 uint winY = learnPos.j >> smap_level;
00233
00234 uint foveaWidth = (FSIZE >> smap_level)/2;
00235 uint foveaHeight = (FSIZE >> smap_level)/2;
00236
00237
00238
00239 int featureIdx = -1;
00240 for(int i=0; i<NumFeatureNames; i++)
00241 {
00242 if (!(strcmp(featureNames[i], tagName))){
00243 featureIdx = i;
00244 break;
00245 }
00246 }
00247 if (featureIdx != -1)
00248 {
00249 struct env_image *outImg = new struct env_image;
00250 env_img_init(outImg, cmap->dims);
00251 intg32* outSrc = outImg->pixels;
00252
00253 env_max_normalize_none_inplace(cmap, 0, 255);
00254 double targetMean = bayesNet->getMean(0, featureIdx);
00255 double targetVar = bayesNet->getStdevSq(0, featureIdx);
00256
00257 featuresVal[featureIdx] = src[winY*cmap->dims.w+winX];
00258
00259 for(uint winY=0; winY<cmap->dims.h; winY++)
00260 for(uint winX=0; winX<cmap->dims.w; winX++)
00261
00262 {
00263
00264 if (winY>=foveaHeight && winY<cmap->dims.h-foveaHeight &&
00265 winX>=foveaWidth && winX<cmap->dims.w-foveaWidth)
00266 {
00267 double maxVal = 0; int i= 0;
00268 for(uint fy=winY-foveaHeight; fy<winY+foveaHeight; fy++)
00269 for(uint fx=winX-foveaWidth; fx<winX+foveaWidth; fx++)
00270 {
00271 byte val = src[fy*cmap->dims.w+fx];
00272 maxVal += val;
00273 i++;
00274 }
00275 maxVal = maxVal;
00276
00277 double val = maxVal;
00278 double delta = -(val - targetMean) * (val - targetMean);
00279 double newVal = (exp(delta/(2*targetVar))/sqrt(2*M_PI*targetVar))*1000;
00280
00281 outSrc[(winY)*cmap->dims.w+(winX)] = (intg32)newVal;
00282 } else {
00283 outSrc[(winY)*cmap->dims.w+(winX)] = 0;
00284 }
00285 }
00286 env_img_swap(cmap, outImg);
00287 env_img_make_empty(outImg);
00288
00289 }
00290
00291 return 0;
00292 }
00293
00294 int cMapRightBiasProc(const char *tagName, struct env_image *cmap)
00295 {
00296 intg32* src = cmap->pixels;
00297
00298 uint foveaWidth = (FSIZE >> smap_level)/2;
00299 uint foveaHeight = (FSIZE >> smap_level)/2;
00300
00301
00302 struct env_image *outImg = new struct env_image;
00303 env_img_init(outImg, cmap->dims);
00304 intg32* outSrc = outImg->pixels;
00305
00306
00307 env_max_normalize_none_inplace(cmap, 0, 255);
00308
00309 std::vector<double> fhist = featuresHist[std::string(tagName)];
00310
00311 for(uint winY=0; winY<cmap->dims.h; winY++)
00312 for(uint winX=0; winX<cmap->dims.w; winX++)
00313
00314 {
00315
00316 if (winY>=foveaHeight && winY<cmap->dims.h-foveaHeight &&
00317 winX>=foveaWidth && winX<cmap->dims.w-foveaWidth)
00318 {
00319 std::vector<double> hist(NBINS, 1);
00320
00321 for(uint y=winY-foveaHeight; y<winY+foveaHeight; y++)
00322 for(uint x=winX-foveaWidth; x<winX+foveaWidth; x++)
00323 {
00324 byte val = src[y*cmap->dims.w+x];
00325 hist[(int)val/(256/NBINS)]++;
00326 }
00327 normalize(hist);
00328
00329
00330 double compVal = compBhattHist(hist, fhist);
00331
00332
00333 outSrc[(winY)*cmap->dims.w+(winX)] = (int)(compVal*256000000);
00334
00335 } else {
00336
00337 outSrc[(winY)*cmap->dims.w+(winX)] = 0;
00338 }
00339 }
00340
00341 env_img_swap(cmap, outImg);
00342 env_img_make_empty(outImg);
00343
00344
00345 return 0;
00346 }
00347
00348 bool debug = 0;
00349 bool training = false;
00350 bool keepTraining = false;
00351 bool tracking = false;
00352 int trackingTime = 0;
00353
00354 int main(int argc, const char **argv)
00355 {
00356
00357 mgr = new ModelManager("USC Robot Head");
00358
00359 nub::ref<FrameGrabberConfigurator>
00360 gbc(new FrameGrabberConfigurator(*mgr));
00361 mgr->addSubComponent(gbc);
00362
00363 nub::ref<EnvVisualCortex> leftEvc(new EnvVisualCortex(*mgr));
00364 mgr->addSubComponent(leftEvc);
00365
00366 nub::soft_ref<BeoHead> beoHead(new BeoHead(*mgr));
00367 mgr->addSubComponent(beoHead);
00368
00369 mgr->exportOptions(MC_RECURSE);
00370 mgr->setOptionValString(&OPT_EvcMaxnormType, "None");
00371
00372
00373
00374 mgr->setOptionValString(&OPT_EvcLevelSpec, "2,4,1,1,3");
00375
00376 leftEvc->setFweight(0);
00377 leftEvc->setMweight(0);
00378
00379
00380
00381
00382 if (mgr->parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00383
00384 nub::soft_ref<FrameIstream> gbLeft(makeV4Lgrabber(*mgr));
00385 gbLeft->setModelParamVal("FrameGrabberDevice",std::string("/dev/video0"));
00386 gbLeft->setModelParamVal("FrameGrabberChannel",1);
00387 mgr->addSubComponent(gbLeft);
00388
00389
00390
00391
00392
00393
00394 if (gbLeft.isInvalid())
00395 LFATAL("You need to select a frame grabber type via the "
00396 "--fg-type=XX command-line option for this program "
00397 "to be useful");
00398 imageDims = Dims(gbLeft->getWidth(), gbLeft->getHeight());
00399
00400 xwin = new XWinManaged(Dims(imageDims.w()*2,imageDims.h()*2+20), -1, -1, "ILab Robot Head Demo");
00401 debugXWin = new XWinManaged(Dims(255+10,255), -1, -1, "Debug Win");
00402 disp = Image<PixRGB<byte> >(imageDims.w(),imageDims.h()+20, ZEROS);
00403
00404
00405 mgr->start();
00406
00407 smap_level = leftEvc->getMapLevel();
00408
00409
00410
00411 bayesNet = new Bayes(NumFeatureNames, 1);
00412
00413
00414 gbLeft->startStream();
00415
00416 Image<double> featureValuesImg(72,1,NO_INIT);
00417
00418 timer.reset();
00419
00420 byte leftMaxVal;
00421 Point2D<int> leftMaxPos;
00422 double currentLeftPanPos = 0;
00423 double currentLeftTiltPos = 0;
00424
00425 int frame = 0;
00426
00427 beoHead->relaxNeck();
00428
00429 while(1) {
00430
00431 Image< PixRGB<byte> > leftImg = gbLeft->readRGB();
00432
00433
00434
00435 leftEvc->input(leftImg);
00436
00437 Image<float> leftVcxmap = leftEvc->getVCXmap();
00438
00439
00440
00441 if (lastWinner.isValid())
00442 {
00443 int w = leftVcxmap.getWidth();
00444 int i = 0;
00445 for (Image<float>::iterator itr = leftVcxmap.beginw(), stop = leftVcxmap.endw();
00446 itr != stop; ++itr, i++) {
00447 int x = i % w;
00448 int y = i / w;
00449 float dist = lastWinner.distance(Point2D<int>(x,y));
00450 *itr = *itr - (1*dist);
00451 }
00452 }
00453
00454
00455 inplaceNormalize(leftVcxmap, 0.0F, 255.0F);
00456 Image<byte> leftSmap = leftVcxmap;
00457
00458 findMax(leftSmap, leftMaxPos, leftMaxVal);
00459
00460 lastWinner = leftMaxPos;
00461
00462 Point2D<int> clickPos = xwin->getLastMouseClick();
00463
00464 if (state == BIAS || state == MOVE)
00465 curWinner = Point2D<int>(leftMaxPos.i *(1<<smap_level),
00466 leftMaxPos.j*(1<<smap_level));
00467
00468 if (state == TRAIN)
00469 {
00470
00471
00472
00473 }
00474
00475 if (clickPos.isValid())
00476 {
00477 switch(state)
00478 {
00479 case TRAIN:
00480 state = BIAS;
00481 printf("Biasing smap\n");
00482
00483
00484 leftEvc->setSubmapPostProc(&cMapLeftBiasProc);
00485
00486
00487 lastWinner.i = -1; lastWinner.j = -1;
00488
00489 break;
00490 case BIAS:
00491 printf("Moving\n");
00492 printf("TC: %i %i %f %f\n", leftMaxPos.i, leftMaxPos.j,
00493 currentLeftPanPos, currentLeftTiltPos);
00494
00495 state = NO_BIAS;
00496 break;
00497 case MOVE:
00498 printf("Next pos\n");
00499 state = BIAS;
00500
00501
00502
00503
00504
00505 break;
00506 case NO_BIAS:
00507 state = TRAIN;
00508 learnPos = clickPos;
00509
00510 curWinner = clickPos;
00511
00512 leftEvc->setSubmapPostProc(&cMapLearnProc);
00513 printf("Learning from %ix%i\n", learnPos.i, learnPos.j);
00514 break;
00515 }
00516 }
00517
00518 if (state == BIAS && frame > 200)
00519 {
00520 printf("Moving\n");
00521 printf("TC: %i %i %f %f\n", leftMaxPos.i, leftMaxPos.j,
00522 currentLeftPanPos, currentLeftTiltPos);
00523
00524 }
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535 if (state==TRAIN)
00536 {
00537 bayesNet->learn(featuresVal, (uint)0);
00538 }
00539
00540
00541
00542 if (state == MOVE && frame > 20)
00543 {
00544
00545
00546
00547
00548 double leftPanErr = (leftSmap.getWidth()/2)-leftMaxPos.i;
00549
00550
00551 double leftTiltErr = (leftSmap.getHeight()/2)-leftMaxPos.j;
00552
00553
00554 if (fabs(leftPanErr) > 1.0 ||
00555 fabs(leftTiltErr) > 1.0)
00556 {
00557
00558
00559
00560
00561
00562
00563
00564 currentLeftPanPos += (-0.0597*leftMaxPos.i+1.16);
00565 currentLeftTiltPos += (-0.0638*leftMaxPos.j + 0.942);
00566
00567
00568
00569
00570
00571 beoHead->setLeftEyePan(currentLeftPanPos);
00572 beoHead->setLeftEyeTilt(currentLeftTiltPos);
00573
00574 beoHead->setRightEyePan(currentLeftPanPos);
00575 beoHead->setRightEyeTilt(currentLeftTiltPos);
00576
00577 }
00578
00579 frame = 0;
00580 }
00581
00582 int key = xwin->getLastKeyPress();
00583
00584 if (key != -1)
00585 {
00586 switch(key)
00587 {
00588 case 98:
00589 currentLeftTiltPos += 0.05;
00590 if (currentLeftTiltPos > 1.0) currentLeftTiltPos = 1.0;
00591 break;
00592 case 104:
00593 currentLeftTiltPos -= 0.05;
00594 if (currentLeftTiltPos < -1.0) currentLeftTiltPos = -1.0;
00595 break;
00596 case 100:
00597 currentLeftPanPos -= 0.05;
00598 if (currentLeftPanPos < -1.0) currentLeftPanPos = -1.0;
00599 break;
00600 case 102:
00601 currentLeftPanPos += 0.05;
00602 if (currentLeftPanPos > 1.0) currentLeftPanPos = 1.0;
00603 break;
00604 }
00605
00606 printf("%f %f\n", currentLeftPanPos, currentLeftTiltPos);
00607 beoHead->setLeftEyePan(currentLeftPanPos);
00608 beoHead->setLeftEyeTilt(currentLeftTiltPos);
00609
00610 }
00611
00612
00613
00614 showFeatures(featuresVal, 0);
00615
00616
00617
00618 display(leftImg, leftSmap, leftMaxPos,
00619 SmaxVal);
00620 frame++;
00621 }
00622
00623
00624
00625 mgr->stop();
00626
00627
00628 return 0;
00629 }
00630
00631 void display(Image<PixRGB<byte> > &leftImg,
00632 const Image<byte> &leftSmap,
00633 const Point2D<int> &leftWinner,
00634 const byte maxVal)
00635 {
00636 static int avgn = 0;
00637 static uint64 avgtime = 0;
00638 static double fps = 0;
00639 char msg[255];
00640
00641
00642 drawCircle(leftImg,
00643 Point2D<int>(leftWinner.i *(1<<smap_level), leftWinner.j*(1<<smap_level)),
00644 30, PixRGB<byte>(255,0,0));
00645 drawCross(leftImg, Point2D<int>(leftImg.getWidth()/2, leftImg.getHeight()/2),
00646 PixRGB<byte>(0,255,0));
00647 sprintf(msg, "%i", maxVal);
00648 writeText(leftImg,
00649 Point2D<int>(leftWinner.i *(1<<smap_level), leftWinner.j*(1<<smap_level)),
00650 msg, PixRGB<byte>(255), PixRGB<byte>(127));
00651
00652 xwin->drawImage(leftImg, 0, 0);
00653 Image<PixRGB<byte> > leftSmapDisp = toRGB(quickInterpolate(leftSmap, 1 << smap_level));
00654 xwin->drawImage(leftSmapDisp, 0, leftImg.getHeight());
00655
00656
00657
00658 avgn++;
00659 avgtime += timer.getReset();
00660 if (avgn == 20)
00661 {
00662 fps = 1000.0F / double(avgtime) * double(avgn);
00663 avgtime = 0;
00664 avgn = 0;
00665 }
00666
00667 sprintf(msg, "%.1ffps ", fps);
00668 switch (state)
00669 {
00670 case TRAIN: sprintf(msg, "%s Train ", msg); break;
00671 case BIAS: sprintf(msg, "%s Bias ", msg); break;
00672 case MOVE: sprintf(msg, "%s Move ", msg); break;
00673 case NO_BIAS: sprintf(msg, "%s No Bias ", msg); break;
00674 }
00675
00676
00677 Image<PixRGB<byte> > infoImg(leftImg.getWidth()*2, 20, NO_INIT);
00678 writeText(infoImg, Point2D<int>(0,0), msg,
00679 PixRGB<byte>(255), PixRGB<byte>(127));
00680 xwin->drawImage(infoImg, 0, leftImg.getHeight()*2);
00681
00682 }
00683
00684 void display(const Image<PixRGB<byte> > &img, const Image<PixRGB<byte> > &out,
00685 Point2D<int> &winner, Rectangle &rect)
00686 {
00687 static int avgn = 0;
00688 static uint64 avgtime = 0;
00689 static double fps = 0;
00690 char msg[255];
00691
00692 inplacePaste(disp, img, Point2D<int>(0,0));
00693 drawCircle(disp, Point2D<int>(winner.i, winner.j), 30, PixRGB<byte>(255,0,0));
00694 drawRect(disp, rect, PixRGB<byte>(255,0,0));
00695 inplacePaste(disp, out, Point2D<int>(img.getWidth(), 0));
00696
00697
00698 avgn++;
00699 avgtime += timer.getReset();
00700 if (avgn == 20)
00701 {
00702 fps = 1000.0F / double(avgtime) * double(avgn);
00703 avgtime = 0;
00704 avgn = 0;
00705 }
00706
00707 sprintf(msg, "%.1ffps ", fps);
00708
00709 writeText(disp, Point2D<int>(0,img.getHeight()), msg,
00710 PixRGB<byte>(255), PixRGB<byte>(127));
00711
00712 xwin->drawImage(disp);
00713
00714 }
00715
00716 Rectangle getBoundBox()
00717 {
00718 return Rectangle::tlbrI(130,130,190,190);
00719 }
00720
00721 void showHist(std::vector<double> &hist, int loc)
00722 {
00723 int w = 255, h = 255;
00724
00725 if (hist.size() == 0) return;
00726
00727 int dw = w / hist.size();
00728 Image<byte> res(w, h, ZEROS);
00729
00730
00731 for (int j = 0; j < 10; j++)
00732 drawLine(res, Point2D<int>(0, int(j * 0.1F * h)),
00733 Point2D<int>(w-1, int(j * 0.1F * h)), byte(64));
00734 drawLine(res, Point2D<int>(0, h-1), Point2D<int>(w-1, h-1), byte(64));
00735
00736 double minii, maxii;
00737 findMinMax(hist, minii, maxii);
00738
00739
00740 if (maxii == minii) minii = maxii - 1.0F;
00741
00742 double range = maxii - minii;
00743
00744 for (uint i = 0; i < hist.size(); i++)
00745 {
00746 int t = abs(h - int((hist[i] - minii) / range * double(h)));
00747
00748
00749 if (t < h-1)
00750 {
00751 for (int j = 0; j < dw; j++)
00752 drawLine(res,
00753 Point2D<int>(dw * i + j, t),
00754 Point2D<int>(dw * i + j, h - 1),
00755 byte(255));
00756
00757 }
00758 }
00759 debugXWin->drawImage(res,loc,0);
00760 }
00761
00762 void showFeatures(std::vector<double> &fv, int loc)
00763 {
00764 int w = 255, h = 255;
00765
00766 if (fv.size() == 0) return;
00767
00768 int dw = w / fv.size();
00769 Image<byte> res(w, h, ZEROS);
00770
00771
00772 for (int j = 0; j < 10; j++)
00773 drawLine(res, Point2D<int>(0, int(j * 0.1F * h)),
00774 Point2D<int>(w-1, int(j * 0.1F * h)), byte(64));
00775 drawLine(res, Point2D<int>(0, h-1), Point2D<int>(w-1, h-1), byte(64));
00776
00777 double minii = 0, maxii = 255;
00778
00779
00780
00781
00782 if (maxii == minii) minii = maxii - 1.0F;
00783
00784 double range = maxii - minii;
00785
00786 for (uint i = 0; i < fv.size(); i++)
00787 {
00788 int t = abs(h - int((fv[i] - minii) / range * double(h)));
00789
00790
00791 if (t < h-1)
00792 {
00793 for (int j = 0; j < dw; j++)
00794 drawLine(res,
00795 Point2D<int>(dw * i + j, t),
00796 Point2D<int>(dw * i + j, h - 1),
00797 byte(255));
00798
00799 }
00800 }
00801 debugXWin->drawImage(res,loc,0);
00802
00803
00804 }
00805
00806 void showProb(int loc)
00807 {
00808 int w = 255, h = 255;
00809 uint size = NumFeatureNames;
00810
00811 if (size == 0) return;
00812
00813 int dw = w / size;
00814 Image<PixRGB<byte> > res(w, h, ZEROS);
00815
00816
00817 for (int j = 0; j < 10; j++)
00818 drawLine(res, Point2D<int>(0, int(j * 0.1F * h)),
00819 Point2D<int>(w-1, int(j * 0.1F * h)), PixRGB<byte>(64, 64, 64));
00820 drawLine(res, Point2D<int>(0, h-1), Point2D<int>(w-1, h-1), PixRGB<byte>(64, 64, 64));
00821
00822 double minii = 0, maxii = 255;
00823
00824
00825
00826
00827 if (maxii == minii) minii = maxii - 1.0F;
00828
00829 double range = maxii - minii;
00830
00831 for (uint i = 0; i < size; i++)
00832 {
00833 double mean = bayesNet->getMean(0, i);
00834
00835
00836 int t = abs(h - int((mean - minii) / range * double(h)));
00837
00838
00839 if (t < h-1)
00840 {
00841 for (int j = 0; j < dw; j++)
00842 drawLine(res,
00843 Point2D<int>(dw * i + j, t),
00844 Point2D<int>(dw * i + j, h - 1),
00845 PixRGB<byte>(255, 0, 0));
00846
00847
00848 }
00849 }
00850 debugXWin->drawImage(res,loc,0);
00851
00852
00853 }
00854
00855 void findMinMax(std::vector<double> &vec, double &min, double &max)
00856 {
00857 max = vec[0];
00858 min = max;
00859 for (uint n = 1 ; n < vec.size() ; n++)
00860 {
00861 if (vec[n] > max) max = vec[n];
00862 if (vec[n] < min) min = vec[n];
00863 }
00864 }
00865