Page principale | Liste des namespaces | Hiérarchie des classes | Liste alphabétique | Liste des classes | Liste des fichiers | Membres de namespace | Membres de classe

camera.impl.hpp

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 //using namespace nt2::fml; 
00046 
00047 
00048 
00049 template<class T, size_t N>
00050 Camera<T,N>::Camera( /*const string filexml, */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   // dataGrabber de 3 elements
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);  // Pour que les buffers se remplissent
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   // Construction de l'objet image avec une image d'initialisation
00111   cimg_library::CImg<unsigned char> image(jpeg->getImage(), width, height, 1, 3);
00112   
00113   // Construction de la fenetre d'affichage
00114   cimg_library::CImgDisplay main_disp(image,"Flux video");
00115   
00116   // Tant que le fenetre d'affichage n'est pas fermee
00117   while(!main_disp.is_closed)
00118     {
00119       while(!(main_disp.button) && !(main_disp.is_closed))
00120         {
00121           // Affichage de la nouvelle image dans la fenetre
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       // Clic avec le bouton du milieu --> Deplacement ou centrage sur la zone cliqué
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) // Clic avec le bouton gauche --> Zoom IN
00169           cameramove << c.cmd_zoomin.c_str();
00170       
00171         else
00172           if(main_disp.button&2) // Clic avec le bouton droit --> Zoom OUT
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   // Construction de l'objet image avec une image d'initialisation
00197   cimg_library::CImg<unsigned char> image(jpeg->getImage(),width, height,1,3);
00198   
00199   // Construction de la fenetre d'affichage
00200   cimg_library::CImgDisplay main_disp(image,"Flux video");
00201 
00202   while(!main_disp.is_closed)
00203     { 
00204       // Affichage de la nouvelle image dans la fenetre
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   // Chargement de l'image
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;   // La liste contenant les images
00237   
00238   // Tant que le nb d'images demande n'est pas atteint
00239   for ( unsigned int i=1; i<=nb ; i++ )
00240     {
00241       // Si un laps de temps entre 2 images est demande
00242       if( dt!=0 )
00243         tempo(dt); // Attente de dt milli-secondes
00244       
00245       // Ajout de l'image dans la liste
00246       l.push_back(getNextFrame());
00247     }
00248   
00249   // Renvoi de la liste
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    ;       // Liste pour les images demandees
00258   std::list<std::string>    name ;       // Liste pour les noms de fichiers
00259   std::string               fname;       // Pour le nom de fichier courant
00260   buffer_t                  b    ;       // Pour l'image courante
00261   FILE*                     fp   ;       // Pour le flux d'ecriture
00262   
00263   name.resize(nb);       // Resize de la liste des noms de fichiers
00264   l.resize(nb);          // Resize de la liste des buffers
00265   l=snapshot(nb,dt);     // Recuperation de la liste des images
00266 
00267 
00268   // GENRATION DES NOMS DE FICHIERS
00269   // Tant que le nb d'images demande n'est pas atteint
00270   for (unsigned int cpt=1; cpt<=nb ; cpt++)
00271     {
00272       // Creation du nom de fichier a ecrire (snap(num_incremente).jpg)
00273       std::stringstream filename;
00274       filename << "snap";
00275       filename.width(4);
00276       filename.fill('0');
00277       filename << cpt; 
00278       filename << ".jpg";
00279 
00280 
00281       // Rajout du nom dans la liste des noms
00282       name.push_back(filename.str());
00283     }
00284 
00285   // ECRITURE DES IMAGES SUR LE DISQUE
00286   // Tant qu'il reste des images a traiter
00287   while(nb--!=0)
00288     {
00289       // Recuperation du nom de fichier courant
00290       fname.clear();
00291       fname=name.back();
00292       name.pop_back();
00293 
00294       // Recuperation du buffer courant
00295       b.clear();
00296       b=l.back();
00297       l.pop_back();
00298 
00299       std::cout << "Writing " << fname.c_str() << std::endl;
00300 
00301       // Ouverture du fichier en eriture
00302       fp = fopen (fname.c_str(), "wb");
00303 
00304       // Ecriture des caracteres  dans le fichier
00305       fwrite(&b[0], b.size(), 1, fp );
00306 
00307       // Fermeture du fichier
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   // Tant qu'il n'y a pas de requête à envoyer
00317   while(cmd!="NULL")
00318     tempo(((1000/mFreq)/2)+1); // On dort la moitie de la frequence +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   // Des vectors pour ranger les commandes et arguments
00329   std::vector<std::string> v_cmd;
00330   std::vector<std::string> v_arg;
00331 
00332   // typedef pour alléger l'ecriture
00333   typedef boost::tokenizer<boost::char_separator<char> > my_tok;
00334 
00335   // Separateur --> ";"
00336   boost::char_separator<char> sep( ";" );
00337 
00338   // Construction du tokenizer
00339   my_tok tok( command, sep );
00340 
00341   // Iterer la sequence de tokens
00342   for (my_tok::const_iterator i = tok.begin(); i != tok.end(); i++)
00343     {
00344       // On insere les commandes les unes a la suite des autres
00345       v_cmd.push_back(*i);
00346       i++;
00347 
00348       // Si l'argument est NULL, il est remplace par 1 (valeur a envoyer a la
00349       // camera si la commande ne prend pas d'argument)
00350       if(*i=="NULL")
00351         v_arg.push_back("1");
00352       else
00353         v_arg.push_back(*i);
00354     }
00355 
00356   // Il faut autant de commandes que d'arguments
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   // Pour stocker la requete
00364   std::stringstream ss;
00365 
00366   // Des iterators sur nos vectors
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   // Tant qu'il y a des commandes à envoyer
00371   for( ; it_cmd != v_cmd.end(); it_cmd++, it_arg++)
00372     {
00373       // Si ce n'est pas la premiere commande, il faut rajouter &
00374       if(v_cmd.size()>1 && it_cmd != v_cmd.begin())
00375         ss << "&";
00376       ss << *it_cmd << "=" << *it_arg;
00377     }
00378 
00379   // Tant quil n'y a deja une commande en attente, on attend qu'elle soit envoyée
00380   while(cmd!="NULL")
00381     tempo(((1000/mFreq)/2)+1); // On dort la moitie de la frequence +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   //Si le datagrabber existe ...
00399   if(d)
00400     delete d;   // Delete du dataGrabber
00401 
00402 
00403   if (PTZ)
00404     {
00405       if (cS)
00406         {
00407           cS->stop(); // Arret du thread cmdSender
00408           tempo(1000/mFreq+1);
00409           delete cS;  // Delete du cmdSender
00410         }
00411 
00412 
00413       if (t)
00414         {
00415           delete t;
00416         }
00417     }
00418 
00419 }

Généré le Wed Aug 16 12:33:36 2006 pour IpsiC++library par  doxygen 1.4.4