stim-elnaz.C

00001 /*!@file AppMedia/stim-surprise.C generate surprising stimuli */
00002 
00003 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/AppMedia/stim-elnaz.C $
00004 // $Id: stim-elnaz.C 12962 2010-03-06 02:13:53Z irock $
00005 
00006 #include "Image/Image.H"
00007 #include "Image/DrawOps.H"
00008 #include "Image/ShapeOps.H"
00009 #include "Util/MathFunctions.H"
00010 #include "Image/Pixels.H"
00011 #include "Raster/Raster.H"
00012 
00013 #include <vector>
00014 
00015 #define WIDTH 256
00016 #define NFRAME 300
00017 #define DX 32
00018 #define DTHETA 0.1
00019 #define RAD 8
00020 
00021 #define DOT_RAD 4
00022 #define DOT_SPEED_PIXEL_PER_FRAME 2
00023 
00024 #define DEATH_RATE_PERCENT 0
00025 
00026 #define DOT_LIFE_TIME 200
00027 
00028 int main(const int argc, const char **argv)
00029 {
00030   initRandomNumbers();
00031   Image<byte> img(WIDTH, WIDTH, NO_INIT);
00032 
00033   if (argc < 2) LFATAL("USAGE: stim_surprise <type>");
00034 
00035  // arrays of precessing dots and one is special in there?
00036 
00037   if (strcmp(argv[1], "foe") == 0 || strcmp(argv[1], "foc") == 0)
00038     {
00039 
00040         img.clear(128);
00041 
00042         Raster::WriteRGB(img, "greyframe.ppm");
00043 
00044         int direction=0;
00045         if (strcmp(argv[1], "foe") == 0){
00046                 direction=1;
00047         }
00048         if (strcmp(argv[1], "foc") == 0){
00049                 direction=-1;
00050         }
00051 
00052 //        int speed=2; // pixel per frame
00053         Point2D<int> foe= Point2D<int>(0 , 0);
00054       // get random centers:
00055       std::vector<Point2D<int> > center;
00056 std::vector<Point2D<int> > temp;
00057  std::vector<double> phi;
00058       for (int j = DX/2; j < WIDTH; j += DX)
00059         for (int i = DX/2; i < WIDTH; i += DX)
00060           {
00061             center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)), j + int(5.0 * (randomDouble()-0.5))));
00062             phi.push_back(M_PI * randomDouble());
00063           }
00064 
00065       double theta = 0.0;
00066 
00067         int count=0;
00068       for (int k = 0; k < NFRAME; k ++)
00069         {
00070           img.clear(128 );
00071 
00072           for (unsigned int n = 0; n < center.size(); n ++)
00073             {
00074 
00075               byte col_in_white = 255;
00076               byte col_out_black = 0;
00077                 // check if they have gone out
00078                 if(direction>0) //foe
00079                 {
00080                         int ii = int(center[n].i + direction*(center[n].i-foe.i)*(k*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00081                         if(ii > WIDTH || ii< 0){
00082                                 ii = int(center[n].i + direction*(center[n].i-foe.i)*(theta-count*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00083                         }
00084                         //center[n].i=ii;
00085                               int jj = int(center[n].j + direction*(center[n].j-foe.j)*(k*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00086                         if(jj > WIDTH || jj< 0){
00087                                 jj = int(center[n].j + direction*(center[n].j-foe.j)*(theta-count*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00088                         }
00089                         //center[n].j=jj;
00090 
00091                         temp.push_back(Point2D<int>(ii, jj));
00092 
00093               drawDisk(img, Point2D<int>(ii, jj), DOT_RAD*2, col_out_black);
00094               drawDisk(img, Point2D<int>(ii, jj), DOT_RAD, col_in_white);
00095 
00096 
00097                 }
00098 
00099                 if(direction<0) //foc
00100                 {
00101                         int ii = int(center[n].i + direction*(center[n].i-foe.i)*(k*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00102                         if(ii > WIDTH || ii< 0){
00103                                 ii = int(center[n].i + direction*(center[n].i-foe.i)*(theta-count*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00104                         }
00105                         //center[n].i=ii;
00106                               int jj = int(center[n].j + direction*(center[n].j-foe.j)*(k*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00107                         if(jj > WIDTH || jj< 0){
00108                                 jj = int(center[n].j + direction*(center[n].j-foe.j)*(theta-count*DOT_SPEED_PIXEL_PER_FRAME)/DOT_LIFE_TIME );
00109                         }
00110                         //center[n].j=jj;
00111 
00112               drawDisk(img, Point2D<int>(ii, jj), DOT_RAD*2, col_out_black);
00113               drawDisk(img, Point2D<int>(ii, jj), DOT_RAD, col_in_white);
00114 
00115 
00116                 }
00117 
00118             }
00119 
00120 
00121 
00122           Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00123           theta += DOT_SPEED_PIXEL_PER_FRAME; //thetac -= DTHETA; // += 3.67 * DTHETA;
00124         count++;
00125         if(count>DOT_LIFE_TIME)
00126                 count=0;
00127         }
00128     }
00129   // random noise?
00130 
00131   // arrays of precessing dots and one is special in there?
00132    else if (strcmp(argv[1], "dots") == 0)
00133     {
00134       // get random centers:
00135       std::vector<Point2D<int> > center; std::vector<double> phi;
00136       for (int j = DX/2; j < WIDTH; j += DX)
00137         for (int i = DX/2; i < WIDTH; i += DX)
00138           {
00139             center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)),
00140                                      j + int(5.0 * (randomDouble()-0.5))));
00141             phi.push_back(M_PI * randomDouble());
00142           }
00143 
00144       double theta = 0.0, thetac = 0.0;;
00145       for (int k = 0; k < NFRAME; k ++)
00146         {
00147           img.clear();
00148 
00149           for (unsigned int n = 0; n < center.size(); n ++)
00150             {
00151               double t = theta, rx = RAD, ry = RAD, p = phi[n];
00152               byte col = 255;
00153               if (n == 27) t = thetac;
00154               //if (n == 27) { rx = 0; ry = 0; if ((k/6) & 1) col = 0; }
00155 
00156               int ii = int(center[n].i + rx * cos(t + p));
00157               int jj = int(center[n].j + ry * sin(t + p));
00158               drawDisk(img, Point2D<int>(ii, jj), 4, col);
00159             }
00160 
00161           Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00162           theta += DTHETA; //thetac -= DTHETA; // += 3.67 * DTHETA;
00163         }
00164     }
00165   // random noise?
00166   else if (strcmp(argv[1], "rnd") == 0)
00167     {
00168       for (int k = 0; k < NFRAME; k ++)
00169         {
00170           for (int j = 0; j < WIDTH; j ++)
00171             for (int i = 0; i < WIDTH; i ++)
00172               {
00173 
00174                 double d2 = (i-127)*(i-127) + (j-127)*(j-127);
00175                 double coeff = exp(-d2 / 400.0) * 0.5;
00176 
00177                 img.setVal(i, j, 128 + int(256.0 * (1.0-coeff) * randomDouble()) -
00178                            int(128.0 * (1.0-coeff)));
00179               }
00180           Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00181         }
00182     }
00183   // random blinking?
00184   else if (strcmp(argv[1], "blink") == 0)
00185     {
00186       // get random centers:
00187       std::vector<Point2D<int> > center; std::vector<int> phi;
00188       const int period = 20;
00189       for (int j = DX/2; j < WIDTH; j += DX)
00190         for (int i = DX/2; i < WIDTH; i += DX)
00191           {
00192             center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)),
00193                                      j + int(5.0 * (randomDouble()-0.5))));
00194             phi.push_back(randomUpToNotIncluding(period));
00195           }
00196 
00197       for (int k = 0; k < NFRAME; k ++)
00198         {
00199           img.clear();
00200 
00201           for (unsigned int n = 0; n < center.size(); n ++)
00202             {
00203               byte col;
00204               if (n == 27)
00205                 {
00206                   if (((k + phi[n]) & 4) < 2) col = 255; else col = 0;
00207                 }
00208               else
00209                 {
00210                   if (((k + phi[n]) % period) < period/2) col = 255;
00211                   else col = 0;
00212                 }
00213               drawDisk(img, center[n], 4, col);
00214             }
00215 
00216           Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00217 
00218         }
00219     }
00220   return 0;
00221 }
00222 
00223 // ######################################################################
00224 /* So things look consistent in everyone's emacs... */
00225 /* Local Variables: */
00226 /* indent-tabs-mode: nil */
00227 /* End: */
Generated on Sun May 8 08:40:08 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3