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 }