// 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 (); std::cerr << " Init socket\n"; // DataBuffer de reception DataBuffer *db_ = new DataBuffer; uint8_t c = 'a'; DataBuffer dbAskImg (&c, 1, 1, DataBuffer::AskImage); std::cout << "Demande image...\n"; *st_ << dbAskImg; std::cout << "envoye...\n"; st_->send (); std::cout << "ok.\n"; // Reception des données std::cout << "Rcpt...\n"; while (!st_->recv ()); std::cout << "Lecture...\n"; *st_ >> *db_; std::cout << "ok.\n"; if (db_->type () != DataBuffer::Image) std::cerr << " Echec de la transmission\n"; std::cout << "Reader...\n"; reader_ = new RawReader (*db_, width_, height_, pf); std::cout << "Ok..\n"; } 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)); space = new Space (img->width_, img->height_); // Calibration des longueurs space->addSetupPoint (56, 155, 50, 315); space->addSetupPoint (65, 51, 50, 465); space->addSetupPoint (164, 46, -50, 465); space->setup (0.003, -2.106, 561.391); 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; break; case socket: std::cerr << " Ask data\n"; uint8_t c = 'a'; DataBuffer dbAskImg (&c, 1, 1, DataBuffer::AskImage); *st_ << dbAskImg; st_->send (); // 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_); 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); int x, y, dist; double angle; for (std::vector::iterator iter = list.begin (); iter != list.end (); ++iter) { mag->showZone (*iter); space->getRealLoc (*iter, x, y, angle, dist); std::cout << " position réelle : "<< x << " " << y << " " << angle << " " << dist << "\n"; } } // 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]); }