summaryrefslogtreecommitdiff
path: root/2004/i/nono/src/ovision/imgFile.cc
blob: 98af37ad58f181cde6cf964573f7d92d3b195c72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// imgFile.cc - Classe Image
// nono - Programme du robot Efrei Robotique I1-I2 2004
// Copyright (C) 2004 Olivier Gaillard

// Chargement des librairies DevIL
#include <IL/il.h>
#include <IL/ilu.h>

/// @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 <iostream>
#include <stdlib.h>
#include <math.h>
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;
}