// imgFile.cc - Classe Image // nono - Programme du robot Efrei Robotique I1-I2 2004 // Copyright (C) 2004 Olivier Gaillard // Chargement des librairies DevIL #include #include /// @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(); tabData = NULL; } /// 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; }