summaryrefslogtreecommitdiff
path: root/2004/i/nono/src/ovision/oconfig.cc
diff options
context:
space:
mode:
Diffstat (limited to '2004/i/nono/src/ovision/oconfig.cc')
-rw-r--r--2004/i/nono/src/ovision/oconfig.cc348
1 files changed, 348 insertions, 0 deletions
diff --git a/2004/i/nono/src/ovision/oconfig.cc b/2004/i/nono/src/ovision/oconfig.cc
new file mode 100644
index 0000000..921449e
--- /dev/null
+++ b/2004/i/nono/src/ovision/oconfig.cc
@@ -0,0 +1,348 @@
+// config.cc - Classe OConfig
+// nono - Programme du robot Efrei Robotique I1-I2 2004
+// Copyright (C) 2004 Olivier Gaillard
+
+/// @file config.cc Charge le fichier config et distribue les variables
+
+#include "oconfig.h"
+#include <iostream>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string>
+using namespace std;
+
+
+/// Parse une ligne du fichier de config
+/// @param *var nom de la variable a fixer
+/// @param *arg valeur de la variable
+void OConfig::Parse(char *var, char *arg) {
+
+ char argu[20];
+
+ if (!arg) cerr << "OConfig::Parse : Error during config file parsing" << endl;
+
+ strcpy(argu, arg);
+
+ // Verifie si l'argument est un nombre ou un nom de fichier
+ if (((argu[0]>'9') || (argu[0] < '0'))
+ && strcmp(var, "Source") && strcmp(var, "imgPath")) {
+ FILE *file;
+
+ file=fopen(arg, "r");
+ if (!file) cerr << "OConfig::Parse : Bad pathfile for " << arg << endl;
+
+ fgets(argu, 20,file);
+
+ fclose(file);
+ }
+
+ // Affecte la valeur de argu a la variable var
+ if (!strcmp(var, "Hauteur_Image")) height = atoi(argu);
+ else if(!strcmp(var,"Largeur_Image")) width = atoi(argu);
+ else if(!strcmp(var,"NN_Step_Learning")) nn_sl = atof(argu);
+ else if(!strcmp(var,"NN_Neighborhood_Learning")) nn_nl = atof(argu);
+ else if(!strcmp(var,"NN_Number_Iteration_Learning")) nn_nil = atol(argu);
+ else if(!strcmp(var,"NN_Nombre_Couleurs")) nn_NbCouleurs = atoi(argu);
+ else if(!strcmp(var,"NN_Influence_Luminosite")) nn_influ_lum = atof(argu);
+ else if(!strcmp(var,"imgPath")) strcpy(imgPath, argu);
+ else if(!strcmp(var,"NN_Lazy_Threshold")) nn_lazy_threshold = atoi(argu);
+ else if(!strcmp(var,"Map_Error")) map_error = atoi(argu);
+ else if(!strcmp(var,"Map_Error_Part")) map_error_part = atoi(argu);
+ else if(!strcmp(var,"Angle_Ball")) angle_ball_weight= atoi(argu);
+ else if(!strcmp(var,"Distance_Ball_Robot")) distance_ball_robot_weight = atoi(argu);
+ else if(!strcmp(var,"Distance_Ball_Goal")) distance_ball_goal_weight = atoi(argu);
+ else if(!strcmp(var,"Ball_Density")) ball_density_weight = atoi(argu);
+ else if(!strcmp(var,"Ennemy_Presence")) ennemy_presence_weight = atoi(argu);
+ else if(!strcmp(var,"Ball_Precision")) ball_precision_weight = atoi(argu);
+ else if(!strcmp(var,"Skepticism")) skepticism_weight = atoi(argu);
+ else if(!strcmp(var,"Skepticism_Max")) skepticism_max = atoi(argu);
+ else if(!strcmp(var,"Source"))
+ {
+ if (!strcmp(argu, "file")) source = SOURCE_FILE;
+ else if (!strcmp(argu, "usbcam")) source = SOURCE_USB_CAM;
+ else if (!strcmp(argu, "cam")) source = SOURCE_CAM;
+ }
+
+}
+
+
+/// Constructor
+/// @param *filename nom du fichier de config
+OConfig::OConfig(char *filename) {
+
+ const int NBARG = 3;
+ char *cut[NBARG] = {NULL};
+ FILE *file;
+ char ligne[50];
+ int i;
+
+ // Ouverture du fichier de conf
+ file = fopen(filename, "r");
+ if (!file) cerr << "OConfig::OConfig : Error during config file opening" << endl;
+ else cout << "Lecture du ficher de configuration" << endl;
+
+
+ // Parcours des lignes et analyse
+ while(fgets(ligne, 50, file)) {
+ if (ligne[0] == '#') continue;
+
+ // Division du string
+ cut[0] = strtok(ligne, " \n");
+ if (!cut[0]) continue;
+ i=0;
+ while ((cut[i] != NULL) && (i<(NBARG-1))) {
+ i++;
+ cut[i] = strtok( NULL, " \t\n");
+
+ }
+
+ Parse(cut[0], cut[2]);
+ }
+
+ colorMode = 0;
+ color = NULL;
+ node = NULL;
+ index = NULL;
+ LoadThFile();
+ LoadNNFile();
+}
+
+
+/// Chargement des poids d'un reseau de neurones
+/// @param *filePath nom du fichier de poids a charger
+void OConfig::LoadNNFile(char *filePath) {
+ const int NBARG = 4;
+ char *cut[NBARG] = {NULL};
+ FILE *file;
+ char ligne[50];
+ int i;
+ unsigned char *pNode;
+
+ // Ouverture du fichier de conf
+ file = fopen(filePath, "r");
+ if (!file) {
+ cerr << "OConfig::LoadNNFile : Error during poids file opening" << endl;
+ index = new int[nn_NbCouleurs];
+ for (int i=0; i<nn_NbCouleurs; i++)
+ index[i] = i;
+ return;
+ }
+
+ // Nombre de couleurs contenu dans le fichier
+ int numNode=-3;
+ while(fgets(ligne, 50,file))
+ numNode++;
+
+ if (numNode <= 0) {
+ cerr << "OConfig::LoadNNFile : Corrupt poids file" << endl;
+ index = new int[nn_NbCouleurs];
+ for (int i=0; i<nn_NbCouleurs; i++)
+ index[i] = i;
+ return;
+ }
+
+
+ if (node) delete [] node;
+ node = new unsigned char[numNode*3];
+ if (index) delete [] index;
+ index = new int[numNode];
+
+ // Parcours des lignes et analyse
+ numNode=0;
+
+ // Recherche mode de couleur
+ rewind(file);
+
+ if (fgets(ligne, 50, file)) {
+ switch (ligne[0]) {
+ case 'Y': colorMode = YUV;
+ break;
+
+ case 'R': colorMode = RGB;
+ break;
+
+ case 'H': colorMode = HSI;
+ break;
+ }
+ }
+
+ // Recherche couleur des balles
+ if (fgets(ligne, 50, file)) {
+ cut[0] = strtok(ligne, " \t\n");
+ groupColor = atoi(cut[0]);
+ }
+
+ // Recherche couleur des poteaux
+ if (fgets(ligne, 50, file)) {
+ cut[0] = strtok(ligne, " \t\n");
+ goalColor = atoi(cut[0]);
+ }
+
+ while(fgets(ligne, 50, file)) {
+ if (ligne[0] == '#') continue;
+
+ // Division du string
+ cut[0] = strtok(ligne, " \t\n");
+ if (!cut[0]) continue;
+ i=0;
+ pNode = &node[numNode*3];
+ index[numNode] = atoi(cut[0]);
+ while ((cut[i] != NULL) && (i<(NBARG-1))) {
+ i++;
+ cut[i] = strtok( NULL, " \t\n");
+ pNode[i-1] = (unsigned char)atoi(cut[i]);
+ }
+ numNode++;
+ }
+
+ nbNodeMax = numNode;
+
+ fclose(file);
+
+}
+
+/// Creation d'un fichier de poids pour le reseau de neurones
+/// @param *filename nom du fichier a creer
+/// @param mode mode de l'espace de couleur
+/// @param nbOutput nombre de couleurs a detecter du reseau de neurones
+void OConfig::CreateNNFile(const char *filename, int mode, int nbOutput) {
+
+ if (!node) {
+ cerr << "OConfig::CreateNNFile : NN non initialisé\n";
+ return;
+ }
+
+ // Ecriture dans un fichier
+ FILE *file;
+ file = fopen(filename, "w+");
+
+ // Espace de couleur (RGB, YUV, HSI)
+ char buf[50];
+ if (colorMode == RGB) strcpy(buf, "RGB\n");
+ else if (colorMode == YUV) strcpy(buf, "YUV\n");
+ else if (colorMode == HSI) strcpy(buf, "HSI\n");
+
+ fprintf(file, buf);
+
+ // Couleur des balles
+ sprintf(buf, "%i // Index de la couleur des balles\n", groupColor);
+ fprintf(file, buf);
+
+ // Couleur des poteaux
+ sprintf(buf, "%i // Index de la couleur des poteaux\n", goalColor);
+ fprintf(file, buf);
+
+ fprintf(file, "#index\t#x1\tx2\tx3\n");
+ for (int i=0; i<nbOutput; i++) {
+ fprintf(file, "%i\t", index[i]);
+ for (int j=0; j<3; j++)
+ fprintf(file, "%u\t", node[i*3+j]);
+ fprintf(file, "\n");
+ }
+
+ fclose(file);
+}
+
+
+
+/// Chargement d'un fichier de seuils
+void OConfig::LoadThFile() {
+ const int NBARG = 6;
+ char *cut[NBARG] = {NULL};
+ FILE *file;
+ char ligne[50];
+ int i;
+ unsigned char *pColor;
+
+ // Ouverture du fichier de conf
+ file = fopen("threshold", "r");
+ if (!file) {
+ cerr << "OConfig::LoadThFile : Error during config file opening\n" << endl;
+ return;
+ }
+
+ // Nombre de couleurs contenu dans le fichier
+ int numColor=0;
+ while(fgets(ligne, 50,file))
+ numColor++;
+
+ if (color) delete [] color;
+ color = new unsigned char[numColor*3*2];
+
+ // Parcours des lignes et analyse
+ numColor=0;
+ rewind(file);
+ while(fgets(ligne, 50, file)) {
+ if (ligne[0] == '#') continue;
+
+ // Division du string
+ cut[0] = strtok(ligne, " \t\n");
+ if (!cut[0]) continue;
+ i=0;
+ pColor = &color[numColor*6];
+ pColor[0] = (unsigned char)atoi(cut[0]);
+ while ((cut[i] != NULL) && (i<(NBARG-1))) {
+ i++;
+ cut[i] = strtok( NULL, " \t\n");
+ pColor[i] = (unsigned char)atoi(cut[i]);
+ }
+ numColor++;
+ }
+
+ nbCouleurMax = numColor;
+
+ fclose(file);
+}
+
+
+
+/// Chargement de la table des distances
+void OConfig::LoadDistFile(char *filename, int **tab, int &height, int &width) {
+
+ FILE *file;
+
+ // Ouverture du fichier de distance
+ file = fopen(filename, "rb");
+ if (!file) {
+ cerr << "OConfig::LoadDistFile : Error during poids file opening" << endl;
+ return;
+ }
+
+ fwrite(&height, 1, sizeof(int), file);
+ fwrite(&width, 1, sizeof(int), file);
+
+ if (*tab) delete[] *tab;
+ *tab = new int[height*width];
+
+ fwrite(*tab, height*width, sizeof(int), file);
+ fclose(file);
+
+}
+
+/// Creation d'un fichier pour la table des distances
+void OConfig::CreateDistFile(char *filename, int *tab, int height, int width) {
+
+ if (!tab) {
+ cerr << "OConfig::CreateDistFile : tab vide\n";
+ return;
+ }
+
+ // Ecriture dans un fichier
+ FILE *file;
+ file = fopen(filename, "wb+");
+
+ fwrite(&height, 1, sizeof(int), file);
+ fwrite(&width, 1, sizeof(int), file);
+ fwrite(tab, height*width, sizeof(int), file);
+ fclose(file);
+}
+
+
+
+/// Destructor
+OConfig::~OConfig()
+{
+}
+
+
+