From 109db2b0cce1b89c75e32f3705a1c5975391b3c5 Mon Sep 17 00:00:00 2001 From: gaillaro Date: Sat, 1 May 2004 11:52:08 +0000 Subject: Ajout de ovision. --- 2004/i/nono/src/ovision/imgFile.cc | 137 +++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 2004/i/nono/src/ovision/imgFile.cc (limited to '2004/i/nono/src/ovision/imgFile.cc') diff --git a/2004/i/nono/src/ovision/imgFile.cc b/2004/i/nono/src/ovision/imgFile.cc new file mode 100644 index 0000000..1ee5df6 --- /dev/null +++ b/2004/i/nono/src/ovision/imgFile.cc @@ -0,0 +1,137 @@ +// imgFile.cc - Classe Image +// nono - Programme du robot Efrei Robotique I1-I2 2004 +// Copyright (C) 2004 Olivier Gaillard + +/// @file imgFile.cc Chargement des images, conversion en YUV, HSI, detection des contours, transformation d'une image segmentee en RGB, ecriture de l'image sur le disque + +#include "imgFile.h" +#include +#include +#include +using namespace std; + +/// tableau de couleur utlisation pour la creation de l'image segmentee +unsigned char tabCol[9][3] = + {{0, 0, 0}, {255, 255, 255}, {0, 0, 255}, + {0,255,0}, {255, 0, 0}, {0, 150, 60}, + {150,60,0}, {0, 150, 60}, {20, 50, 120}}; + + + +/// Constructor ImgFile +ImgFile::ImgFile(void) +{ + // Initialisation de DevIL. + ilInit(); +} + + +/// Destructor ImgFile +ImgFile::~ImgFile(void) +{ + /// Fermeture de DevIl + ilShutDown(); +} + + +/// Ouvre un fichier +int ImgFile::ReadRaw (char *filename) +{ + ILuint ImgFileId; + + // Supprime l'id d'une image dans DevIL + if (tabData) { + ilDeleteImages(1, &ImgFileId); + } + + // Generation de l'id + ilGenImages(1, &ImgFileId); + + // Selection de l'image courante + ilBindImage(ImgFileId); + + // Chargement de l'image avec DevIL + if (!ilLoadImage(filename)) { + cerr << "Could not open file...exiting." << endl; + return 0; + } + + // Caracteristiques d'une image + height = ilGetInteger(IL_IMAGE_HEIGHT); + width = ilGetInteger(IL_IMAGE_WIDTH); + nbPixels = height*width; + + cout << "Width: " << width << " Height: " << height + << " Depth: " << ilGetInteger(IL_IMAGE_DEPTH) << " Bpp: " << ilGetInteger(IL_IMAGE_BITS_PER_PIXEL) << endl; + + // Recuperation des donnees RGB + if (tabData) delete [] tabData; + tabData = new unsigned char[nbPixels*3]; + ilCopyPixels(0,0,0,width,height,1,IL_RGB,IL_UNSIGNED_BYTE,(ILvoid*)tabData); + + return 1; +} + +/// Cree un tableau en RGB pour l'affichage a partir d'une image segmentee + +/// @param *tabIn pointeur vers un tableau de donnees segmentees +/// @param *tabOut pointeur vers un tableau de donnees RGB +void ImgFile::DoImg(unsigned char *tabIn, unsigned char *tabOut) { + if (tabIn) { + // Change les couleurs segmentees en valeurs RGB pour l'affichage + for (int i=0; i<(int)(nbPixels);i++) { + tabOut[i*3] = tabCol[tabIn[i]][0]; + tabOut[i*3+1] = tabCol[tabIn[i]][1]; + tabOut[i*3+2] = tabCol[tabIn[i]][2]; + } + } + else { + // Si la table donnee est vide on renvoie des couleurs noires + for (int i=0; i<(int)(nbPixels);i++) { + tabOut[i*3] = 0; + tabOut[i*3+1] = 0; + tabOut[i*3+2] = 0; + } + } +} + + +/// Cree une image et l'ecrit sur le disque + +/// @param *filename nom du fichier cree +/// @param *tabSegm tableau de donnees segmentees a transformer en image +void ImgFile::WriteSegm (char *filename, unsigned char *tabSegm) { + + ILuint ImgFileIdSegm; + unsigned char *tabOut; + + // Verification du pointeur passe en argument + if (!tabSegm) { + cerr << "ImgFile::Write : Rien a ecrire dans le fichier\n"; + return; + } + + // Preparation des donnees + tabOut = new unsigned char[nbPixels*3]; + + DoImg(tabSegm, tabOut); + + // Generation de l'id + ilGenImages(1, &ImgFileIdSegm); + + // Selection de l'image courante + ilBindImage(ImgFileIdSegm); + + // Creation de l'image test + ilTexImage(width, height*2, 1, 3, IL_RGB, IL_UNSIGNED_BYTE, NULL); + ilSetPixels(0,height,0,width,height,1,IL_RGB, IL_UNSIGNED_BYTE, (ILvoid*)tabOut); + ilSetPixels(0,0,0,width,height,1,IL_RGB, IL_UNSIGNED_BYTE, (ILvoid*)tabData); + iluRotate(180); + + // Sauvegarde de l'image + ilEnable(IL_FILE_OVERWRITE); + ilSaveImage(filename); + + // Libere la memoire + delete [] tabOut; +} -- cgit v1.2.3