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 :

convertion assez compliquée


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut convertion assez compliquée
    bonjour,

    Je parcours une image pour récupérer ça valeur en niveau de gris. Le type est un unsigned char (0 à 255) et j'aimerai recopier cette image dans un tableau (int** tab) -> ma convertion devrai donc etre un passage d'un unsigned char vers un int mais les convertions générale (atoi(), strtoul()) ne marche pas car ils ont besoins d'un const char*!!

    Quelqu'un pourrait m'aider à faire cette convertion proprement?

    Merci.

  2. #2
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    exemple de conversion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char c = 'a';
    int i = static_cast<int>(c);
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Le type char est un type arithmétique donc ta conversion ne pose pas de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    unsigned char monTableauChar[10];
    int monTableauInt[10];
    std::copy(monTableauChar, monTableauChar+10, monTableauInt);

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    voici mon code:
    ImgSeuil rend un unsigned char
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int copy;
     
    for (int i=0,int ii=1; i < ImgSeuil.hauteur(); i++, ii++) // pure copie
    	{
          for (int j=0,int jj=1; j < ImgSeuil.largeur(); j++, jj++)
    	  {
    		  copy= static_cast<int>(ImgSeuil(i,j));
    		  Etiq[ii][jj] = copy; 
    	  }
    	}
    la compilation ne trouve aucune erreur, mais en mode debug copy reçois bien la valeur de ImgSeuil mais Etiq reste à 0. Donc je pense que j'ai un autre problème. Je suppose fortement qu'il n'est pas possible de faire une égalité entre un int** et un int, mais je ne c plus comment faire pour effectuer ce passage de valeur (le static cast ne permet pas de passé directement de unsigned char en int* ou int**).

    Pour la 2ème solution, j'ai pas compris quelles sont les valeurs à mettre dans copy(). Pourrais-tu un peu plus détaillé?

    merci à tous les deux.

  5. #5
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Qu'est ce que c'est Etiq exactement ? Comment tu l'as déclaré ? Comment tu as alloué sa mémoire ?

    ii et jj commence à 1... est ce normale ? ça ne devrait pas plutot etre 0 ? Attention aux depassements.

    ImgSeuil(i,j) retourne un unsigned char ou un unsigned char * ?
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par Rafoo
    la compilation ne trouve aucune erreur, mais en mode debug copy reçois bien la valeur de ImgSeuil mais Etiq reste à 0. Donc je pense que j'ai un autre problème.
    Quel est le type de Etiq ? C'est normal que les coordonnées de Etiq soient commencent à 1 et non pas a 0 ?

    Citation Envoyé par Rafoo
    Pour la 2ème solution, j'ai pas compris quelles sont les valeurs à mettre dans copy(). Pourrais-tu un peu plus détaillé?
    Regarde http://www.sgi.com/tech/stl/copy.html. Mais ça n'est pas forcément applicable dans ton cas.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    Pour résumer, je fais du traitement d'image et j'ai besoin d'étiqueter les objets présent dans mon image.

    mon algo à besoin des valeurs de mon image pour commencer à faire mon étiquetage. le type de ImgSeuil est bien unsigned char (valeur de 0 à 255)

    j'ai besoin de compter un grand nombre de défaut, donc j'ai choisi de prendre un int comme support. je fais un tableau à deux dimension d'ou le int**(type de Etiq).

    voici son allocation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int** Etiq;
     
    Etiq= new int* [ImgSeuil.hauteur()+1];
    for (int i=0; i<ImgSeuil.hauteur()+1; i++)
         Etiq[i]= new int [ImgSeuil.largeur()+1];
     
    for(int i=0; i<ImgSeuil.hauteur()+1; i++)
    	{
    		for(int j=0; j<ImgSeuil.largeur()+1; j++)
    		{
    			Etiq[i][j]=0;
    		}
    	}
    Maintenant j'ai besoin de copier mon image de départ dans mon support, mais il me faut un support plus grand que mon image d'origine (c de la que vient le départ à 1 de la boucle pour mon image).


    J'arrive bien à récupérer la valeur de mon image et à la convertire en int, mais je n'arrive pas à la placer dans mon tableau à deux dimension...

    Voilà, j'espère que je suis un peu plus clair?

    merci pour l'aide

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Si tu veux vraiment agrandir ton image de départ (ce qui n'est pas nécessaire pour l'étiquetage de composantes connexes), fais le de 1 dans chaque direction. La hauteur de Etiq est donc égale à celle de ImgSeuil+2, idem pour la largeur.

    Le type int étant au moins aussi large que le type char,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Etiq[i+1][j+1] = ImgSeuil(i,j);
    ne devrait pas poser de problème. Ton code est-il un exemple minimal montrant le problème ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    oui tu as raison, il faut que je rajoute +2, dans mon autre version, j'utilisait une fonction et j'ai omis ce petit détail.

    par contre, je viens de voir que si en mode debug j'utilise l'espion express, ma variable obtiens bien ma valeur, alors que si je pointe sur la variable avec la souris pour voir la valeur directement, j'obtiens zéro... bizzard.

    Donc ta méthode en direct marche bien, ce qui me semble normal, je ne comprennait pas pourquoi la valeur ne changeait pas lol

    Encore merci pour ton aide.

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

Discussions similaires

  1. [Impression] Job assez compliqué
    Par narmataru dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/12/2008, 18h37
  2. [XSLT] Un comptage de noeud assez compliqué
    Par lautux dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/02/2007, 14h51
  3. [MySQL] Afficher une page avec les données de la base de données... Assez compliqué
    Par snakejl dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 19/05/2006, 10h46
  4. Requete assez compliqué avec plusieur resultat
    Par castelligreg dans le forum Access
    Réponses: 3
    Dernier message: 18/04/2006, 22h27
  5. Réponses: 4
    Dernier message: 15/09/2005, 14h21

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