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 "Image/OpenCVUtil.H"
00040 #include "Component/ModelManager.H"
00041 #include "Image/Image.H"
00042 #include "Image/Pixels.H"
00043 #include "Image/ColorOps.H"
00044 #include "Image/ShapeOps.H"
00045 #include "Image/MathOps.H"
00046 #include "Image/CutPaste.H"
00047 #include "Image/Transforms.H"
00048 #include "Media/FrameSeries.H"
00049 #include "Raster/Raster.H"
00050 #include "Util/log.H"
00051 #include "Util/Timer.H"
00052 #include "Learn/SOFM.H"
00053 #include "GUI/XWinManaged.H"
00054 #include "CMapDemo/SaliencyCMapMT.H"
00055 #include "SIFT/ScaleSpace.H"
00056 #include "SIFT/VisualObject.H"
00057 #include "SIFT/Keypoint.H"
00058 #include "SIFT/VisualObjectDB.H"
00059 #include "Image/FourierEngine.H"
00060 #include "RCBot/Motion/MotionEnergy.H"
00061
00062 #include <signal.h>
00063
00064
00065
00066 #define NAVG 20
00067
00068 static bool goforever = true;
00069
00070 void terminate(int s)
00071 { LERROR("*** INTERRUPT ***"); goforever = false; exit(0);}
00072
00073 ImageSet<float> bias(14);
00074 ImageSet<float> cmap1(14);
00075 ImageSet<float> cmap2(14);
00076
00077 struct KeyPoint {
00078 int x;
00079 int y;
00080 float val;
00081 };
00082
00083 #define ROI_SIZE 10
00084 std::vector<KeyPoint>* getKeypoints(Image<float> &ima){
00085 Image<float> wima = ima;
00086
00087 std::vector<KeyPoint> *keypoints = new std::vector<KeyPoint>;
00088
00089
00090
00091
00092 for(int i=0; i<10; i++){
00093
00094 float val; Point2D<int> winner; findMax(wima, winner, val);
00095 KeyPoint key;
00096 key.x = winner.i;
00097 key.y = winner.j;
00098 key.val = val;
00099 keypoints->push_back(key);
00100
00101
00102 drawDisk(wima, winner, ROI_SIZE, 0.0F);
00103
00104 }
00105
00106
00107 return keypoints;
00108
00109 }
00110
00111
00112 double compImg(std::vector< rutz::shared_ptr<Keypoint> > &obj1,
00113 std::vector< rutz::shared_ptr<Keypoint> > &obj2){
00114
00115
00116 if (obj1.size() != obj2.size()){
00117 LINFO("Objects size dont match %"ZU" %"ZU, obj1.size(), obj2.size());
00118
00119 }
00120
00121 std::vector<double> objM1;
00122 std::vector<double> objM2;
00123 std::vector<double> objDiff;
00124
00125
00126
00127 if (obj1.size() > obj2.size()){
00128 for(unsigned int i=0; i<obj2.size(); i++){
00129 objM1.push_back(obj1[i]->getO()*360+obj1[i]->getY()*160+obj1[i]->getX());
00130 objM2.push_back(obj2[i]->getO()*360+obj2[i]->getY()*160+obj2[i]->getX());
00131 }
00132 } else {
00133 for(unsigned int i=0; i<obj1.size(); i++){
00134 objM1.push_back(obj1[i]->getO()*360+obj1[i]->getY()*160+obj1[i]->getX());
00135 objM2.push_back(obj2[i]->getO()*360+obj2[i]->getY()*160+obj2[i]->getX());
00136 }
00137 }
00138
00139
00140
00141 std::sort(objM1.begin(), objM1.end());
00142 std::sort(objM2.begin(), objM2.end());
00143
00144
00145 for(unsigned int i=0; i<objM1.size(); i++){
00146 objDiff.push_back(fabs(objM1[i] - objM2[i]));
00147 }
00148
00149
00150 printf("M1: ");
00151 for(unsigned int i=0; i<objM1.size(); i++){
00152 printf("%f ", objM1[i]);
00153 }
00154 printf("\n");
00155
00156 printf("M2: ");
00157 for(unsigned int i=0; i<objM2.size(); i++){
00158 printf("%f ", objM2[i]);
00159 }
00160 printf("\n");
00161
00162 printf("Diff: ");
00163 for(unsigned int i=0; i<objDiff.size(); i++){
00164 printf("%f ", objDiff[i]);
00165 }
00166 printf("\n");
00167
00168
00169
00170 double sum = 0;
00171 printf("Delta: ");
00172 for(unsigned int i=0; i<objDiff.size()-1; i++){
00173 double diff = fabs(objDiff[i]-objDiff[i+1]);
00174 sum += diff;
00175 printf("%f ", diff);
00176 }
00177 printf("\n");
00178
00179
00180 LINFO("Diffrance %f", sum);
00181
00182 return sum;
00183 }
00184
00185
00186
00187 int main(int argc, char** argv)
00188 {
00189
00190 MYLOGVERB = LOG_INFO;
00191
00192 CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv,"omniORB4");
00193
00194
00195 ModelManager manager("Test SOFM");
00196
00197
00198 nub::ref<InputFrameSeries> ifs(new InputFrameSeries(manager));
00199 manager.addSubComponent(ifs);
00200
00201
00202 nub::ref<SaliencyMT> smt(new SaliencyMT(manager, orb, 0));
00203 manager.addSubComponent(smt);
00204
00205
00206 if (manager.parseCommandLine((const int)argc, (const char**)argv, "", 0, 0) == false)
00207 return(1);
00208
00209
00210 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00211 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00212 signal(SIGALRM, terminate);
00213
00214
00215
00216 manager.start();
00217
00218 Timer masterclock;
00219
00220
00221 masterclock.reset();
00222 ifs->update(masterclock.getSimTime());
00223 const Image< PixRGB<byte> > input = ifs->readRGB();
00224 const int w = input.getWidth();
00225 const int h = input.getHeight();
00226
00227 LINFO("Input %ix%i", w, h);
00228 XWinManaged xwin2(Dims(256*3, 256), -1, -1, "SOFM Output");
00229 XWinManaged xwin(Dims(256*3, 256), -1, -1, "SOFM Output");
00230
00231
00232 int ii=0;
00233
00234 uint64 avgtime = 0; int avgn = 0;
00235 float fps = 0.0F;
00236 Timer tim;
00237
00238 char info[1000];
00239 sprintf(info, "----");
00240
00241 Image<PixRGB<byte> > disp(256*3, 256, NO_INIT);
00242 Image<PixRGB<byte> > disp2(256*3, 256, NO_INIT);
00243
00244
00245
00246
00247 Image<PixRGB<byte> > cima = rescale(Raster::ReadRGB("/home/elazary/images/backyard/trial1/frame001000.ppm"), Dims(160,120));
00248
00249 rutz::shared_ptr<VisualObject> voComp(new VisualObject("Loc3", "Loc3", cima));
00250
00251 Image<float> SMapComp = smt->getSMap(cima);
00252 for(int i=0; i<14; i++){
00253 if (smt->cmaps[i].initialized()){
00254 cmap1[i] = smt->cmaps[i];
00255
00256 }
00257 }
00258
00259
00260
00261
00262
00263
00264 double minSMapDist = 999999999;
00265 int minSMap = 0;
00266
00267
00268
00269
00270 double minSiftDist = 99999999;
00271 int minSift = 0;
00272
00273 while(goforever) {
00274
00275
00276
00277 FrameState is = FRAME_NEXT;
00278 for(int i=0; i<100 && is != FRAME_COMPLETE; i++)
00279 is = ifs->update(masterclock.getSimTime());
00280 if (is == FRAME_COMPLETE)
00281 {
00282 LINFO("quitting because input is complete");
00283 break;
00284 }
00285
00286 if (is == FRAME_NEXT || is == FRAME_FINAL)
00287 {
00288 Image< PixRGB<byte> > ima = ifs->readRGB();
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298 rutz::shared_ptr<VisualObject> vo(new VisualObject("Img", "Img", ima));
00299
00300 Image<PixRGB<byte> > img1 = cima;
00301 Image<PixRGB<byte> > img2 = ima;
00302
00303
00304 img1 = voComp->getKeypointImage();
00305 img2 = vo->getKeypointImage();
00306
00307
00308 std::vector< rutz::shared_ptr<Keypoint> > keypoints1 = voComp->getKeypoints();
00309 std::vector< rutz::shared_ptr<Keypoint> > keypoints2 = vo->getKeypoints();
00310
00311 double imgDist = compImg(keypoints1, keypoints2);
00312
00313
00314 disp = rescale(ima, Dims(256, 256));
00315 disp = concatX(disp, rescale(img1, Dims(256, 256)));
00316 disp = concatX(disp, rescale(img2, Dims(256, 256)));
00317
00318
00319
00320 xwin.drawImage(disp);
00321
00322 getchar();
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 if (imgDist < minSMapDist){
00384 minSMapDist = imgDist;
00385 minSMap = ifs->frame();
00386 }
00387
00388 LINFO("Distance for %i = %f", ifs->frame(), imgDist);
00389
00390
00391 avgtime += tim.getReset(); avgn ++;
00392 if (avgn == NAVG)
00393 {
00394 fps = 1000.0F / float(avgtime) * float(avgn);
00395 avgtime = 0; avgn = 0;
00396 }
00397
00398
00399 sprintf(info, "%06u %.1ffps ", ii++, fps);
00400
00401
00402 ii++;
00403
00404 }
00405
00406
00407 }
00408
00409 LINFO("BestSmapMatch %i SMapDist = %f", minSMap, minSMapDist);
00410
00411 LINFO("BestSiftMatch %i SiftDist = %f", minSift, minSiftDist);
00412
00413
00414 manager.stop();
00415
00416
00417 return 0;
00418 }
00419
00420
00421
00422
00423
00424