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 :

graphe d'image 3D


Sujet :

C++

Vue hybride

mat_monroe graphe d'image 3D 16/05/2007, 14h06
tristan_m Bonjour, Je ne sais pas si... 18/05/2007, 11h27
mat_monroe J'avais fait pas mal de... 18/05/2007, 13h18
tristan_m D'accord, effectivement le... 18/05/2007, 17h10
mat_monroe Bien vu!!! c'est... 21/05/2007, 10h09
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Par défaut graphe d'image 3D
    Bonjour,

    J'ai fait un programme qui crée un graphe à partir d'une image 3D en mettant une arête entre chaque pixels voisins - on considére ici un 6-voisinage. Il compile très bien, mais j'obtiens un segmentation fault.
    Voici le code en question (j'ai enlevé la suite du code pcq pas interessante pour le problème):
    Code : 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
    36
    37
    38
    39
    40
     
    int main(int argc, const char* argv[])
    {
      Image3D<unsigned char> img(argv[1]);
      typedef Graph<double,double,double> GraphType;
      int nb_edges = 6*img.size; //grosse sur-estimation du nbe d'aretes
      GraphType *g = new GraphType(img.size, nb_edges); 
      for (int l = 0; l < img.size; ++l)
        {
          g -> add_node(); 
        }
       //triple boucle de parcours de l'image 3D
      for (int k = 0; k < img.nbz; ++k)
        for (int j = 0; j < img.nby; ++j)
          for (int i = 0; i < img.nbx; ++i)
    	{
    	  int head, tail;
    	  double cap=0;
    	  head = (k)*img.nbx*img.nby + (j)*img.nby + (i); //le pixel courant
    	    if (img.isInside(i, j+1 , k))
    	    {
                 //on calcule la position du noeud dans g
    	     int  tail = (k)*img.nbx*img.nby + (j+1)*img.nby + (i);
    	     //to do : calcul de la capacité de l'arête
    	      g->  add_edge(head ,tail , cap, cap);
    	    }
    	  if (img.isInside(i+1, j , k))
    	    {
    	      int tail = (k)*img.nbx*img.nby + (j)*img.nby + (i+1);
    	     //to do : calcul de la capacité de l'arête
    	      g->  add_edge(head ,tail , cap, cap);
    	    }
    	  if (img.isInside(i, j , k+1))
    	    {
                 int tail = (k+1)*img.nbx*img.nby + (j)*img.nby + (i);
    	     //to do :calcul de la capacité de l'arête
    	      g->  add_edge(head ,tail , cap, cap);
    	    }
    	}
      }
    En utilisant gdb, j'obtiens :
    0x0804a5a1 in main (argc=0, argv=Cannot access memory at address 0xb7fb3000) at GraphCut3D.cc:89
    89 g-> add_edge(head ,tail , cap, cap);

    J'ai bien compris qu'il y a un problème d'accès mémoire, mais pas moyen de trouver quel symbol appelle l'adresse concernée.
    Quand je demande un print de "head", c'est nickel, il me donne la bonne valeur mais quand je demande un print de "tail", j'ai "no symbol tail in context" et pareil pour "cap".
    Je ne sais plus trop quoi faire. Si quelqu'un a une idée...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 89
    Par défaut
    Bonjour,

    Je ne sais pas si tu as réussi à résoudre ton problème?

    En tout cas, dans le code que tu présentes, il risque d'y avoir un conflit entre le tail que tu déclares au tout début des boucles for :
    et les tail que tu déclares à l'intérieur de chaque if:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int  tail = (k)*img.nbx*img.nby + (j+1)*img.nby + (i);
    Donc soit tu supprime la déclaration de tail au début des boucles for, soit tu supprimes les 'int' dans les if

    Après, pourquoi cap ne marche pas non plus, je ne sais...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Par défaut
    J'avais fait pas mal de petits changements pour chercher la cause et ce bazar avec les déclarations/définitions de "tail" en est le résultat. Mais j'avais déjà corrigé le pb. Néanmoins, merci.
    Je n'ai tjs pas résolu ce mic-mac, aussi si quelqu'un a une idée, je suis preneur car je ne sais plus trop quoif aire avec ce code qui n'est pourtant pas très compliqué (c'est d'ailleurs d'autant plus énervant!)

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 89
    Par défaut
    D'accord, effectivement le problème est plus complexe qu'il n'y paraissait alors

    Comme ça, je ne vois pas où est le problème (je ne suis pas d'une grande aide désolé).

    J'aurais quelques questions par contre :
    Les print de tail et cap, tu les avais bien mis juste avant l'appel à add_edge()?

    Tu as essayé de vérifier la ligne où ça plantait en exécutant pas à pas avec un debugger (ou en mettant des print dans tous les sens)?
    C'est bien la ligne que tu as indiquée?

    [HS]
    Sinon accessoirement dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    head = (k)*img.nbx*img.nby + (j)*img.nby + (i)
    ce n'est pas img.nbx que devrait multiplier j?
    (idem pour les calculs de tail)
    [/HS]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Par défaut
    Bien vu!!! c'est effectivement une erreur, le pire c'est que je l'ai écrit correctement sur mon cahier et quand j'ai tapé le code, j'ai mélangé le bazar. Et y'a des chances que ce soit ça qui entraine la segmentation fault. Je corrige ça et je regarde si ça change.
    Merci du coup de main

    Les print de tail et cap, tu les avais bien mis juste avant l'appel à add_edge()?
    Euh, ce sont les print du debbuger, ceux qui te permettent de connaître la valeur du symbole à un endroit du code...

    Tu as essayé de vérifier la ligne où ça plantait en exécutant pas à pas avec un debugger (ou en mettant des print dans tous les sens)?
    C'est bien la ligne que tu as indiquée?
    Comme je le disais juste au-dessus, c'est déjà fait le coup du debbuger et ça me donne aps bcp d'info au final

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2004
    Messages : 25
    Par défaut
    Bon, ça change rien au problème... mais c'était quand même une correctionne bonne à prendre.
    Thanks!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recalage de deux graphes d'images 3D (graphe de reeb)
    Par mokakimo dans le forum MATLAB
    Réponses: 3
    Dernier message: 10/09/2008, 15h59
  2. [JFreechart] Rediriger le graphe vers image
    Par maserati dans le forum 2D
    Réponses: 4
    Dernier message: 01/06/2007, 20h08
  3. graphe vers image jpeg
    Par me_yassine dans le forum 2D
    Réponses: 3
    Dernier message: 01/06/2007, 14h41
  4. Copier le contenu d'une feuille Excel avec graphes et images
    Par billynirvana dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 12/01/2007, 20h25
  5. [TP] Enregistrement d'un graphe en image
    Par Alanis dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 07/04/2006, 17h22

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