Salut
j'ai vraiment besoin de vos aides.
En fait, je suis un électronicienne et je travaille sur la reconnaissance de visage.
Et dans le cadre de mon Pfe,je dois implémenter un système d'identification en langage C.
Le premier obstacle est comment lire un fichier bmp (image en niveau de gris) et afficher les valeurs de ses pixels dans un vecteur.
J'ai écris ce code,et il a fonctionné,mais je doute si les valeurs affichées sont les valeurs voulues ou pas.
voici mon code:
// Bibliothèques utilisées...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
// Définition et déclaration de la structure bitmap
typedef struct
{
char sign[3]; // signature « BM »
int taille; // taille de l'image
int res; // zone réservée
int offset; // adresse du dbt de l'image
int info; // taille de la zone info
int largeur; // largeur de l'image
int longueur ; // hauteur de l'image
short nbplan; // nbre de plans
short bppixel; // mode en bits / pixel
int comp; // format de compression
int tim; // taille de l'image en octets
int Hres; // résolution Horizontale
int Vres; // résolution Verticale
int nbco; // nbre de couleurs utilisées
int impco; // nbre de couleurs importantes
unsigned char *palette; // optionnelle
unsigned char* pixel; // ou sera stocké les pixels
} bitmap;
// Prototype des fonctions
bitmap* lecture(char*) ;
int vect[10304];
int conv (unsigned char hex[4],int) ;
unsigned char a;
void main (void)
{
int i,k;
char nom[100]; //pour stocker le nom et le chemin de l'image
bitmap* bmp; //pour récupérer les infos de l'image
printf("Entrer le nom et le chemin de l'image sans l'extension BMP :\n");
gets(nom); // on récupère le nom et le chemin de l'image
strcat(nom,".bmp"); // on ajoute l'extension .bmp à ce fichier
bmp=lecture(nom); //on utilise la fonction lecture pour récupérer les infos
//printf ("\nSignature :\t\t\t %.2s\n",bmp->sign); //et on les affiche en parcourant les différents champs de la structure bmp
//printf ("Taille du fichier :\t\t %d\n",bmp->taille);
//printf ("Offset de debut de l'image :\t %d\n",bmp->offset);
//printf ("Taille du bitmap info :\t\t %d\n",bmp->info);
//printf ("Largeur :\t\t\t %d\n",bmp->largeur);
//printf ("Longueur :\t\t\t %d\n",bmp->longueur);
//printf ("Nombre de plans :\t\t %d\n",bmp->nbplan);
//printf ("Bits par pixels :\t\t %d\n",bmp->bppixel);
//printf ("Compression :\t\t\t %d\n",bmp->comp);
//printf ("Taille de l'image :\t\t %d\n",bmp->tim);
//printf ("Resolution verticale :\t\t %d\n",bmp->Vres);
//printf ("Resolution horizontale :\t %d\n",bmp->Hres);
//printf ("Nombre de couleurs :\t\t %d\n",bmp->nbco);
//printf ("Couleurs importantes :\t\t %d\n\n",bmp->impco);
for(i=0;i<10304;i++)
{
a=*(bmp->pixel)++;
vect[i]=a;
}
};
bitmap* lecture(char* nom)
{
unsigned char temp[4]; // chaine de carac temporaire qui sera utilisé pour récupérer les différentes infos
bitmap *bmp; // variable renvoyée par la fonction
FILE * fichier; // un pointeur sur FILE
bmp=(bitmap*)malloc(sizeof(bitmap)); // on alloue dynamiquement le pointeur sur bitmap
fichier = fopen (nom,"r"); // on ouvre le fichier en lecture seule
fread (bmp->sign,2,1,fichier); // on récupère la signature
fread (&temp,4,1,fichier); // puis la taille de l'image
bmp->taille = conv (temp,4); // que l'on converti en décimal
fread (&temp,4,1,fichier); // la zone réservée
fread (&temp,4,1,fichier); // l'offset
bmp->offset = conv (temp,4); // que l'on converti aussi
fread (&temp,4,1,fichier); // taille de la zone info
bmp->info = conv (temp,4);
fread (&temp,4,1,fichier); // la largeur de l'image
bmp->largeur = conv(temp,4);
fread (&temp,4,1,fichier); // la hauteur de l'image
bmp->longueur = conv(temp,4);
fread (&temp,2,1,fichier); // le nombre d'info
bmp->nbplan = conv (temp,2);
fread (&temp,2,1,fichier); // le mode d'affichage
bmp->bppixel = conv (temp,2);
fread (&temp,4,1,fichier); // le format de compression
bmp->comp = conv (temp,4);
fread (&temp,4,1,fichier); // la taille de l'image
bmp->tim = conv (temp,4);
fread (&temp,4,1,fichier); // les résolutions horizontale
bmp->Hres = conv (temp,4); // et verticale
fread (&temp,4,1,fichier);
bmp->Vres = conv (temp,4);
fread (&temp,4,1,fichier);
bmp->nbco = conv (temp,4); // nbre de couleurs utilisées
fread (&temp,4,1,fichier);
bmp->impco = conv (temp,4); // nbre de couleurs importantes
fclose (fichier); // on ferme le fichier
bmp->pixel=(unsigned char*)malloc(sizeof(bmp->taille));
fread(bmp->pixel,1,bmp->taille,fichier);
return bmp; // on retourne le pointeur sur la structure bitmap
}
int conv (unsigned char hex[4],int nb)
{
int res=0,i;
for (i=nb-1;i>=0;i--)res=res*256+hex[i];
return res;
}
Ce que me gène est l'instruction:
for(i=0;i<10304;i++)
{
a=*(bmp->pixel)++;
vect[i]=a;
}
Je sais pas si c vraiment correcte ou pas
et si non comment je puisse la corriger.
merci