// live.cc - Classe Live // robert - Programme du robot APBteam // Copyright (C) 2005 Olivier Gaillard /// @file live.cc Traitement de l'image dans le but d'être visualisé sur une interface #include #include #include #include #include #include #include "live.hh" #include "image/raw_reader.hh" #include "data/data_input_file.hh" #include "video4linux/video4linux.hh" #include "socket/server_socket.hh" #include "socket/address.hh" /// Constructeur /// @param *filename nom de l'image a utiliser Live::Live (const unsigned nbImg, const ImageInput imgInput) : reader_ (0), db_ (0), st_ (0), colorToFind_ (-1), group (0), width_ (640), height_ (480), imgInput_ (imgInput) { if (nbImg < 6) nbImg_ = 6; else nbImg_ = nbImg; } /// Initialisation void Live::init (const Image::PixelFormat pf, const char *filename) { tex = new unsigned[nbImg_]; data = new unsigned char*[nbImg_]; // Creation de oconfig oconfig = new OConfig (); width_ = oconfig->width; height_ = oconfig->height; // Création de l'image img = new ImgInterface; // Ouverture de l'image pilote et stockage switch (imgInput_) { case file: { // Copie du nom de l'image courante strcpy (fname, filename); std::string f (fname); DataInputFile *dif = new DataInputFile (f); DataInput *di = reinterpret_cast (dif); reader_ = new RawReader (*di, width_, height_, pf); } break; case cam: { Video4Linux *r; r = new Video4Linux ("/dev/video", width_, height_, pf, oconfig->brightness); r->calibrate (); reader_ = reinterpret_cast (r); } break; case socket: { // Serveur ServerSocket ss (2000); Address a; SocketText *st_ = new SocketText (ss, a); st_->nonblock (); // DataBuffer de reception DataBuffer *db_ = new DataBuffer; // Reception des données while (!st_->recv ()); *st_ >> *db_; if (db_->type () != DataBuffer::Image) std::cerr << " Echec de la transmission\n"; reader_ = new RawReader (*db_, width_, height_, pf); } break; } img->load (*reader_); // Allocation memoire pour les images for (unsigned i=0; inbPixels_*3]; memcpy(data[0], img->tabData_, sizeof(char) * img->nbPixels_ * 3); tex[0] = loadImage(img->width_, img->height_, data[0], tex[0]); // Initialisation de la segmentation segm = new SegmLearn; segm->setMode (pf); segm->buildNN (oconfig->nnNbColor, Segm::loadFromFile); eraser = new Eraser (oconfig->width, 10); eraser->init (); mag = new Magnifier (img, segm, eraser, Group::ZoneType (oconfig->uiGroupToDisplay)); segmAndGroup (); // Affichage de l'image pilote avec la couleur d'aquisition et en RGB tex[1] = loadImage (img->width_, img->height_, data[0], tex[1]); rootPics (); } /// Mis à jour de l'image void Live::updateImg (const Image::PixelFormat pf, const char *filename) { segm->setMode (pf); switch (imgInput_) { case file: { std::cout << " Changement d'image : " << filename << std::endl; // Copie du nom de l'image courante strcpy (fname, filename); std::string f (filename); DataInputFile *dif = new DataInputFile (f); DataInput *di = reinterpret_cast (dif); delete reader_; reader_ = new RawReader (*di, width_, height_, pf); } break; case cam: std::cout << " Changement d'image caméra" << std::endl; case socket: break; } img->load (*reader_); memcpy(data[0], img->tabData_, sizeof(char) * img->nbPixels_ * 3); tex[0] = loadImage(img->width_, img->height_, data[0], tex[0]); segmAndGroup (colorToFind_); rootPics (); } /// Fixe une image ségmentée et une image de groupe dans la partie centrale void Live::rootPics () { memcpy (data[1], data[2], sizeof (char)*img->nbPixels_*3); memcpy (data[4], data[5], sizeof (char)*img->nbPixels_*3); tex[1] = loadImage(img->width_, img->height_, data[1], tex[1]); tex[4] = loadImage(img->width_, img->height_, data[4], tex[4]); } /// Destructeur Live::~Live() { // Liberation de la memoire delete oconfig; delete segm; delete group; delete [] data; delete db_; delete st_; delete reader_; } /// Recharge le fichier de config void Live::reloadConfig (const char *filename) { oconfig->load (filename); } /// Segmente et group les couleurs void Live::segmAndGroup (const int numColorToShow) { // Création des groupes delete group; group = new Group (img, segm, eraser); std::vector list; if (numColorToShow >= 0) { group->jumpPoints(numColorToShow); list = group->getZoneList (); } else { group->jumpPoints (oconfig->groupColor); mag->analyse (group->getZoneList ()); list = mag->getItemList ((Group::ZoneType)oconfig->uiGroupToDisplay); } // Création de l'image des groupes segm->segmImg (img); img->doGroupImg (list); img->doImg (img->getTabSegm ()); memcpy (data[5], img->getTabOut (), sizeof (char)*img->nbPixels_*3); // Création de l'image segmentée if (numColorToShow >= 0) segm->segmImg (img, numColorToShow); else { segm->segmImg (img); img->addGroupToDisplay (img->getTabSegm (), list); } // Création de l'image segmentée img->doImg (); memcpy (data[2], img->getTabOut (), sizeof (char)*img->nbPixels_*3); // tex[2] = loadImage(img->width_, img->height_, data[2], tex[2]); // tex[5] = loadImage(img->width_, img->height_, data[5], tex[5]); }