summaryrefslogtreecommitdiff
path: root/2005/i/robert/src/ovision/ui/live.cc
diff options
context:
space:
mode:
Diffstat (limited to '2005/i/robert/src/ovision/ui/live.cc')
-rw-r--r--2005/i/robert/src/ovision/ui/live.cc180
1 files changed, 180 insertions, 0 deletions
diff --git a/2005/i/robert/src/ovision/ui/live.cc b/2005/i/robert/src/ovision/ui/live.cc
new file mode 100644
index 0000000..21a7c3e
--- /dev/null
+++ b/2005/i/robert/src/ovision/ui/live.cc
@@ -0,0 +1,180 @@
+// comm.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 <iostream>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string>
+#include <sstream>
+
+#include "live.hh"
+#include "image/raw_reader.hh"
+#include "data/data_input_file.hh"
+#include "video4linux/video4linux.hh"
+
+/// Constructeur
+/// @param *filename nom de l'image a utiliser
+Live::Live (const unsigned nbImg, const ImageInput imgInput)
+ : group (0), imgInput_ (imgInput)
+{
+ if (nbImg < 6) nbImg_ = 6;
+ else nbImg_ = nbImg;
+}
+
+void
+Live::init (const char *filename)
+{
+ tex = new unsigned[nbImg_];
+ data = new unsigned char*[nbImg_];
+ // Creation de oconfig
+ oconfig = new OConfig ();
+ // Création de l'image
+ img = new ImgInterface;
+ // Ouverture de l'image pilote et stockage
+ Image::PixelFormat pf = Image::rgb;
+ 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<DataInput*> (dif);
+ reader_ = new RawReader (*di, 360, 296, pf);
+ }
+ break;
+ case cam:
+ {
+ Video4Linux *r;
+ r = new Video4Linux ("/dev/video", pf);
+ r->calibrate ();
+ reader_ = reinterpret_cast<ImageReader*> (r);
+ }
+ break;
+ case serv:
+ break;
+ }
+ img->load (*reader_);
+ // Allocation memoire pour les images
+ for (unsigned i=0; i<nbImg_; i++)
+ data[i] = new unsigned char[img->nbPixels_*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->buildNN (oconfig->nnNbColor, Segm::loadFromFile);
+ mag = new Magnifier (img, segm);
+ 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]);
+ /*if (img->colorMode_ != Image::rgb)
+ {
+ ConvertImg conv;
+ conv.ConvertToRGB (*img);
+ tex[3] = loadImage (img->width_, img->height_, data[0], tex[4]);
+ img->loadRaw (fname, Image::rgb, 360, 296);
+ }*/
+ rootPics ();
+}
+
+/// Mis à jour de l'image
+void
+Live::updateImg (const char *filename)
+{
+ Image::PixelFormat pf = Image::rgb;
+ switch (imgInput_)
+ {
+ case file:
+ {
+ // Copie du nom de l'image courante
+ strcpy (fname, filename);
+ std::string f (filename);
+ DataInputFile *dif = new DataInputFile (f);
+ DataInput *di = reinterpret_cast<DataInput*> (dif);
+ delete reader_;
+ reader_ = new RawReader (*di, 360, 296, pf);
+ }
+ break;
+ case cam:
+ case serv:
+ 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 ();
+ 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;
+}
+
+/// Recharge le fichier de config
+void
+Live::reloadConfig (const char *filename)
+{
+ oconfig->load (filename);
+}
+
+
+/// Segmente et group les couleurs
+void
+Live::segmAndGroup(int numColorToShow)
+{
+ // Création des groupes
+ delete group;
+ group = new Group(img, segm);
+ std::vector<Zone> 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
+ 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);
+ }
+ img->doImg (img->getTabSegm ());
+ 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]);
+}
+