IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Traitement d'image en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
    	int largeurImage;
    	int hauteurImage;
    	unsigned char *donneesRGB; /* Donnees sauvees dans l'ordre bleu-vert-rouge */
    } DonneesImageRGB;

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
        [d+(3*c*(image2->largeurImage))]
        par exemple

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

        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        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

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    J'ai un problème de segmentation fault à la compilation
    A l'exécution plutôt, non ?

    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.

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    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
    Par défaut
    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+

Discussions similaires

  1. Traitement d'images : quel langage?
    Par belasri dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 07/10/2005, 09h59
  2. Réponses: 5
    Dernier message: 15/01/2005, 18h29
  3. commande c++ pour le traitement d'images
    Par mateo.14 dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2005, 10h46
  4. [lib] Traitement d'images
    Par Gogoye dans le forum Multimédia
    Réponses: 4
    Dernier message: 19/11/2004, 16h15
  5. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo