BeobotBrainMT.H
Go to the documentation of this file.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 
00040 
00041 
00042 #ifndef BEOBOT_BEOBOTBRAINMT_H_DEFINED
00043 #define BEOBOT_BEOBOTBRAINMT_H_DEFINED
00044 
00045 
00046 
00047 
00048 
00049 #define delta_min  3
00050 #define delta_max  4
00051 #define level_min  1
00052 #define level_max  3
00053 #define maxdepth   (level_max + delta_max + 1)
00054 #define normtyp    (VCXNORM_MAXNORM)
00055 
00056  
00057 #define sml        2
00058 
00059 
00060 #define IMAGE_WIDTH  160
00061 #define IMAGE_HEIGHT 120
00062 
00063 
00064 #define IWEIGHT 0.7
00065 #define CWEIGHT 1.0
00066 #define OWEIGHT 1.0
00067 
00068 
00069 #define NUM_CHANNELS 7
00070 #define REDGREEN   0
00071 #define BLUEYELLOW 1
00072 #define INTENSITY  2
00073 #define ORI0       3
00074 #define ORI45      4
00075 #define ORI90      5
00076 #define ORI135     6
00077 
00078 #define numBBMTthreads 7
00079 
00080 #include "Component/ModelComponent.H"
00081 #include "Component/ModelParam.H"
00082 #include "Neuro/VisualCortex.H"
00083 #include "Image/Image.H"
00084 #include "Image/ImageSet.H"
00085 #include "Image/ColorOps.H"
00086 #include "Image/PyramidOps.H"
00087 #include "Image/Pixels.H"
00088 #include "GUI/XWinManaged.H"
00089 #include "Raster/Raster.H"
00090 #include "Util/Timer.H"
00091 
00092 #include <list>
00093 #include <pthread.h>
00094 
00095 
00096 
00097 
00098 struct jobData
00099 {
00100   jobData() { };
00101 
00102   jobData(const int jt, const PyramidType pt, const float w,
00103           const float ori = 0.0F) :
00104     jobType(jt), ptyp(pt), weight(w), orientation(ori) { }
00105 
00106   int jobType;
00107   PyramidType ptyp;
00108   float weight;
00109   float orientation;
00110 };
00111 
00112 
00113 
00114 
00115 
00116 class BeobotBrainMT : public ModelComponent
00117 {
00118 public:
00119 
00120   
00121 
00122 
00123 
00124 
00125   BeobotBrainMT(OptionManager& mgr,
00126                 const std::string& descrName = "Beobot Brain MT",
00127                 const std::string& tagName = "BeobotBrainMT");
00128 
00129 
00130   virtual ~BeobotBrainMT();
00131 
00132 
00133 
00134   
00135 
00136 
00137 
00138 
00139   inline int getWinChan(uint i);
00140 
00141 
00142   inline int getWinSubmapNum(uint i);
00143 
00144 
00145   inline Image< PixRGB<byte> > getCurrImage();
00146 
00147 
00148   inline Image<float> getCurrCMap(uint cnum);
00149 
00150 
00151   inline Point2D<int> getSalPoint(uint i);
00152 
00153 
00154   void getFeatures(Point2D<int> p, std::vector<double>& v);
00155 
00156 
00157   inline Rectangle getObjRect(uint i);
00158 
00159 
00160   inline void getSalientFeatures( uint i, std::vector<double>& v);
00161 
00162 
00163   inline float getProcessTime();
00164 
00165 
00166   Image<double> getGist();
00167 
00168 
00169   Image<float> getSalMap();
00170 
00171 
00172 
00173   
00174 
00175 
00176 
00177 
00178   void input(const Image< PixRGB<byte> > img);
00179 
00180 
00181   bool outputReady();
00182 
00183 
00184   void threadCompute();
00185 
00186 
00187   int getNumSalPoint();
00188 
00189 
00190 
00191 protected:
00192   void start1(); 
00193   void stop2();  
00194 
00195 private:
00196 
00197 
00198   void computeCIOpyr(Image< PixRGB<byte> > img);
00199 
00200 
00201   void findObjects();
00202 
00203 
00204   void computeSalientFeatures();
00205 
00206 
00207   Point2D<int> downScaleCoords(Point2D<int> winner, Dims targetDims);
00208 
00209 
00210   bool setWinningMap(Point2D<int> winner);
00211 
00212 
00213 
00214   Image<byte> getObjectMask();
00215 
00216 
00217   Rectangle getSEBoundingBox();
00218 
00219 
00220   Rectangle correctBB(Rectangle r, Point2D<int> locn, int w, int h);
00221 
00222 
00223   
00224 
00225   Image< PixRGB<byte> > itsCurrImg;        
00226   int itsCurrImgWidth;
00227   int itsCurrImgHeight;
00228   Image<float> itsCurrLumImg;              
00229   Image<byte> r, g, b, y;                  
00230   Image<float> rgimg;
00231   Image<float> byimg;
00232   Image<float> itsSalmap;                  
00233   bool gotLum, gotRGBY;
00234 
00235 
00236   uint itsNumChannels;
00237 
00238 
00239   std::vector<float> itsChanWeight;
00240 
00241 
00242   std::vector<Image<float> > itsCMaps;
00243 
00244 
00245 
00246   std::vector<std::vector<Image<float> > > itsRawCSMaps;
00247 
00248 
00249 
00250   std::vector<std::vector<Image<float> > > itsCSMaps;
00251 
00252 
00253   std::vector<ImageSet<float> > itsImgPyrs;
00254 
00255 
00256   Image<double> itsGistVector;
00257 
00258 
00259   uint itsGistFeatSize;
00260 
00261 
00262   std::vector<Point2D<int> > itsWinner;
00263 
00264 
00265   std::vector<Rectangle> itsObjRect;
00266 
00267 
00268   std::vector<std::vector<double> > itsSalientFeatures;
00269 
00270 
00271   std::vector<uint> itsWinningChan;
00272 
00273 
00274   std::vector<uint> itsWinningSubmapNum;
00275 
00276 
00277   std::vector<Image<float> > itsWinningMap;
00278 
00279 
00280 
00281 
00282   std::vector<Image<byte> > itsObjectMask;
00283 
00284 
00285 
00286   Image<byte> structEl;
00287 
00288 
00289   std::list<jobData> jobQueue;
00290   uint jobsTodo;
00291   rutz::shared_ptr<Timer> itsTimer;
00292   float itsProcessTime;
00293 
00294 
00295   pthread_t *worker;
00296   pthread_mutex_t jobLock;       
00297   pthread_mutex_t mapLock;       
00298   pthread_mutex_t gistLock;      
00299   pthread_cond_t jobCond;
00300   uint numWorkers;
00301 
00302   XWinManaged* itsWin;
00303 };
00304 
00305 
00306 
00307 
00308 inline Image< PixRGB<byte> > BeobotBrainMT::getCurrImage()
00309 { return itsCurrImg; }
00310 
00311 inline int BeobotBrainMT::getWinChan(uint i)
00312 { ASSERT(i < itsWinningChan.size()); return itsWinningChan[i]; }
00313 
00314 inline int BeobotBrainMT::getWinSubmapNum(uint i)
00315 { ASSERT(i < itsWinningSubmapNum.size()); return itsWinningSubmapNum[i]; }
00316 
00317 inline Image<float> BeobotBrainMT::getCurrCMap(uint i)
00318 { ASSERT(i < itsCMaps.size()); return itsCMaps[i]; }
00319 
00320 inline int BeobotBrainMT::getNumSalPoint()
00321 { return itsWinner.size(); }
00322 
00323 inline Point2D<int> BeobotBrainMT::getSalPoint(uint i)
00324 { ASSERT(i < itsWinner.size()); return itsWinner[i]; }
00325 
00326 inline Rectangle BeobotBrainMT::getObjRect(uint i)
00327 { ASSERT(i < itsObjRect.size()); return itsObjRect[i]; }
00328 
00329 inline void BeobotBrainMT::getSalientFeatures( uint i, std::vector<double>& v)
00330 {
00331   ASSERT(i < itsSalientFeatures.size());
00332   v.clear();
00333   for(uint j = 0; j < itsSalientFeatures[i].size(); j++)
00334     v.push_back(itsSalientFeatures[i][j]);
00335 }
00336 
00337 inline float BeobotBrainMT::getProcessTime()
00338 { return itsProcessTime; }
00339 
00340 #endif
00341 
00342 
00343 
00344 
00345 
00346