summaryrefslogtreecommitdiff
path: root/2004/i/nono/src/ovision/comm.cc
diff options
context:
space:
mode:
Diffstat (limited to '2004/i/nono/src/ovision/comm.cc')
-rw-r--r--2004/i/nono/src/ovision/comm.cc350
1 files changed, 350 insertions, 0 deletions
diff --git a/2004/i/nono/src/ovision/comm.cc b/2004/i/nono/src/ovision/comm.cc
new file mode 100644
index 0000000..4ff2566
--- /dev/null
+++ b/2004/i/nono/src/ovision/comm.cc
@@ -0,0 +1,350 @@
+// comm.cc - Classe Comm
+// nono - Programme du robot Efrei Robotique I1-I2 2004
+// Copyright (C) 2004 Olivier Gaillard
+
+
+/// @file comm.cc Interprete les commandes envoyes par l'interface UI et les executent
+
+#include <iostream>
+#include <fcntl.h>
+#include <unistd.h>
+using namespace std;
+
+#include "comm.h"
+#include "adjust.h"
+
+
+/// Constructeur
+/// @param *filename nom de l'image a utiliser
+Comm::Comm(char *filename)
+{
+ // Initialisation de IL
+ ilInit();
+
+ // Ecriture du PID dans un fichier
+ long pid = getpid();
+ FILE *file = fopen("adjust.PID", "w+");
+ if (!file)
+ {
+ cerr << "InitComm : Error during file opening" << endl;
+ return;
+ }
+ fprintf(file, "%li\n", pid);
+ fclose(file);
+
+ // Creation de config
+ config = new Config("vision.conf");
+
+ // Ouverture de l'image pilote et stockage
+ img.ReadRaw(filename);
+ tex[0] = LoadImage(img.width, img.height, img.tabData, tex[0]);
+
+ // Conversion en RGB et stockage
+ img.RGBtoYUV();
+ tex[3] = LoadImage(img.width, img.height, img.tabData, tex[3]);
+
+ // NN configure en RGB ou YUV ?
+ if (config->colorMode == RGB) img.ReadRaw(filename);
+
+ // Allocation memoire pour les images
+ for (int i=0; i<2; i++)
+ data[i] = new unsigned char[img.nbPixels*3];
+
+ // Initialisation de la segmentation
+ segm = new SegmNN(&img, config);
+ segm->BuildNN(config->nn_NbCouleurs, LOAD_FROM_FILE);
+
+ group = new Group(&img, segm);
+ SegmAndGroup();
+
+ // Affichage de l'image pilote en RGB et YUV
+ tex[1] = LoadImage(img.width, img.height, data[0], tex[1]);
+ tex[4] = LoadImage(img.width, img.height, data[1], tex[4]);
+}
+
+
+/// Destructeur
+Comm::~Comm()
+{
+ // Fermeture de DevIL
+ ilShutDown();
+
+ // Liberation de la memoire
+ delete config;
+ delete segm;
+ delete group;
+ delete [] data;
+
+ close(fifo);
+}
+
+
+/// Segmente et group les couleurs
+void
+Comm::SegmAndGroup()
+{
+ segm->Segm();
+
+ // Creation de l'image segmentee
+ img.DoImg(segm->tabSegm , data[0]);
+
+ // Creation des groupes
+ if (group) delete group;
+ group = new Group(&img, segm);
+ group->JumpPoints(config->groupColor);
+ group->TabOut();
+
+ img.DoImg(group->tabOut, data[1]);
+
+ tex[2] = LoadImage(img.width, img.height, data[0], tex[2]);
+ tex[5] = LoadImage(img.width, img.height, data[1], tex[5]);
+}
+
+
+/// Synchronisation des poids locaux et de ceux du programme ui
+void
+Comm::SendNodes()
+{
+ char buf[10];
+ for (int i=0; i < config->nn_NbCouleurs*3; i++)
+ {
+ sprintf(buf, "%u\n", segm->node[i]);
+ write(fifo, buf, 10);
+ }
+}
+
+/// Execute une commande venant de l'interface ui
+/// @param *buffer ligne de commande a analyser
+void
+Comm::ExecuteUiCmds(char *buffer)
+{
+ const int NBARG = 20;
+
+ // Division du string
+ char *cut[NBARG]={NULL};
+ cut[0] = strtok(buffer, " \t\n");
+ int i = 0;
+ while ((cut[i] != NULL) && (i<(NBARG-1)))
+ {
+ i++;
+ cut[i] = strtok( NULL, " \t\n");
+ }
+
+ // Detection de la commande recue
+ switch (buffer[0])
+ {
+ case 'i': // ouverture du fifo
+ cout << "Initialisation du fifo\n";
+ // Ouverture du fifo
+ fifo = open("uicmds", O_RDWR);
+ if (!fifo) {
+ cerr << "InitComm : Error during opening FIFO" << endl;
+ exit(1);
+ }
+
+ // On choppe le pid du prog ui situé dans le fichier uiPid.PID
+ FILE *file;
+ file = fopen("ui.PID", "r");
+ if (!file)
+ {
+ cerr << "Comm::ExecuteUiCmds : PID file not found" << endl;
+ exit(1);
+ }
+ char buf[10];
+ fgets(buf, 10, file);
+ uiPid = atol(buf);
+ fclose(file);
+ break;
+
+ case 'c': // changement de couleur
+ int numColor;
+ numColor = atoi(cut[NUMCOLORTOCHANGE]);
+
+ // Changement des valeurs sur les poids du NN
+ for (int i=0; i<3; i++)
+ segm->node[numColor*3+i] = atoi(cut[COLORTOCHANGE+i]);
+
+ // On segmente l'image puis on la stocke
+ SegmAndGroup();
+
+ printf("Couleur %i changé aux valeurs : %u %u %u\n", numColor, segm->node[numColor*3], segm->node[numColor*3+1], segm->node[numColor*3+2]);
+ break;
+
+ case 'm': // mélanger couleurs
+ int nbColorToMerge, numIndexColor;
+
+ // Si on recoit une commande de remise a zero de l'index
+ if (atoi(cut[NBCOLORTOMERGE]) == -1)
+ {
+ for (int i=0; i<config->nn_NbCouleurs; i++)
+ segm->index[i] = i;
+ }
+ // Sinon on mix les couleurs
+ else
+ {
+ nbColorToMerge = atoi(cut[NBCOLORTOMERGE]);
+ numIndexColor = segm->index[atoi(cut[NUMCOLORTOMERGE])];
+
+ // On inscrit les changements dans l'index
+ for (int i=1; i<nbColorToMerge; i++)
+ segm->index[atoi(cut[NUMCOLORTOMERGE+i])] = numIndexColor;
+ }
+
+ // On segmente l'image puis on la stocke
+ SegmAndGroup();
+
+ cout << nbColorToMerge << " colors merged to " << numIndexColor << endl;
+ break;
+
+
+ case 's': // isole une couleur
+ int numColorToShow;
+ numColorToShow = atoi(cut[NUMCOLORTOSHOW]);
+
+ // Cas ou toutes les couleurs doivent etre affiche
+ if (numColorToShow == -1)
+ SegmAndGroup();
+
+ // Afficher seulement une couleur
+ else
+ {
+ segm->Segm(numColorToShow);
+
+ // Creation de l'image segmentee
+ img.DoImg(segm->tabSegm , data[0]);
+
+ // Creation des groupes
+ group = new Group(&img, segm);
+ group->JumpPoints(config->groupColor);
+ group->TabOut();
+
+ img.DoImg(group->tabOut, data[1]);
+
+ tex[2] = LoadImage(img.width, img.height, data[0], tex[2]);
+ tex[5] = LoadImage(img.width, img.height, data[1], tex[5]);
+ }
+ break;
+
+
+ case 'd': // supprimer couleur
+ int numColorToDel;
+ numColorToDel = atoi(cut[NUMCOLORTODEL]);
+
+ // Decalage de toutes les couleurs pour supprimer une couleur
+ unsigned char *pCur;
+ pCur = &config->node[numColorToDel*3];
+ for(int i=numColorToDel*3; i<config->nn_NbCouleurs*3; i++)
+ {
+ *(pCur) = *(pCur+3);
+ pCur++;
+ }
+
+ config->nn_NbCouleurs--;
+
+ // On refait le NN vu qu'il y a une couleur de moins
+ segm->BuildNN(config->nn_NbCouleurs, LOAD_FROM_FILE);
+
+ segm->ShowNodes();
+
+ // On segmente l'image puis on la stocke
+ SegmAndGroup();
+ break;
+
+ case 'r': // Reload l'image
+ int nbNNOutput;
+ nbNNOutput = atoi(cut[NBNNOUTPUT]);
+
+ // Reattribution du nombre de sorties d'origine
+ if (nbNNOutput != -1) config->nn_NbCouleurs = nbNNOutput;
+
+ // Recharge du fichier des poids
+ config->LoadNNFile();
+
+ // On refait le NN vu qu'il y a une couleur de moins
+ segm->BuildNN(config->nn_NbCouleurs, LOAD_FROM_FILE);
+
+ // On segmente l'image puis on la stocke
+ SegmAndGroup();
+
+ // Si l'image a ete sauve on change l'image pivot
+ if (nbNNOutput == -1)
+ {
+ tex[1] = LoadImage(img.width, img.height, data[0], tex[1]);
+ tex[4] = LoadImage(img.width, img.height, data[1], tex[4]);
+ }
+ break;
+
+ case 'g': // Selection du groupe
+ config->groupColor = atoi(cut[NUMGROUP]);
+
+ // On segmente l'image puis on la stocke
+ SegmAndGroup();
+ break;
+
+ case 'n': // Image suivante
+ char *filename;
+ filename = cut[FILENAME];
+ cout << filename << endl;
+
+ // Ouverture de l'image pilote et stockage
+ img.ReadRaw(filename);
+
+ // Allocation memoire pour les images
+ for (int i=0; i<2; i++)
+ {
+ if (data[i]) delete data[i];
+ data[i] = new unsigned char[img.nbPixels*3];
+ }
+
+ tex[0] = LoadImage(img.width, img.height, img.tabData, tex[0]);
+
+ // Conversion en YUV et stockage
+ img.RGBtoYUV();
+ tex[3] = LoadImage(img.width, img.height, img.tabData, tex[3]);
+
+ // NN configure en RGB ou YUV ?
+ if (!config->colorMode == RGB) img.ReadRaw(filename);
+
+ SegmAndGroup();
+
+ // Affichage de l'image pilote en RGB et YUV
+ tex[1] = LoadImage(img.width, img.height, data[0], tex[1]);
+ tex[4] = LoadImage(img.width, img.height, data[1], tex[4]);
+ break;
+
+ case 't': // Entraine le reseau
+ segm->TrainNN();
+
+ // On segmente l'image puis on la stocke
+ SegmAndGroup();
+
+ // Synchronisation des poids avec ui
+ SendNodes();
+
+ break;
+
+ case 'p': // Regenere les poids du reseau
+ int nbColor;
+ nbColor = atoi(cut[NBCOLORNN]);
+
+ // Assignation du nombre de couleurs a isoler par le reseau
+ config->nn_NbCouleurs = nbColor;
+
+ // Genere aleatoire les poids
+ segm->BuildNN(config->nn_NbCouleurs, GENERATE);
+
+ // Apprentissage
+ segm->TrainNN();
+
+ // On segmente l'image puis on la stocke
+ SegmAndGroup();
+
+ // Synchronisation des poids avec ui
+ SendNodes();
+
+ break;
+ }
+
+ DrawGLScene();
+}
+