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 #include <sstream>
00040 #include "/usr/local/include/nt2/nt2.hh"
00041 
00042 using namespace std;
00043 using namespace cimg_library; 
00044 using namespace nt2;
00045 
00046 
00047 
00048 
00049 template<class T, size_t N>
00050 Camera<T,N>::Camera( Param* param )
00051   :d(NULL), cS(NULL), t(NULL)
00052 {
00053   CamParam* cam= new CamParam("doc.xml");
00054   c = cam->getStruct();
00055   delete cam;
00056   
00057   if( param->getType() == IP )
00058     {
00059       mFreq  = param->freq;
00060       PTZ    = param->PTZ ;
00061     }
00062 
00063   
00064   d = new dataGrabber<T,N>(param, &c) ;
00065 
00066   if(PTZ)
00067     {
00068       cmd="NULL";
00069       cS = new cmdSender(&cmd, param, &c, &mMut);
00070       t  = new boost::thread(*cS);
00071     }
00072 
00073   std::cout <<  "Bufferisation de l'affichage en cours ..." << std::endl;
00074   while(d->isready()!= true);  
00075   std::cout <<  " Termine !" <<  std::endl;
00076 }
00077 
00078 
00079 template<class T, size_t N>
00080 Camera<T,N>::~Camera()
00081 {
00082   stop();
00083 }
00084 
00085 
00086 template<class T, size_t N>
00087 void Camera<T,N>::affiche()
00088 { 
00089   if(PTZ)
00090     affiche_PTZ();
00091   else
00092     affiche_nPTZ();
00093 }
00094 
00095 
00096 template<class T, size_t N>
00097 void Camera<T,N>::affiche_PTZ()
00098 {
00099   jpeg = new JpegDecompressor;
00100   
00101   buffer_t img=getNextFrame();
00102   jpeg->decompress((unsigned char*)&img[0], img.size());
00103   
00104   const size_t width  = jpeg->getWidth();
00105   const size_t height = jpeg->getHeight();
00106   const size_t x1 = width/3;
00107   const size_t x2 = 2*(width/3);
00108   const size_t y1 = height/2; 
00109   
00110   
00111   cimg_library::CImg<unsigned char> image(jpeg->getImage(), width, height, 1, 3);
00112   
00113   
00114   cimg_library::CImgDisplay main_disp(image,"Flux video");
00115   
00116   
00117   while(!main_disp.is_closed)
00118     {
00119       while(!(main_disp.button) && !(main_disp.is_closed))
00120         {
00121           
00122           main_disp.display(getNextImg(image, img, width, height));
00123           
00124           tempo(1); 
00125         }
00126       
00127       send_cmd(main_disp, x1, x2, y1); 
00128       
00129       tempo(1);
00130       
00131     }
00132   
00133   delete jpeg;
00134 }
00135 
00136 
00137 template<class T, size_t N>
00138 void Camera<T,N>::send_cmd(cimg_library::CImgDisplay & main_disp, const size_t x1, const size_t x2, const size_t y1)
00139 {
00140   if(main_disp.button != 0)
00141     {
00142       std::stringstream cameramove; 
00143       
00144       
00145       if(main_disp.button&4)
00146         {
00147           if(c.cmd_center!="NULL")
00148             cameramove << c.cmd_center << "=" << main_disp.mouse_x << "," << main_disp.mouse_y;
00149           
00150           else
00151             {
00152               if((size_t)main_disp.mouse_x < x1)
00153                 cameramove <<  c.cmd_left;
00154               
00155               else
00156                 if((size_t)main_disp.mouse_x >  x2)
00157                   cameramove << c.cmd_right;
00158               
00159                 else
00160                   if ( ((size_t)main_disp.mouse_x >=  x1 && (size_t)main_disp.mouse_x <=  x2) && (size_t)main_disp.mouse_y <  y1)
00161                     cameramove << c.cmd_up;
00162               
00163                   else
00164                     cameramove << c.cmd_down;
00165             } 
00166         }
00167       else
00168         if(main_disp.button&1) 
00169           cameramove << c.cmd_zoomin.c_str();
00170       
00171         else
00172           if(main_disp.button&2) 
00173             cameramove << c.cmd_zoomout.c_str(); 
00174       
00175       
00176       main_disp.button = 0;
00177       
00178       sendReqFormat(cameramove.str());
00179     }
00180 }
00181 
00182 
00183 
00184 
00185 template<class T, size_t N>
00186 void Camera<T,N>::affiche_nPTZ()
00187 {
00188   jpeg = new JpegDecompressor;
00189   
00190   buffer_t img=getNextFrame();
00191   jpeg->decompress((unsigned char*)&img[0], img.size());
00192   
00193   const size_t width  = jpeg->getWidth();
00194   const size_t height = jpeg->getHeight(); 
00195   
00196   
00197   cimg_library::CImg<unsigned char> image(jpeg->getImage(),width, height,1,3);
00198   
00199   
00200   cimg_library::CImgDisplay main_disp(image,"Flux video");
00201 
00202   while(!main_disp.is_closed)
00203     { 
00204       
00205       main_disp.display(getNextImg(image, img, width, height));
00206       
00207       tempo(1);
00208     }
00209   
00210   delete jpeg;
00211 }
00212 
00213 
00214 template<class T, size_t N>
00215 buffer_t Camera<T,N>::getNextFrame()
00216 {
00217   return d->getData();
00218 }
00219 
00220 
00221 template<class T, size_t N>
00222 cimg_library::CImg<unsigned char>& Camera<T,N>::getNextImg(cimg_library::CImg<unsigned char> &image, buffer_t &img,  const size_t width,  const size_t height)
00223 {
00224   img=getNextFrame();
00225   jpeg->decompress((unsigned char*)&img[0], img.size());
00226   
00227   
00228   image.assign(jpeg->getImage(),jpeg->getWidth(),jpeg->getHeight(),1,3);
00229   return image;
00230 }
00231 
00232 
00233 template<class T, size_t N>
00234 std::list<buffer_t> Camera<T,N>::snapshot(unsigned int nb, unsigned int dt)
00235 {
00236   std::list<buffer_t>  l;   
00237   
00238   
00239   for ( unsigned int i=1; i<=nb ; i++ )
00240     {
00241       
00242       if( dt!=0 )
00243         tempo(dt); 
00244       
00245       
00246       l.push_back(getNextFrame());
00247     }
00248   
00249   
00250   return l;
00251 }
00252 
00253 
00254 template<class T, size_t N>
00255 void Camera<T,N>::recSnap(unsigned int nb, unsigned int dt)
00256 {
00257   std::list<buffer_t>       l    ;       
00258   std::list<std::string>    name ;       
00259   std::string               fname;       
00260   buffer_t                  b    ;       
00261   FILE*                     fp   ;       
00262   
00263   name.resize(nb);       
00264   l.resize(nb);          
00265   l=snapshot(nb,dt);     
00266 
00267 
00268   
00269   
00270   for (unsigned int cpt=1; cpt<=nb ; cpt++)
00271     {
00272       
00273       std::stringstream filename;
00274       filename << "snap";
00275       filename.width(4);
00276       filename.fill('0');
00277       filename << cpt; 
00278       filename << ".jpg";
00279 
00280 
00281       
00282       name.push_back(filename.str());
00283     }
00284 
00285   
00286   
00287   while(nb--!=0)
00288     {
00289       
00290       fname.clear();
00291       fname=name.back();
00292       name.pop_back();
00293 
00294       
00295       b.clear();
00296       b=l.back();
00297       l.pop_back();
00298 
00299       std::cout << "Writing " << fname.c_str() << std::endl;
00300 
00301       
00302       fp = fopen (fname.c_str(), "wb");
00303 
00304       
00305       fwrite(&b[0], b.size(), 1, fp );
00306 
00307       
00308       fclose(fp);
00309     }
00310 }
00311 
00312 
00313 template<class T, size_t N>
00314 void Camera<T,N>::sendReqFormat(const std::string & command)
00315 {
00316   
00317   while(cmd!="NULL")
00318     tempo(((1000/mFreq)/2)+1); 
00319 
00320   boost::mutex::scoped_lock lock(mMut);
00321   cmd=command;
00322 }
00323 
00324 
00325 template<class T, size_t N>
00326 void Camera<T,N>::sendReq(const std::string & command)
00327 {
00328   
00329   std::vector<std::string> v_cmd;
00330   std::vector<std::string> v_arg;
00331 
00332   
00333   typedef boost::tokenizer<boost::char_separator<char> > my_tok;
00334 
00335   
00336   boost::char_separator<char> sep( ";" );
00337 
00338   
00339   my_tok tok( command, sep );
00340 
00341   
00342   for (my_tok::const_iterator i = tok.begin(); i != tok.end(); i++)
00343     {
00344       
00345       v_cmd.push_back(*i);
00346       i++;
00347 
00348       
00349       
00350       if(*i=="NULL")
00351         v_arg.push_back("1");
00352       else
00353         v_arg.push_back(*i);
00354     }
00355 
00356   
00357   if (v_arg.size()!=v_cmd.size())
00358     {
00359       std::cerr << "Pas assez d'arguments pour envoyer la requete !!!" << std::endl;
00360       return;
00361     }
00362 
00363   
00364   std::stringstream ss;
00365 
00366   
00367   std::vector<std::string>::const_iterator it_cmd = v_cmd.begin();
00368   std::vector<std::string>::const_iterator it_arg = v_arg.begin();
00369 
00370   
00371   for( ; it_cmd != v_cmd.end(); it_cmd++, it_arg++)
00372     {
00373       
00374       if(v_cmd.size()>1 && it_cmd != v_cmd.begin())
00375         ss << "&";
00376       ss << *it_cmd << "=" << *it_arg;
00377     }
00378 
00379   
00380   while(cmd!="NULL")
00381     tempo(((1000/mFreq)/2)+1); 
00382 
00383   boost::mutex::scoped_lock lock(mMut);
00384   cmd=ss.str();
00385 }
00386 
00387 
00388 template<class T, size_t N>
00389 void Camera<T,N>::clearLog()
00390 {
00391   clearLog("cam.log");
00392 }
00393 
00394 
00395 template<class T, size_t N>
00396 void Camera<T,N>::stop()
00397 {
00398   
00399   if(d)
00400     delete d;   
00401 
00402 
00403   if (PTZ)
00404     {
00405       if (cS)
00406         {
00407           cS->stop(); 
00408           tempo(1000/mFreq+1);
00409           delete cS;  
00410         }
00411 
00412 
00413       if (t)
00414         {
00415           delete t;
00416         }
00417     }
00418 
00419 }