00001 /*!@file RCBot/test-img.C 00002 */ 00003 00004 // //////////////////////////////////////////////////////////////////// // 00005 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001 by the // 00006 // University of Southern California (USC) and the iLab at USC. // 00007 // See http://iLab.usc.edu for information about this project. // 00008 // //////////////////////////////////////////////////////////////////// // 00009 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00010 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00011 // in Visual Environments, and Applications'' by Christof Koch and // 00012 // Laurent Itti, California Institute of Technology, 2001 (patent // 00013 // pending; application number 09/912,225 filed July 23, 2001; see // 00014 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00015 // //////////////////////////////////////////////////////////////////// // 00016 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00017 // // 00018 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00019 // redistribute it and/or modify it under the terms of the GNU General // 00020 // Public License as published by the Free Software Foundation; either // 00021 // version 2 of the License, or (at your option) any later version. // 00022 // // 00023 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00024 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00025 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00026 // PURPOSE. See the GNU General Public License for more details. // 00027 // // 00028 // You should have received a copy of the GNU General Public License // 00029 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00030 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00031 // Boston, MA 02111-1307 USA. // 00032 // //////////////////////////////////////////////////////////////////// // 00033 // 00034 // Primary maintainer for this file: Lior Elazary <elazary@usc.edu> 00035 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/RCBot/test-img.C $ 00036 // $Id: test-img.C 13993 2010-09-20 04:54:23Z itti $ 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 //! Number of frames over which average framerate is computed 00066 #define NAVG 20 00067 00068 static bool goforever = true; 00069 //! Signal handler (e.g., for control-C) 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; //Copy the image for debuging. Could be removed when actuly running because we dont 00086 //care about the image any more. 00087 std::vector<KeyPoint> *keypoints = new std::vector<KeyPoint>; 00088 00089 //Try PCA 00090 00091 //get the 10 most intersting keypoints and thier relationship 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 //IOR 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 //return 999999; 00119 } 00120 00121 std::vector<double> objM1; 00122 std::vector<double> objM2; 00123 std::vector<double> objDiff; 00124 00125 00126 //map cordinates 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 //sort the arrays 00141 std::sort(objM1.begin(), objM1.end()); 00142 std::sort(objM2.begin(), objM2.end()); 00143 00144 //find the diffrance 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 //compute the relationship 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; // suppress debug messages 00191 00192 CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv,"omniORB4"); 00193 00194 // Instantiate a ModelManager: 00195 ModelManager manager("Test SOFM"); 00196 00197 // Instantiate our various ModelComponents: 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 // Parse command-line: 00206 if (manager.parseCommandLine((const int)argc, (const char**)argv, "", 0, 0) == false) 00207 return(1); 00208 00209 //catch signals and redirect them to terminate for clean exit: 00210 signal(SIGHUP, terminate); signal(SIGINT, terminate); 00211 signal(SIGQUIT, terminate); signal(SIGTERM, terminate); 00212 signal(SIGALRM, terminate); 00213 00214 00215 // let's get all our ModelComponent instances started: 00216 manager.start(); 00217 00218 Timer masterclock; // master clock for simulations 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 // main loop: 00232 int ii=0; 00233 00234 uint64 avgtime = 0; int avgn = 0; // for average framerate 00235 float fps = 0.0F; // to display framerate 00236 Timer tim; // for computation of framerate 00237 00238 char info[1000]; // general text buffer for various info messages 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 //Get the image 00246 //Compute Saliency Map 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 //inplaceNormalize(SMapComp, 0.0F, 255.0F); 00261 00262 00263 00264 double minSMapDist = 999999999; 00265 int minSMap = 0; 00266 00267 // double minSMapDistFFT = 99999999; 00268 // int minSMapFFT = 0; 00269 00270 double minSiftDist = 99999999; 00271 int minSift = 0; 00272 00273 while(goforever) { 00274 00275 // read new image in? 00276 00277 FrameState is = FRAME_NEXT; 00278 for(int i=0; i<100 && is != FRAME_COMPLETE; i++) //advance by 100 frames 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) // new frame 00287 { 00288 Image< PixRGB<byte> > ima = ifs->readRGB(); 00289 00290 //Image<float> lum = luminance(ima); 00291 00292 //Compute Saliency Map 00293 // 00294 00295 00296 ///////////////////////////// SIFT /////////////////////////// 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 //double imgDist = voComp->getFeatureDistSq(vo); 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 double distance = 0; 00329 Image<float> SMap = smt->getSMap(ima); 00330 for(int i=6; i<7; i++){ 00331 if (smt->cmaps[i].initialized()){ 00332 cmap2[i] = smt->cmaps[i]; 00333 00334 inplaceNormalize(cmap1[i], 0.0F, 255.0F); 00335 inplaceNormalize(cmap2[i], 0.0F, 255.0F); 00336 00337 std::vector<KeyPoint> *keypoints1; 00338 std::vector<KeyPoint> *keypoints2; 00339 00340 keypoints1 = getKeypoints(cmap1[i]); 00341 keypoints2 = getKeypoints(cmap2[i]); 00342 00343 distance += compImg(*keypoints1, *keypoints2); 00344 //Show the keypoints 00345 00346 Image<PixRGB<byte> > SMapCompDisp = toRGB((Image<byte>)cmap2[i]); 00347 Image<PixRGB<byte> > SMapDisp = toRGB((Image<byte>)cmap1[i]); 00348 Point2D<int> LastLoc(0,0); 00349 00350 for(unsigned int j=0; j<keypoints1->size(); j++){ 00351 // LINFO("Draw keypoint1 at (%i,%i) val=%f", 00352 // (*keypoints1)[j].x, (*keypoints1)[j].y, (*keypoints1)[j].val); 00353 drawDisk(SMapCompDisp, Point2D<int>((*keypoints1)[j].x, 00354 (*keypoints1)[j].y), ROI_SIZE, PixRGB<byte>(255,0,0)); 00355 00356 Point2D<int> NewLoc((*keypoints1)[j].x, (*keypoints1)[j].y); 00357 drawLine(SMapCompDisp, LastLoc, NewLoc, PixRGB<byte>(255,0,0)); 00358 LastLoc = NewLoc; 00359 } 00360 LastLoc.i =0; LastLoc.j=0; 00361 for(unsigned int j=0; j<keypoints2->size(); j++){ 00362 // LINFO("Draw keypoint2 at (%i,%i) val=%f", 00363 // (*keypoints2)[j].x, (*keypoints2)[j].y, (*keypoints2)[j].val); 00364 drawDisk(SMapDisp, Point2D<int>((*keypoints2)[j].x, 00365 (*keypoints2)[j].y), ROI_SIZE, PixRGB<byte>(255,0,0)); 00366 Point2D<int> NewLoc((*keypoints2)[j].x, (*keypoints2)[j].y); 00367 drawLine(SMapDisp, LastLoc, NewLoc, PixRGB<byte>(255,0,0)); 00368 LastLoc = NewLoc; 00369 } 00370 00371 disp = rescale(ima, Dims(256, 256)); 00372 disp = concatX(disp, rescale(SMapCompDisp, Dims(256, 256))); 00373 disp = concatX(disp, rescale(SMapDisp, Dims(256, 256))); 00374 00375 xwin.drawImage(disp); 00376 00377 getchar(); 00378 } 00379 } 00380 */ 00381 00382 //double SMapdist = distance(SMap, SMapComp); 00383 if (imgDist < minSMapDist){ 00384 minSMapDist = imgDist; 00385 minSMap = ifs->frame(); 00386 } 00387 00388 LINFO("Distance for %i = %f", ifs->frame(), imgDist); 00389 00390 // compute and show framerate and stats over the last NAVG frames: 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 // create an info string: 00399 sprintf(info, "%06u %.1ffps ", ii++, fps); 00400 00401 00402 ii++; 00403 // getchar(); 00404 } 00405 00406 00407 } 00408 00409 LINFO("BestSmapMatch %i SMapDist = %f", minSMap, minSMapDist); 00410 // LINFO("BestSmapFFTMatch %i SMapDist = %f", minSMapFFT, minSMapDistFFT); 00411 LINFO("BestSiftMatch %i SiftDist = %f", minSift, minSiftDist); 00412 00413 // stop all our ModelComponents 00414 manager.stop(); 00415 00416 // all done! 00417 return 0; 00418 } 00419 00420 // ###################################################################### 00421 /* So things look consistent in everyone's emacs... */ 00422 /* Local Variables: */ 00423 /* indent-tabs-mode: nil */ 00424 /* End: */