00001 /*! @file ObjRec/test-gbr.C test for geon based recognition */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2005 // 00005 // by the University of Southern California (USC) and the iLab at USC. // 00006 // See http://iLab.usc.edu for information about this project. // 00007 // //////////////////////////////////////////////////////////////////// // 00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00010 // in Visual Environments, and Applications'' by Christof Koch and // 00011 // Laurent Itti, California Institute of Technology, 2001 (patent // 00012 // pending; application number 09/912,225 filed July 23, 2001; see // 00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00014 // //////////////////////////////////////////////////////////////////// // 00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00016 // // 00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00018 // redistribute it and/or modify it under the terms of the GNU General // 00019 // Public License as published by the Free Software Foundation; either // 00020 // version 2 of the License, or (at your option) any later version. // 00021 // // 00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00025 // PURPOSE. See the GNU General Public License for more details. // 00026 // // 00027 // You should have received a copy of the GNU General Public License // 00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00030 // Boston, MA 02111-1307 USA. // 00031 // //////////////////////////////////////////////////////////////////// // 00032 // 00033 // Primary maintainer for this file: Lior Elazary <elazary@usc.edu> 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/ObjRec/test-gbr.C $ 00035 // $Id: test-gbr.C 13716 2010-07-28 22:07:03Z itti $ 00036 // 00037 00038 00039 #include "Image/OpenCVUtil.H" 00040 #include "Component/ModelManager.H" 00041 #include "Image/Image.H" 00042 #include "Image/ImageSet.H" 00043 #include "Image/ShapeOps.H" 00044 #include "Image/CutPaste.H" 00045 #include "Image/DrawOps.H" 00046 #include "Image/FilterOps.H" 00047 #include "Image/ColorOps.H" 00048 #include "Image/Transforms.H" 00049 #include "Image/MathOps.H" 00050 #include "Image/Kernels.H" 00051 #include "Image/fancynorm.H" 00052 #include "Image/Layout.H" 00053 #include "Transport/FrameInfo.H" 00054 #include "Raster/Raster.H" 00055 #include "Raster/GenericFrame.H" 00056 #include "GUI/DebugWin.H" 00057 #include "Neuro/EnvVisualCortex.H" 00058 #include "Neuro/getSaliency.H" 00059 #include "Media/FrameSeries.H" 00060 #include "Util/Timer.H" 00061 #include "RCBot/Motion/MotionEnergy.H" 00062 #include "Neuro/BeoHeadBrain.H" 00063 #include "Learn/Bayes.H" 00064 00065 #include <unistd.h> 00066 #include <stdio.h> 00067 #include <signal.h> 00068 #include <math.h> 00069 00070 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00071 #define OPENCV_HOUGH 1 // opencv hough transform 00072 //#define SALIENCY_HOUGH 1 // opencv hough transform 00073 #define ORI_QUE 1 //use orientation que 00074 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00075 00076 00077 Image<byte> watershed(Image<float> &img) 00078 { 00079 00080 Image<float> ret(img.getDims(), ZEROS); 00081 Image<byte> Data2(img.getDims(), ZEROS); 00082 int Ydim = img.getHeight(); 00083 int Xdim = img.getWidth(); 00084 00085 /* Calculate gradient magnitude image */ 00086 if (false) 00087 { 00088 for (int y = 1; y < (img.getHeight() - 1); y++) 00089 for (int x = 1; x < (img.getWidth() - 1); x++) 00090 { 00091 float Dx = (img.getVal(x+1, y + 1) + 2 * img.getVal(x+1, y) + img.getVal(x+1, y-1) 00092 - img.getVal(x-1, y+1) - 2 * img.getVal(x-1, y) - img.getVal(x-1, y-1)) / 8; 00093 float Dy = (img.getVal(x+1, y + 1) + 2 * img.getVal(x, y+1) + img.getVal(x-1, y+1) 00094 - img.getVal(x+1, y-1) - 2 * img.getVal(x, y-1) - img.getVal(x-1, y-1)) / 8; 00095 00096 ret.setVal(x,y, (float) sqrt((double) (Dx * Dx + Dy * Dy))); 00097 } 00098 00099 //Fix borders 00100 for (int y = 1; y < (Ydim - 1); y++) 00101 for (int x = 1; x < (Xdim - 1); x++) 00102 img.setVal(x,y, ret.getVal(x,y)); 00103 00104 for (int x = 0; x < Xdim; x++) 00105 { 00106 img.setVal(x, 0, img.getVal(x,1)); 00107 img.setVal(x, Ydim-1, img.getVal(x, Ydim - 2)); 00108 } 00109 for (int y = 0; y < Ydim; y++) 00110 { 00111 img.setVal(0,y, img.getVal(1,y)); 00112 img.setVal(Xdim-1, y, img.getVal(Xdim-2, y)); 00113 } 00114 } 00115 00116 00117 float min, max; 00118 getMinMax(img, min, max); 00119 00120 int mask = 2; 00121 for(int y=0; y<Ydim; y++) 00122 for (int x=0; x<Xdim; x++) 00123 { 00124 if (img.getVal(x,y) == min) 00125 { 00126 Data2.setVal(x,y,mask); 00127 } 00128 } 00129 00130 00131 return Data2; 00132 00133 00134 } 00135 00136 float w (float *p, int k) 00137 { 00138 int i; 00139 float x=0.0; 00140 00141 for (i=1; i<=k; i++) x += p[i]; 00142 return x; 00143 } 00144 00145 float u (float *p, int k) 00146 { 00147 int i; 00148 float x=0.0; 00149 00150 for (i=1; i<=k; i++) x += (float)i*p[i]; 00151 return x; 00152 } 00153 00154 float nu (float *p, int k, float ut, float vt) 00155 { 00156 float x, y; 00157 00158 y = w(p,k); 00159 x = ut*y - u(p,k); 00160 x = x*x; 00161 y = y*(1.0-y); 00162 if (y>0) x = x/y; 00163 else x = 0.0; 00164 return x/vt; 00165 } 00166 00167 Image<float> segmentProb(const Image<float> &img) 00168 { 00169 Image<float> retImg = img; 00170 int hist[260]; 00171 float p[260]; 00172 00173 inplaceNormalize(retImg, 0.0F, 255.0F); 00174 00175 for(int i=0; i<260; i++) 00176 { 00177 hist[i] = 0; //set histogram to 0 00178 p[i] = 0; //set prob to 0 00179 } 00180 00181 for (int y=0; y<retImg.getHeight(); y++) 00182 for(int x=0; x<retImg.getWidth(); x++) 00183 { 00184 int val = (int)retImg.getVal(x,y); 00185 hist[val+1]++; 00186 } 00187 00188 //nomalize into a distribution 00189 for (int i=1; i<=256; i++) 00190 p[i] = (float)hist[i]/(float)retImg.getSize(); 00191 00192 //find the global mean 00193 float ut = 0.0; 00194 for(int i=1; i<=256; i++) 00195 ut += (float)i*p[i]; 00196 00197 //find the global variance 00198 float vt = 0.0; 00199 for(int i=1; i<=256; i++) 00200 vt += (i-ut)*(i-ut)*p[i]; 00201 00202 int j=-1, k=-1; 00203 for(int i=1; i<=256; i++) 00204 { 00205 if ((j<0) && (p[i] > 0.0)) j = i; //first index 00206 if (p[i] > 0.0) k = i; //last index 00207 } 00208 00209 float z = -1.0; 00210 int m = -1; 00211 for (int i=j; i<=k; i++) 00212 { 00213 float y = nu(p,i,ut,vt); //compute nu 00214 00215 if (y>=z) 00216 { 00217 z = y; 00218 m = i; 00219 } 00220 } 00221 00222 int t = m; 00223 00224 if (t < 0) 00225 LINFO("ERROR"); 00226 00227 //threshold 00228 for (int y=0; y<retImg.getHeight(); y++) 00229 for(int x=0; x<retImg.getWidth(); x++) 00230 { 00231 int val = (int)retImg.getVal(x,y); 00232 if (val < t) 00233 retImg.setVal(x,y,0); 00234 else 00235 retImg.setVal(x,y,255.0); 00236 } 00237 00238 00239 return retImg; 00240 } 00241 00242 Image<float> integralImage(const Image<float> &img) 00243 { 00244 00245 Image<float> integImg(img.getDims(), ZEROS); 00246 00247 int xDim = integImg.getWidth(); 00248 int yDim = integImg.getHeight(); 00249 00250 00251 float s[xDim]; 00252 for (int i=0; i<xDim; i++) s[i] = 0; 00253 00254 for(int y=0; y<yDim; y++) 00255 for(int x=0; x<xDim; x++) 00256 { 00257 float ii = x > 0 ? integImg.getVal(x-1, y) : 0; 00258 s[x] += img.getVal(x,y); 00259 integImg.setVal(x,y, ii+s[x]); 00260 } 00261 00262 return integImg; 00263 00264 00265 } 00266 00267 Image<float> getHaarFeature(Image<float> &integImg, int i) 00268 { 00269 00270 Image<float> fImg(integImg.getDims(), ZEROS); 00271 00272 /*int w = 2, h = 4; 00273 00274 for(int y=0; y<fImg.getHeight()-2*w; y++) 00275 for(int x=0; x<fImg.getWidth()-h; x++) 00276 { 00277 float left = integImg.getVal(x+w,y+h) + integImg.getVal(x,y) - 00278 (integImg.getVal(x+w,y) + integImg.getVal(x,y+h)); 00279 float right = integImg.getVal(x+(2*w),y+h) + integImg.getVal(x+w,y) - 00280 (integImg.getVal(x+(2*w),y) + integImg.getVal(x+w,y+h)); 00281 00282 float top = integImg.getVal(x,y) + integImg.getVal(x+h,y+w) - 00283 (integImg.getVal(x+h,y) + integImg.getVal(x,y+w)); 00284 float bottom = integImg.getVal(x,y+w) + integImg.getVal(x+h,y+(2*w)) - 00285 (integImg.getVal(x+h,y+w) + integImg.getVal(x,y+(2*w))); 00286 00287 00288 fImg.setVal(x,y, fabs(left-right) + fabs(top-bottom)); 00289 }*/ 00290 00291 int c = 6+i, s = 8+i; 00292 00293 int x = 320/2, y=240/2; 00294 00295 Rectangle rect(Point2D<int>(x,y),Dims(s,s)); 00296 drawRect(fImg, rect, float(255.0)); 00297 //for(int y=0; y<fImg.getHeight()-s; y++) 00298 // for(int x=0; x<fImg.getWidth()-s; x++) 00299 { 00300 int d = (s-c)/2; 00301 float center = integImg.getVal(x+d,y+d) + integImg.getVal(x+d+c,y+d+c) - 00302 (integImg.getVal(x+d,y+d+c) + integImg.getVal(x+d+c,y+d)); 00303 float surround = integImg.getVal(x,y) + integImg.getVal(x+s,y+s) - 00304 (integImg.getVal(x+s,y) + integImg.getVal(x,y+s)); 00305 00306 center /= c*2; 00307 surround /= s*2; 00308 //fImg.setVal(x,y, center-surround); 00309 //printf("%i %f\n", i, center-surround); 00310 } 00311 00312 00313 return fImg; 00314 00315 } 00316 00317 Image<float> centerSurround(Image<float> &integImg) 00318 { 00319 00320 Image<float> objImg(integImg.getDims(), ZEROS); 00321 00322 for(int y=0; y<objImg.getHeight()-20; y++) 00323 for(int x=0; x<objImg.getWidth()-20; x++) 00324 { 00325 int c, s; 00326 float center, surround; 00327 c = 3+(10/2); 00328 s = 6+10; 00329 00330 int d = (s-c)/2; 00331 center = integImg.getVal(x+d,y+d) + integImg.getVal(x+d+c,y+d+c) - 00332 (integImg.getVal(x+d,y+d+c) + integImg.getVal(x+d+c,y+d)); 00333 surround = integImg.getVal(x,y) + integImg.getVal(x+s,y+s) - 00334 (integImg.getVal(x+s,y) + integImg.getVal(x,y+s)) - center; 00335 00336 center /= (c*c); 00337 surround /= ((s*s) - (c*c)); 00338 00339 float val = fabs(center-surround); 00340 objImg.setVal(x,y, val); 00341 } 00342 00343 return objImg; 00344 00345 } 00346 00347 // various tracking parameters (in seconds) 00348 const double MHI_DURATION = 1; 00349 const double MAX_TIME_DELTA = 0.5; 00350 const double MIN_TIME_DELTA = 0.05; 00351 // number of cyclic frame buffer used for motion detection 00352 // (should, probably, depend on FPS) 00353 const int N = 4; 00354 00355 // ring image buffer 00356 IplImage **buf = 0; 00357 int last = 0; 00358 00359 // temporary images 00360 IplImage *mhi = 0; // MHI 00361 IplImage *orient = 0; // orientation 00362 IplImage *mask = 0; // valid orientation mask 00363 IplImage *segmask = 0; // motion segmentation map 00364 CvMemStorage* storage = 0; // temporary storage 00365 00366 // parameters: 00367 // img - input video frame 00368 // dst - resultant motion picture 00369 // args - optional parameters 00370 Rectangle update_mhi( IplImage* img, IplImage* dst, int diff_threshold ) 00371 { 00372 double timestamp = (double)clock()/CLOCKS_PER_SEC; // get current time in seconds 00373 CvSize size = cvSize(img->width,img->height); // get current frame size 00374 int i, idx1 = last, idx2; 00375 IplImage* silh; 00376 CvSeq* seq; 00377 CvRect comp_rect; 00378 CvRect maxComp_rect = cvRect(0,0,0,0); 00379 double count; 00380 //double angle; 00381 CvPoint center; 00382 00383 Rectangle rect; 00384 00385 // allocate images at the beginning or 00386 // reallocate them if the frame size is changed 00387 if( !mhi || mhi->width != size.width || mhi->height != size.height ) { 00388 if( buf == 0 ) { 00389 buf = (IplImage**)malloc(N*sizeof(buf[0])); 00390 memset( buf, 0, N*sizeof(buf[0])); 00391 } 00392 00393 for( i = 0; i < N; i++ ) { 00394 cvReleaseImage( &buf[i] ); 00395 buf[i] = cvCreateImage( size, IPL_DEPTH_8U, 1 ); 00396 cvZero( buf[i] ); 00397 } 00398 cvReleaseImage( &mhi ); 00399 cvReleaseImage( &orient ); 00400 cvReleaseImage( &segmask ); 00401 cvReleaseImage( &mask ); 00402 00403 mhi = cvCreateImage( size, IPL_DEPTH_32F, 1 ); 00404 cvZero( mhi ); // clear MHI at the beginning 00405 orient = cvCreateImage( size, IPL_DEPTH_32F, 1 ); 00406 segmask = cvCreateImage( size, IPL_DEPTH_32F, 1 ); 00407 mask = cvCreateImage( size, IPL_DEPTH_8U, 1 ); 00408 } 00409 00410 cvCvtColor( img, buf[last], CV_BGR2GRAY ); // convert frame to grayscale 00411 00412 idx2 = (last + 1) % N; // index of (last - (N-1))th frame 00413 last = idx2; 00414 00415 silh = buf[idx2]; 00416 cvAbsDiff( buf[idx1], buf[idx2], silh ); // get difference between frames 00417 00418 cvThreshold( silh, silh, diff_threshold, 1, CV_THRESH_BINARY ); // and threshold it 00419 cvUpdateMotionHistory( silh, mhi, timestamp, MHI_DURATION ); // update MHI 00420 00421 // convert MHI to blue 8u image 00422 cvCvtScale( mhi, mask, 255./MHI_DURATION, 00423 (MHI_DURATION - timestamp)*255./MHI_DURATION ); 00424 cvZero( dst ); 00425 cvCvtPlaneToPix( mask, 0, 0, 0, dst ); 00426 00427 // calculate motion gradient orientation and valid orientation mask 00428 cvCalcMotionGradient( mhi, mask, orient, MAX_TIME_DELTA, MIN_TIME_DELTA, 3 ); 00429 00430 if( !storage ) 00431 storage = cvCreateMemStorage(0); 00432 else 00433 cvClearMemStorage(storage); 00434 00435 // segment motion: get sequence of motion components 00436 // segmask is marked motion components map. It is not used further 00437 seq = cvSegmentMotion( mhi, segmask, storage, timestamp, MAX_TIME_DELTA ); 00438 00439 // iterate through the motion components, 00440 // One more iteration (i == -1) corresponds to the whole image (global motion) 00441 00442 float maxMotCount = 0; 00443 00444 for(int i=0; i< seq->total; i++) 00445 { 00446 00447 comp_rect = ((CvConnectedComp*)cvGetSeqElem( seq, i ))->rect; 00448 00449 // select component ROI 00450 cvSetImageROI( silh, comp_rect ); 00451 cvSetImageROI( mhi, comp_rect ); 00452 cvSetImageROI( orient, comp_rect ); 00453 cvSetImageROI( mask, comp_rect ); 00454 00455 00456 count = cvNorm( silh, 0, CV_L1, 0 ); // calculate number of points within silhouette ROI 00457 00458 cvResetImageROI( mhi ); 00459 cvResetImageROI( orient ); 00460 cvResetImageROI( mask ); 00461 cvResetImageROI( silh ); 00462 00463 float motCount = count + (comp_rect.width*comp_rect.height); 00464 if (motCount > maxMotCount) 00465 { 00466 maxComp_rect = comp_rect; 00467 maxMotCount = motCount; 00468 } 00469 } 00470 00471 if (maxMotCount > 0) 00472 { 00473 00474 // draw a clock with arrow indicating the direction 00475 center = cvPoint( (maxComp_rect.x + maxComp_rect.width/2), 00476 (maxComp_rect.y + maxComp_rect.height/2) ); 00477 00478 cvCircle( dst, center, cvRound(35), CV_RGB(255,0,0), 3, CV_AA, 0 ); 00479 // cvLine( dst, center, cvPoint( cvRound( center.x + magnitude*cos(angle*CV_PI/180)), 00480 // cvRound( center.y - magnitude*sin(angle*CV_PI/180))), color, 3, CV_AA, 0 ); 00481 00482 rect = Rectangle(Point2D<int>(maxComp_rect.x, maxComp_rect.y), Dims(maxComp_rect.width, maxComp_rect.height)); 00483 00484 } 00485 00486 return rect; 00487 } 00488 00489 void findMinMax(const std::vector<double> &vec, double &min, double &max) 00490 { 00491 max = vec[0]; 00492 min = max; 00493 for (uint n = 1 ; n < vec.size() ; n++) 00494 { 00495 if (vec[n] > max) max = vec[n]; 00496 if (vec[n] < min) min = vec[n]; 00497 } 00498 } 00499 00500 Image<PixRGB<byte> > showHist(const std::vector<double> &hist, int loc=0) 00501 { 00502 int w = 256, h = 256; 00503 if (hist.size() > (uint)w) w = hist.size(); 00504 00505 if (hist.size() == 0) return Image<PixRGB<byte> >(); 00506 00507 int dw = w / hist.size(); 00508 Image<byte> res(w, h, ZEROS); 00509 00510 // draw lines for 10% marks: 00511 for (int j = 0; j < 10; j++) 00512 drawLine(res, Point2D<int>(0, int(j * 0.1F * h)), 00513 Point2D<int>(w-1, int(j * 0.1F * h)), byte(64)); 00514 drawLine(res, Point2D<int>(0, h-1), Point2D<int>(w-1, h-1), byte(64)); 00515 00516 double minii, maxii; 00517 findMinMax(hist, minii, maxii); 00518 00519 // uniform histogram 00520 if (maxii == minii) minii = maxii - 1.0F; 00521 00522 double range = maxii - minii; 00523 00524 for (uint i = 0; i < hist.size(); i++) 00525 { 00526 int t = abs(h - int((hist[i] - minii) / range * double(h))); 00527 00528 // if we have at least 1 pixel worth to draw 00529 if (t < h-1) 00530 { 00531 for (int j = 0; j < dw; j++) 00532 drawLine(res, 00533 Point2D<int>(dw * i + j, t), 00534 Point2D<int>(dw * i + j, h - 1), 00535 byte(255)); 00536 //drawRect(res, Rectangle::tlbrI(t,dw*i,h-1,dw*i+dw-1), byte(255)); 00537 } 00538 } 00539 return res; 00540 } 00541 00542 void smoothHist(std::vector<double> &hist) 00543 { 00544 const uint siz = hist.size(); 00545 float vect[siz]; 00546 00547 for (uint n = 0 ; n < siz ; n++) 00548 { 00549 float val0 = hist[ (n-1+siz) % siz ]; 00550 float val1 = hist[ (n +siz) % siz ]; 00551 float val2 = hist[ (n+1+siz) % siz ]; 00552 00553 vect[n] = 0.25F * (val0 + 2.0F*val1 + val2); 00554 } 00555 00556 for (uint n = 0 ; n < siz ; n++) hist[n] = vect[n]; 00557 } 00558 00559 void normalizeHist(std::vector<double> &hist, double high, double low) 00560 { 00561 00562 double oldmin, oldmax; 00563 findMinMax(hist, oldmin, oldmax); 00564 00565 float scale = float(oldmax) - float(oldmin); 00566 //if (fabs(scale) < 1.0e-10F) scale = 1.0; // image is uniform 00567 const float nscale = (float(high) - float(low)) / scale; 00568 00569 for(uint i=0; i<hist.size(); i++) 00570 { 00571 hist[i] = low + (float(hist[i]) - float(oldmin)) * nscale ; 00572 } 00573 } 00574 00575 void normalizeHist(std::vector<double> &hist) 00576 { 00577 double sum = 0; 00578 for(uint i=0; i<hist.size(); i++) 00579 if (!isnan(hist[i]) && !isinf(hist[i]) && exp(hist[i]) > 1.0e-5f) //if its a normal number 00580 sum += exp(hist[i]); 00581 00582 for(uint i=0; i<hist.size(); i++) 00583 hist[i] = exp(hist[i])/sum; 00584 00585 } 00586 00587 00588 void putLine(Image<PixRGB<byte> > &img, int x, int y, float a, int len) 00589 { 00590 int x1 = int(cos(a)*(float)len); 00591 int y1 = int(sin(a)*(float)len); 00592 00593 Point2D<int> p1(x, y); 00594 Point2D<int> p2(x+x1, y-y1); 00595 drawLine(img, p1, p2, PixRGB<byte>(0,255,0),2); 00596 00597 } 00598 00599 Image<PixRGB<byte> > generateInput(float &angle) 00600 { 00601 Image<PixRGB<byte> > retImg(320,240,ZEROS); 00602 00603 angle = M_PI*randomDouble(); 00604 float angle2 = M_PI*randomDouble(); 00605 00606 putLine(retImg, retImg.getWidth()/2, retImg.getHeight()/2, angle, 50); 00607 00608 putLine(retImg, retImg.getWidth()/2, retImg.getHeight()/2, angle+angle2, 50); 00609 00610 00611 angle = angle2; 00612 return retImg; 00613 00614 00615 } 00616 00617 00618 int main(const int argc, const char **argv) 00619 { 00620 00621 MYLOGVERB = LOG_INFO; 00622 ModelManager *mgr = new ModelManager("Test ObjRec"); 00623 00624 nub::ref<InputFrameSeries> ifs(new InputFrameSeries(*mgr)); 00625 mgr->addSubComponent(ifs); 00626 00627 nub::ref<OutputFrameSeries> ofs(new OutputFrameSeries(*mgr)); 00628 mgr->addSubComponent(ofs); 00629 00630 nub::ref<EnvVisualCortex> evc(new EnvVisualCortex(*mgr)); 00631 mgr->addSubComponent(evc); 00632 00633 //nub::ref<GetSaliency> smap(new GetSaliency(*mgr)); 00634 //mgr->addSubComponent(smap); 00635 00636 00637 //mgr->setOptionValString(&OPT_EvcLevelSpec, "0,2,6,8,0"); 00638 //mgr->setOptionValString(&OPT_EvcLevelSpec, "0,2,6,8,2"); 00639 00640 //evc->setIweight(0); 00641 //evc->setFweight(0); 00642 //evc->setMweight(0); 00643 //evc->setCweight(0); 00644 //evc->setOweight(0); 00645 00646 mgr->exportOptions(MC_RECURSE); 00647 00648 if (mgr->parseCommandLine( 00649 (const int)argc, (const char**)argv, "", 0, 0) == false) 00650 return 1; 00651 mgr->start(); 00652 00653 // do post-command-line configs: 00654 00655 //start streaming 00656 //ifs->startStream(); 00657 00658 //int i=0; 00659 00660 00661 initRandomNumbers(); 00662 00663 Bayes bayes(2, 360); 00664 // bayes.load("Edge.net"); 00665 00666 unsigned int frame=0; 00667 Point2D<int> target; 00668 while(1) 00669 { 00670 Image< PixRGB<byte> > inputImg; 00671 const FrameState is = ifs->updateNext(); 00672 if (is == FRAME_COMPLETE) 00673 break; 00674 00675 //grab the images 00676 GenericFrame input = ifs->readFrame(); 00677 if (!input.initialized()) 00678 break; 00679 inputImg = input.asRgb(); 00680 00681 inputImg = rescale(inputImg, 320, 240); 00682 // inputImg = generateInput(trueAngle); 00683 00684 00685 //evc->input(inputImg); 00686 usleep(50000); 00687 ofs->writeRGB(inputImg, "Input", FrameInfo("Input", SRC_POS)); 00688 Layout<PixRGB<byte> > outDisp; 00689 00690 00691 Image<byte> lum = luminance(inputImg); 00692 Image<float> mag, ori; 00693 gradientSobel(lum, mag, ori, 3); 00694 00695 outDisp = vcat(outDisp, hcat(toRGB(Image<byte>(mag)), toRGB(Image<byte>(lum)))); 00696 00697 ofs->writeRgbLayout(outDisp, "Edges", FrameInfo("Edges", SRC_POS)); 00698 00699 frame++; 00700 } 00701 00702 // stop all our ModelComponents 00703 mgr->stop(); 00704 00705 return 0; 00706 00707 }