00001 /*!@file Beobot/test-roadShape.C */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001 by the // 00005 // 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; filed July 23, 2001, following provisional applications // 00013 // No. 60/274,674 filed March 8, 2001 and 60/288,724 filed May 4, 2001).// 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: Laurent Itti <itti@usc.edu> 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Beobot/test-roadShape.C $ 00035 // $Id: test-roadShape.C 14376 2011-01-11 02:44:34Z pez $ 00036 // 00037 00038 //!To Display frames and associated interpretation of MetaData 00039 00040 #include "GUI/XWindow.H" 00041 #include "Image/CutPaste.H" // for inplacePaste() 00042 #include "Image/DrawOps.H" 00043 #include "Image/Image.H" 00044 #include "Image/Pixels.H" 00045 #include "Raster/Raster.H" 00046 00047 #include <cmath> 00048 #include <signal.h> 00049 #include <stdlib.h> 00050 #include <time.h> 00051 #include <unistd.h> 00052 00053 namespace 00054 { 00055 //! Metadata information (typically obtained from GPS) 00056 class MetaData 00057 { 00058 public: 00059 //! Constructor 00060 MetaData(); 00061 00062 //! Constructor 00063 MetaData( const MetaData& m ); 00064 00065 //! Constructor 00066 MetaData( std::string s ); 00067 00068 //! Parse from string 00069 void parseMetaData( std::string s ); 00070 00071 //! Access function 00072 float getAccel() const; 00073 00074 //! Access function 00075 float getSteer() const; 00076 00077 //! Access function 00078 float getLat() const; 00079 00080 //! Access function 00081 float getLon() const; 00082 00083 //! Access function 00084 float getEV() const; 00085 00086 //! Access function 00087 float getNV() const; 00088 00089 //protected: 00090 float accel; //!< Acceleration 00091 float steer; //!< Steering 00092 float lat; //!< Latitude 00093 float lon; //!< Longitude 00094 float ev; //!< Velocity in east direction 00095 float nv; //!< Velocity in north direction 00096 }; 00097 00098 MetaData::MetaData() : 00099 accel(0), steer(0), lat(0), lon(0), ev(0), nv(0) 00100 { } 00101 00102 MetaData::MetaData( const MetaData& m ) : 00103 accel( m.accel ), steer( m.steer ), lat( m.lat ), lon( m.lon), 00104 ev( m.ev ), nv( m.nv ) 00105 { } 00106 00107 MetaData::MetaData( std::string s ) : 00108 accel(0), steer(0), lat(0), lon(0), ev(0), nv(0) 00109 { 00110 parseMetaData( s ); 00111 } 00112 00113 void MetaData::parseMetaData( std::string s ) 00114 { 00115 std::string temp = ""; 00116 int space; 00117 while( ( space = s.find( " ", 0 ) ) != int(std::string::npos) ) 00118 { 00119 temp = s.substr( 0, space ); 00120 s = s.substr( space, s.length() - space ); 00121 00122 if( temp.find( "ACCEL:", 0 ) != std::string::npos ) 00123 accel = atof( temp.c_str() ); 00124 if( temp.find("STEER:", 0) != std::string::npos ) 00125 steer = atof( temp.c_str() ); 00126 if( temp.find("LAT:", 0 ) != std::string::npos ) 00127 lat = atof( temp.c_str() ); 00128 if( temp.find("LON:", 0 ) != std::string::npos ) 00129 lon = atof( temp.c_str() ); 00130 if( temp.find("EV:", 0) != std::string::npos ) 00131 ev = atof( temp.c_str() ); 00132 if( temp.find("NV:", 0) != std::string::npos ) 00133 nv = atof( temp.c_str() ); 00134 } 00135 } 00136 00137 float MetaData::getAccel() const 00138 { return accel; } 00139 00140 float MetaData::getSteer() const 00141 { return steer; } 00142 00143 float MetaData::getLat() const 00144 { return lat; } 00145 00146 float MetaData::getLon() const 00147 { return lon; } 00148 00149 float MetaData::getEV() const 00150 { return ev; } 00151 00152 float MetaData::getNV() const 00153 { return nv; } 00154 } 00155 00156 // ###################################################################### 00157 int main(int argc, char **argv) 00158 { 00159 initRandomNumbers(); 00160 00161 int32 frame; 00162 00163 int initFrame; 00164 char imageNameBase[100]; 00165 00166 // command line help 00167 if( argc >= 2 ) strcpy( imageNameBase, argv[1] ); 00168 else LFATAL("arguments = dir/ [initFrame]"); 00169 00170 if( argc >= 3 ) initFrame = atoi( argv[2] ); 00171 else initFrame = 0; 00172 00173 Image< PixRGB<byte> > col_image = 00174 Raster::ReadRGB(sformat("%sframe%06d.ppm", imageNameBase, initFrame)); 00175 00176 //Here we are assuming all of the images will have the same dimensions 00177 const int HEIGHT = col_image.getHeight(); 00178 const int WIDTH = col_image.getWidth(); 00179 00180 //Points dividing the window into image sized segments [3x3], 00181 //Based on image size 00182 Point2D<int> up_left(0, 0); 00183 Point2D<int> up_mid( WIDTH, 0 ); 00184 //Point2D<int> up_right( WIDTH*2, 0 ); 00185 //Point2D<int> mid_left(0, HEIGHT ); 00186 //Point2D<int> mid_mid( WIDTH, HEIGHT ); 00187 //Point2D<int> mid_right( WIDTH*2, HEIGHT ); 00188 //Point2D<int> low_left(0, HEIGHT*2 ); 00189 //Point2D<int> low_mid( WIDTH, HEIGHT*2 ); 00190 //Point2D<int> low_right( WIDTH*2, HEIGHT*2 ); 00191 00192 //Acceleration representation rectangle 00193 Rectangle accel; 00194 00195 //Steering represenation rectangle 00196 Rectangle steer; 00197 00198 00199 Image< PixRGB<byte> > final_image( WIDTH*2, HEIGHT, ZEROS ); 00200 00201 // this is to show the final composite image 00202 XWindow xwindow( Dims(WIDTH*2, HEIGHT*2) ); 00203 00204 00205 // initialization of the beast 00206 00207 //This image will show the steering and acceleration vector representations 00208 //Image< PixRGB<byte> > radioImage( WIDTH, HEIGHT, ZEROS ); 00209 Image< PixRGB<byte> > radioImage = Raster::ReadRGB("speedo.ppm"); 00210 00211 //Image< PixRGB<byte> > clear( WIDTH, HEIGHT, ZEROS ); 00212 00213 MetaData mData; 00214 00215 // big loop 00216 for(frame = initFrame; ; frame+=1) 00217 { 00218 // read current frame 00219 col_image = Raster::ReadRGB(sformat("%sframe%06d.ppm", 00220 imageNameBase, frame)); 00221 // and display it for debug 00222 00223 inplacePaste( final_image, col_image, up_left ); 00224 00225 //now we want to create some sort of representaiton of the speed 00226 //And direction we are trying to go 00227 00228 //Read in the MetaData from the image 00229 mData = MetaData(Raster::getImageComments 00230 (sformat("%sframe%06d.ppm", 00231 imageNameBase, frame))); 00232 00233 //Since accel is nicely between -1 and 1, we can simply multiply it 00234 //by half of the image height to get an offset for drawing our acceleration 00235 //Rectangle. 00236 00237 int vert = (int) 0;//(mData.accel * (HEIGHT/2)); 00238 int hori = (int) 0;//(mData.steer * (WIDTH/2)); 00239 00240 LINFO("VERT: %d\nHORI: %d", vert, hori); 00241 if( vert == 0 ) 00242 vert = 1; 00243 if( hori == 0 ) 00244 hori = 1; 00245 00246 00247 if (frame > 100) { 00248 vert = 30; 00249 hori = 30; 00250 } 00251 00252 //Set the acceleration rectangle 00253 if( vert < 0 ) 00254 { 00255 LINFO("uu:%d ll:%d bb:%d rr:%d", HEIGHT + vert, 0, HEIGHT / 2, 10); 00256 accel = Rectangle::tlbrI( HEIGHT / 2, 0, 00257 HEIGHT / 2 - vert, 10 ); 00258 } 00259 else 00260 { 00261 LINFO("uu:%d ll:%d bb:%d rr:%d", HEIGHT / 2, 0, HEIGHT + vert, 10); 00262 accel = Rectangle::tlbrI( HEIGHT / 2 - vert, 0, 00263 HEIGHT / 2, 10 ); 00264 } 00265 00266 //Set the steering rectangle 00267 if( hori > 0 ) 00268 { 00269 LINFO("uu:%d ll:%d bb:%d rr:%d", HEIGHT - 10, WIDTH / 2, HEIGHT, WIDTH / 2 + hori); 00270 steer = Rectangle::tlbrI( HEIGHT - 11, WIDTH / 2, 00271 HEIGHT - 1, WIDTH / 2 + hori ); 00272 } 00273 else 00274 { 00275 LINFO("uu:%d ll:%d bb:%d rr:%d", HEIGHT - 10, WIDTH / 2 + hori, 00276 HEIGHT, WIDTH / 2 ); 00277 steer = Rectangle::tlbrI( HEIGHT - 11, WIDTH / 2 + hori, 00278 HEIGHT - 1, WIDTH / 2 ); 00279 } 00280 00281 PixRGB<byte> whitePixel(255,36,255); 00282 00283 //radioImage.clear( blackPixel ); 00284 00285 drawRect( radioImage, accel, whitePixel, 1 ); 00286 drawRect( radioImage, steer, whitePixel, 1 ); 00287 00288 //Point2D<int> p1( WIDTH / 2, HEIGHT / 2 ); 00289 Point2D<int> p1( WIDTH / 2, HEIGHT ); 00290 Point2D<int> p2( WIDTH / 2 + hori, HEIGHT / 2 - vert ); 00291 00292 drawArrow(radioImage, p1, p2, whitePixel, 2); 00293 00294 00295 inplacePaste( final_image, radioImage, up_mid ); 00296 00297 //drawImage( xwindow, final_image ); 00298 00299 LINFO("Writing: %smovie/frame%06d.ppm", imageNameBase, frame); 00300 Raster::WriteRGB( final_image, 00301 sformat("%smovie/frame%06d.ppm", imageNameBase, frame) ); 00302 } 00303 00304 LINFO( "END OF test-MetaData" ); 00305 exit(0); 00306 } 00307 00308 // ###################################################################### 00309 /* So things look consistent in everyone's emacs... */ 00310 /* Local Variables: */ 00311 /* indent-tabs-mode: nil */ 00312 /* End: */