Précédent   Forum des professionnels en informatique > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/01/2012, 00h28   #1
Invité de passage
 
Homme Yann
Étudiant
Inscription : janvier 2012
Messages : 1
Détails du profil
Informations personnelles :
Nom : Homme Yann
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : janvier 2012
Messages : 1
Points : 0
Points : 0
Par défaut Traitement d'image en C

Bonjour,
Je programme en c, une fonction de traitement d'image.
J'ai un problème de segmentation fault à la compilation. Mais, quand je remplace largeurImage et hauteurImage par un chiffre entre 0 et 5, le programme marche.
Voici le début du programme:

Code C :
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
DonneesImageRGB* fonctionmoyenneur (DonneesImageRGB* image2)
{
 
   unsigned char tableau1 [9];
   float moyenne1;
   int a,b,c,d;
   int temp;
   int cpt=0;
   int i;
 
  DonneesImageRGB* image3 = (DonneesImageRGB*)malloc(sizeof(DonneesImageRGB)); 
   image3 -> hauteurImage = image2 -> hauteurImage;
   image3 -> largeurImage = image2 -> largeurImage;
   image3 -> donneesRGB = (unsigned char*)malloc(3*image3->largeurImage*image3->hauteurImage*sizeof(char));
 
   for(i=0;i<image3 -> hauteurImage * image3 -> largeurImage *3; i++)
      image3->donneesRGB[i]=image2->donneesRGB[i];
 
 
   // On met dans un tableau les valeurs des pixels environnant
 
   				for (a=2; a<image3->largeurImage;a++)
 
       				for(b=2; b<image3->hauteurImage;b++)
 
       				{
 
       					for(c=a-1;c<=a+1;c++)
       					{
 
        					for(d=b-1;d<=b+1;d++)
                			tableau1[cpt]= image2->donneesRGB[d+c*image2->largeurImage*3];
 
                			cpt++;
						}

La structure DonneesImageRGB:

Code C :
1
2
3
4
5
6
typedef struct
{
	int largeurImage;
	int hauteurImage;
	unsigned char *donneesRGB; /* Donnees sauvees dans l'ordre bleu-vert-rouge */
} DonneesImageRGB;
banks83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2012, 01h06   #2
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 740
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 740
Points : 9 963
Points : 9 963
Plusieurs remarques :
  • Ce message devrait aller dans le forum C

  • Il faut utiliser la balise CODE (le signe #) en ayant sélectionné le code, ou faire CTRL-C # CTRL-V

  • Sous cette forme je remarque déjà 3 choses ;

    • des espaces entre les noms des éléments de structure et les -> : c'est pas bien

    • étant donné que image2 est un pointeur, je ne sais pas ce que le compilateur interprète quand il voit [d+c*image2->largeurImage*3]. Il est important de bien mettre les parenthèses pour obtenir ce qu'on veut :

      Code :
      [d+(3*c*(image2->largeurImage))]
      par exemple

    • Enfin et le plus important : quand tu fais ta première boucle de remplissage, je vois :

      Code :
      1
      2
      for(i=0;i<image3 -> hauteurImage * image3 -> largeurImage *3; i++)
      image3->donneesRGB[i]=image2->donneesRGB[i];
      Si je comprend le code, il ne me semble pas que image2 ait cette taille...
      Mais plutôt image3 -> hauteurImage * image3 -> largeurImage
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/01/2012, 14h49   #3
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 416
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 39
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Architecte système
Secteur : Industrie

Informations forums :
Inscription : décembre 2006
Messages : 9 416
Points : 14 118
Points : 14 118
Citation:
J'ai un problème de segmentation fault à la compilation
A l'exécution plutôt, non ?

Citation:
Mais, quand je remplace largeurImage et hauteurImage par un chiffre entre 0 et 5, le programme marche.
Ca sent le débordement mémoire.

Certainement dans la ligne tableau1[cpt]= image2->donneesRGB[d+c*image2->largeurImage*3];.

la valeur max semble etre pour c=a+1=largeurImage, et d=b+1=hauteurImage. Ce qui nous donne :

tableau1[cpt] = donneesRGB[ hauteurImage + largeurImage*largeurImage*3 ]

Ca m'a l'air d'être à la fois une inversion de "c" et "d", et aussi un dépassement de valeur limite (il faudrait s'arrêter à largeurImage-1 et hauteurImage-1)
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2012, 01h56   #4
Membre éclairé
 
Homme
Enseignant
Inscription : janvier 2012
Messages : 190
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : janvier 2012
Messages : 190
Points : 380
Points : 380
salut !
je ne suis pas très sûr de ce que tu veux faire, encore que "moyenneur" me donne une petite idée ; et si je ne me trompe pas :
pourquoi recopier les valeurs de image2 dans image3 pour les renplacer ensuite par la moyenne ?
pourquoi placer 9 valeurs dans un tableau pour en faire la moyenne?
A+
anacharsis est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h26.


 
 
 
 
Partenaires

Hébergement Web