objRec-server.C

00001 /*!@file NeovisionII/objRec-Server.C */
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/NeovisionII/objRec-server.C $
00035 // $Id: objRec-server.C 13901 2010-09-09 15:12:26Z lior $
00036 //
00037 
00038 #ifndef OBJREC_SERVER_C_DEFINED
00039 #define OBJREC_SERVER_C_DEFINED
00040 #include <stdlib.h>
00041 #include <stdio.h>
00042 #include "Component/ModelManager.H"
00043 #include "Image/Image.H"
00044 #include "Image/Pixels.H"
00045 #include "Media/FrameSeries.H"
00046 #include "NeovisionII/nv2_common.h"
00047 #include "NeovisionII/nv2_label_server.h"
00048 #include "Util/sformat.H"
00049 #include "Image/FilterOps.H"
00050 #include "Image/ColorOps.H"
00051 #include "Image/CutPaste.H"
00052 #include "Image/ShapeOps.H"
00053 #include "Image/DrawOps.H"
00054 #include "Image/MathOps.H"
00055 #include "Learn/SOFM.H"
00056 #include "GUI/DebugWin.H"
00057 
00058 #include <iostream> // for std::cin
00059 #include <signal.h>
00060 
00061 bool debug = 0;
00062 bool terminate = false;
00063 struct nv2_label_server* server;
00064 
00065 void terminateProc(int s)
00066 {
00067   LINFO("Ending application\n");
00068   nv2_label_server_destroy(server);
00069   terminate = true;
00070   exit(0);
00071 }
00072 
00073 void findMinMax(const std::vector<double> &vec, double &min, double &max)
00074 {
00075   max = vec[0];
00076   min = max;
00077   for (uint n = 1 ; n < vec.size() ; n++)
00078   {
00079     if (vec[n] > max) max = vec[n];
00080     if (vec[n] < min) min = vec[n];
00081   }
00082 }
00083 
00084 Image<PixRGB<byte> > showHist(const std::vector<double> &hist, int loc)
00085 {
00086   int w = 256, h = 256;
00087   if (hist.size() > (uint)w) w = hist.size();
00088 
00089   if (hist.size() == 0) return Image<PixRGB<byte> >();
00090 
00091   int dw = w / hist.size();
00092   Image<byte> res(w, h, ZEROS);
00093 
00094   // draw lines for 10% marks:
00095   for (int j = 0; j < 10; j++)
00096     drawLine(res, Point2D<int>(0, int(j * 0.1F * h)),
00097              Point2D<int>(w-1, int(j * 0.1F * h)), byte(64));
00098   drawLine(res, Point2D<int>(0, h-1), Point2D<int>(w-1, h-1), byte(64));
00099 
00100   double minii, maxii;
00101   findMinMax(hist, minii, maxii);
00102 
00103    // uniform histogram
00104   if (maxii == minii) minii = maxii - 1.0F;
00105 
00106   double range = maxii - minii;
00107 
00108   for (uint i = 0; i < hist.size(); i++)
00109     {
00110       int t = abs(h - int((hist[i] - minii) / range * double(h)));
00111 
00112       // if we have at least 1 pixel worth to draw
00113       if (t < h-1)
00114         {
00115           for (int j = 0; j < dw; j++)
00116             drawLine(res,
00117                      Point2D<int>(dw * i + j, t),
00118                      Point2D<int>(dw * i + j, h - 1),
00119                      byte(255));
00120           //drawRect(res, Rectangle::tlbrI(t,dw*i,h-1,dw*i+dw-1), byte(255));
00121         }
00122     }
00123   return res;
00124 }
00125 
00126 void smoothHist(std::vector<double> &hist)
00127 {
00128   const uint siz = hist.size();
00129   float vect[siz];
00130 
00131   for (uint n = 0 ; n < siz ; n++)
00132   {
00133     float val0 = hist[ (n-1+siz) % siz ];
00134     float val1 = hist[ (n  +siz) % siz ];
00135     float val2 = hist[ (n+1+siz) % siz ];
00136 
00137     vect[n] = 0.25F * (val0 + 2.0F*val1 + val2);
00138   }
00139 
00140   for (uint n = 0 ; n < siz ; n++) hist[n] = vect[n];
00141 }
00142 
00143 void normalizeHist(std::vector<double> &hist, double high, double low)
00144 {
00145 
00146   double oldmin, oldmax;
00147   findMinMax(hist, oldmin, oldmax);
00148 
00149    float scale = float(oldmax) - float(oldmin);
00150    //if (fabs(scale) < 1.0e-10F) scale = 1.0; // image is uniform
00151    const float nscale = (float(high) - float(low)) / scale;
00152 
00153    for(uint i=0; i<hist.size(); i++)
00154    {
00155      hist[i] = low + (float(hist[i]) - float(oldmin)) * nscale ;
00156    }
00157 
00158 
00159 }
00160 
00161 
00162 //get the max orientation of pixel given
00163 //its neighbors
00164 
00165 float getOriProb(
00166     const Image<float> &mag,
00167     const Image<float> &ori,
00168     int x, int y)
00169 {
00170 
00171    float eMag = mag.getVal(x,y);
00172    float eOri = ori.getVal(x,y);
00173 
00174    //TODO: remove, should be only 0 if neighbors are zero
00175    if (eMag == 0) return 0;
00176 
00177 
00178    //look at the neigbors to determin the prob
00179 
00180    float maxProb = 0;
00181    for (int i=-1; i<=1; i++)
00182      for(int j=-1; j<=1; j++)
00183      {
00184        if (i==0 && j==0) continue; //don't compare ourself
00185        float nMag = mag.getVal(x+i, y+j);
00186        float nOri = ori.getVal(x+i, y+j);
00187 
00188        float prob = (1/fabs(eMag-nMag));
00189        //float prob = 1/(fabs(eMag-nMag)*fabs(eOri-nOri));
00190        if (prob > maxProb)
00191        {
00192          maxProb = prob;
00193        }
00194 
00195 
00196        LDEBUG("%ix%i,%ix%i| E: %f:%f  N:%f:%f %f",
00197            i,j,
00198            x,y,
00199            eMag, eOri,
00200            nMag, nOri,
00201            prob);
00202      }
00203 
00204    float prob = eMag * maxProb;
00205    if (prob > 1000) prob = 1000;
00206    LDEBUG("Max prob %f\n", prob);
00207 
00208 
00209 
00210    return prob;
00211 
00212 
00213 }
00214 
00215 Image<float> getEdgeProb(
00216     const Image<float> &mag,
00217     const Image<float> &ori)
00218 {
00219 
00220   Image<float> retEdge(mag.getDims(), NO_INIT);
00221   for(int y=1; y<mag.getHeight()-1; y++)
00222     for(int x=1; x<mag.getWidth()-1; x++)
00223     {
00224       float pOri = getOriProb(mag, ori, x, y);
00225 
00226       retEdge.setVal(x, y, pOri);
00227     }
00228 
00229   inplaceNormalize(retEdge, 0.0F, 255.0F);
00230 
00231   SHOWIMG(mag, true);
00232   SHOWIMG(ori, true);
00233   //for(int i=0; i<retEdge.getSize(); i++)
00234   //  LINFO("%f", retEdge[i]);
00235   return retEdge;
00236 }
00237 
00238 
00239 int main(const int argc, const char **argv)
00240 {
00241 
00242   MYLOGVERB = LOG_INFO;
00243   ModelManager *mgr = new ModelManager("Test ObjRec");
00244 
00245   nub::ref<OutputFrameSeries> ofs(new OutputFrameSeries(*mgr));
00246   mgr->addSubComponent(ofs);
00247 
00248 
00249   if (mgr->parseCommandLine(
00250         (const int)argc, (const char**)argv, "<Network file> <server ip>", 2, 2) == false)
00251     return 1;
00252 
00253   //// catch signals and redirect them to terminate for clean exit:
00254   //signal(SIGHUP, terminateProc); signal(SIGINT, terminateProc);
00255   //signal(SIGQUIT, terminateProc); signal(SIGTERM, terminateProc);
00256   //signal(SIGALRM, terminateProc);
00257 
00258   mgr->start();
00259 
00260   //get command line options
00261   //const char *bayesNetFile = mgr->getExtraArg(0).c_str();
00262   const char *server_ip = mgr->getExtraArg(1).c_str();
00263 
00264   server = nv2_label_server_create(9930,
00265         server_ip,
00266         9931);
00267 
00268   nv2_label_server_set_verbosity(server,1); //allow warnings
00269 
00270 
00271   while(!terminate)
00272   {
00273 
00274     struct nv2_image_patch p;
00275     const enum nv2_image_patch_result res =
00276       nv2_label_server_get_current_patch(server, &p);
00277 
00278     std::string objName = "nomatch";
00279     if (res == NV2_IMAGE_PATCH_END)
00280     {
00281       fprintf(stdout, "ok, quitting\n");
00282       break;
00283     }
00284     else if (res == NV2_IMAGE_PATCH_NONE)
00285     {
00286       usleep(10000);
00287       continue;
00288     }
00289     else if (res == NV2_IMAGE_PATCH_VALID &&
00290        p.type == NV2_PIXEL_TYPE_RGB24)
00291     {
00292 
00293       const Image<PixRGB<byte> > im((const PixRGB<byte>*) p.data,
00294           p.width, p.height);
00295 
00296       Image<byte> lum = luminance(im);
00297 
00298 
00299       Image<float> mag, ori;
00300       gradientSobel(lum, mag, ori, 3);
00301 
00302       Image<float> edgeProb = getEdgeProb(mag,ori);
00303 
00304       ofs->writeRGB(im, "headInput");
00305       ofs->writeGray(mag, "Sobel");
00306       ofs->writeGray(edgeProb, "Edges");
00307 
00308     }
00309 
00310     nv2_image_patch_destroy(&p);
00311 
00312     sleep(1);
00313   }
00314 
00315   nv2_label_server_destroy(server);
00316 
00317 }
00318 
00319 #endif
Generated on Sun May 8 08:05:23 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3