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 :

affichier un vector de type cvPoint2D32f


Sujet :

C++

  1. #1
    Membre tr�s actif
    Enseignant Chercheur
    Inscrit en
    D�cembre 2011
    Messages
    172
    D�tails du profil
    Informations professionnelles :
    Activit� : Enseignant Chercheur

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 172
    Par d�faut affichier un vector de type cvPoint2D32f
    bonjour
    je suis d�butante en c++, dans mon travail j'utilise la biblioth�que opencv,
    ma question est la suivante: comment je peux afficher un vecteur de type cvPoint2D32f dans un fichier texte?
    j'ai essayer ces instructions :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ofstream fichier ("D:\\test.txt", ios::out | ios::trunc);
    if(fichier){
    for (int i=0;i<pointsout.size(); i++){
    fichier<< pointsout[i]>>std::endl;
    }
    fichier.close();
    }
    alors j'obtiens le message d'erreur suivant:
    error: no match for 'operator <<' in fichier<<pointsout.std::vector<_Tp,_Alloc:::operator[] [with_Tp=CvPoint2D32f, alloc= .....
    et j'ai essayer ces instructions afin d'utiliser printf:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    for (int i=0;i<pointsout.size(); i++){
    printf("%f\t", pointsout[i]);
    }
    fichier.close();
    }
    alors j'ai obtenu l'affichage mais j'ai un probl�me de la conversation de CvPoint2D32f.

    j�esp�re bien trouver une solution rapide. Merci d'avance

  2. #2
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Il faut d�finir l'op�rateur de flux << pour la structure CvPoint2D32f.

    Ou alors, tu acc�des individuellement � ses membres.

  3. #3
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Il y a d�j� une petite erreur dans le code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    ofstream fichier ("D:\\test.txt", ios::out | ios::trunc);
    if(fichier){
    for (int i=0;i<pointsout.size(); i++){
    fichier<< pointsout[i]>>std::endl;
    }
    fichier.close();
    }
    qui devrait �tre
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* la classe ofstream est, d'office, un fichier ouvert en écriture
     *
     * il n'est donc pas utile ni nécessaire de rajouter ios::out comme paramètre
     */
    ofstream fichier ("D:\\test.txt", ios::trunc);
    if(fichier){
    for (int i=0;i<pointsout.size(); i++){
    fichier<< pointsout[i]<<std::endl;
    }
    //Dans une fonction qui ne ferait que ca, la ligne suivante est inutile
    fichier.close();
    }
    (les chevrons doivent tous aller dans le m�me sens )

    Ceci dit, le compilateur te dit exactement ce qui ne va pas dans le message qu'il t'envoie: il ne trouve aucune surcharge de l'op�rateur << qu'il puisse appliquer � un objet de type CvPoint2D32f!

    La raison de cette erreur est toute simple : � la base, le compilateur ne connait l'op�rateur << que pour les types primitifs et n'a aucune id�e de la mani�re dont il devrait s'y prendre pour envoyer n'importe quel type d�fini par l'utilisateur.

    Pour r�soudre ce probl�me, il s'agit d'indiquer au compilateur ce que tu veux qu'il envoie dans le flux lorsqu'il rencontre l'op�rateur << et/ou la mani�re dont tu veux qu'il g�re les donn�es qu'il obtient lorsqu'il rencontre l'op�rateur >>.

    Si je parle des deux en m�me temps, c'est parce que l'on peut assez facilement consid�rer que, si tu prend la peine d'�crire quelque chose dans un fichier, c'est sans doute parce que tu voudras �tre en mesure de r�cup�rer ce quelque chose plus tard

    Pour que ces op�rateurs soient d�finis pour une classe donn�e, il faut
    • Soit que les op�rateurs soient d�finis directement � l'int�rieur de la classe elle-m�me (sous la forme d'une fonction membre)
    • Soit que les op�rateurs soient d�finis en dehors de la classe elle-m�me (sous la forme d'une fonction libre)
    Comme on peut d�cemment estimer que les d�veloppeurs de OpenCV ne seraient pas particuli�rement enchant�s de constater qu'on a �t� tripatouiller dans les classes qu'ils ont d�velopp�es, il me semble clair que nous devrons nous orienter vers une fonction libre, de mani�re � ne pas avoir �, justement, aller rajouter des choses au sein m�me de la classe CvPoint2D32f.

    Comme le nom l'indique, il semblerait que cette classe est un point 2D, qui doit donc contenir une valeur repr�sentant l'abscisse et une autre repr�sentant l'ordonn�e.

    Comme je ne connais pas particuli�rement OpenCV, je vais partir du principe que cette classe propose une fonction x() qui permet de r�cup�rer l'abscisse et une fonction y() qui permet de r�cup�rer l'ordonn�e, mais il faudra sans doute que tu adaptes ces noms � la situation r�elle

    La question qu'il nous reste � trancher, c'est de savoir si tu veux que cette fonction ne soit utilis�e que pour l'�criture (respectivement la lecture) dans un fichier ou si tu veux pouvoir la r�utiliser pour � peu pr�s n'importe quel flux de sortie (respectivement n'importe quel flux d'entr�e).

    On peut en effet envisager surcharger l'op�rateur << de mani�re � ce qu'il fonctionne aussi bien avec un fichier de sortie (ofstream) qu'avec la sortie standard (cout), les flux de conversion (stringstream) ou la sortie d'erreur standard (cerr), tout comme on peut n'envisager de le surcharger que pour les fichiers de sortie.

    Pour r�pondre � cette question, on peut, dans un premier, temps estimer que "qui peut le plus peut le moins" et qu'il sera peut �tre int�ressant de pouvoir afficher les valeurs des diff�rents points ailleurs que dans un fichier.

    Si, par la suite, on se rend compte qu'il faut d�cid�ment restreindre les choses, il suffira de remplacer la classe ostream (qui est la classe de base de tous les flux de sortie format�s) par un type plus sp�cifique (std::ofstream, par exemple).

    La signature attendue pour l'op�rateur << est du genre de std::ostream & operator <<(std::ostream & , UnType const & ).

    Nous n'avons donc qu'� remplacer UnType par le type qui nous int�resse (� savoir CvPoint2D32f) et � indiquer la mani�re dont on veut que les diff�rents �l�ments de cette classe soient envoy�s dans le flux.

    Au final, cela pourrait donc parfaitement ressembler � quelque chose comme
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::ostream & operator << (std::ostream & os, CvPoint2D32f const & p){
        os<<p.x() << " " <<p.y() << std::endl;
        return os;
    }
    mais si tu pr�f�res que la sortie ressemble �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    x = <valeur de l'abscisse> y = <valeur de l'ordonnée>
    cela prendrait sans doute la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    std::ostream & operator << (std::ostream & os, CvPoint2D32f const & p){
        os<< "x = "<<p.x() 
          << " y = " <<p.y() << std::endl;
        return os;
    }
    N'oublie pas que, si tu pr�vois d'�tre en mesure de lire un CvPoint2D32f, tu devras red�finir l'op�rateur >> correspondant.

    Pour la premi�re version, cela pourrait ressembler (je fais vraiment simple, hein ?) �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    std::istream & operator >> (std::istream & is, CvPoint2D32f & p){
        float x;
        float y;
        is>> x >> y;
        p = CvPoint2D32f(x,y);
        return is;
    }
    Note qu'il sera peut �tre int�ressant de s'assurer que nous sommes bien en train de lire un point, et de la coh�rence des donn�es lues...

    Mais ca, c'est un autre d�bat
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  4. #4
    Membre tr�s actif
    Enseignant Chercheur
    Inscrit en
    D�cembre 2011
    Messages
    172
    D�tails du profil
    Informations professionnelles :
    Activit� : Enseignant Chercheur

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 172
    Par d�faut
    Bonjour et merci pour votre r�ponse.
    j'ai essayer le code comme vous m'avez propos�;
    j'ai ajouter la d�claration de la fonction comme suite:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::ostream & operator << (std::ostream & os, CvPoint2D32f const & p){
        os<<p.x() << " " <<p.y() << std::endl;
        return os;
    }
    et j'ai d�clar� un fichier comme ca:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    ofstream fichier ("D:\\test.txt", ios::trunc);
    et j'ai appeler la fonction pour la r�cup�ration des cordonn�es (x y) comme �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    if(fichier){
    for (int i=0;i<pointsout.size(); i++){
    fichier<<(fichier, pointsout[k]);
    }
    j'obtiens l'erreur suivante:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    D:\\Dense.cpp||In function 'std::ostream& operator<<(std::ostream&, const CvPoint2D32f&)':| 
    D:\\Dense.cpp|13|error: 'p->CvPoint2D32f::x' cannot be used as a function| 
    D:\\Dense.cpp|13|error: 'p->CvPoint2D32f::y' cannot be used as a function|
     ||=== Build finished: 2 errors, 0 warnings ===|
    help!

  5. #5
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    encore une fois, le compilateur te dit exactement ce qui ne lui convient pas... Je cite :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    'p->CvPoint2D32f::x' cannot be used as a function
    et
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    'p->CvPoint2D32f::y' cannot be used as a function
    Mais, je me cite �galement :
    Citation Envoy� par koala01
    Comme je ne connais pas particuli�rement OpenCV, je vais partir du principe que cette classe propose une fonction x() qui permet de r�cup�rer l'abscisse et une fonction y() qui permet de r�cup�rer l'ordonn�e, mais il faudra sans doute que tu adaptes ces noms � la situation r�elle
    De toute �vidence, la classe CvPoint2D32f ne pr�sente pas de fonction nomm�e x() ni de fonction nomm�e y().

    Par contre, �tant donn� qu'il reconnait les membre CvPoint2D32f::x et CvPoint2D32f::y, je peux envisager deux solutions (je ne me suis pas int�ress� � OpenCV depuis mon intervention pr�c�dente )
    Soit x et y sont des donn�es publiques, et, dans ce cas, le code pour l'op�rateur << ressemblerait � quelque chose de plus proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::ostream & operator << (std::ostream & os, CvPoint2D32f const & p){
        os<<p.x << " " <<p.y << std::endl;
        return os;
    }
    Soit, les membres x et y sont priv�s, et la fonction qui te permet d'acc�der � leur valeur est proche de getX() et getY(). Dans ce cas, le code pour l'op�rateur << ressemblerait �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::ostream & operator << (std::ostream & os, CvPoint2D32f const & p){
        os<<p.getX() << " " <<p.getY() << std::endl;
        return os;
    }
    Je ne vais pas commencer � v�rifier ce qu'il en est dans OpenCV.

    Je t'ai expliqu� le principe, j'estime l'avoir fait de mani�re compr�hensible, � toi de te d�brouiller avec la connaissance de OpenCV que tu as et que je n'ai pas pour arriver � adapter le code que je t'ai donn�
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  6. #6
    Membre tr�s actif
    Enseignant Chercheur
    Inscrit en
    D�cembre 2011
    Messages
    172
    D�tails du profil
    Informations professionnelles :
    Activit� : Enseignant Chercheur

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 172
    Par d�faut
    Merci autre fois!
    j'ai essay� votre proposition:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    os<<p.x<<" "<<p.y << std::endl
    et �a marche bien!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 11
    Dernier message: 15/02/2011, 17h25
  2. [STL]vector de type compos� et fonction sort
    Par LordBob dans le forum SL & STL
    R�ponses: 14
    Dernier message: 21/03/2007, 11h56
  3. vector et type
    Par r0d dans le forum SL & STL
    R�ponses: 17
    Dernier message: 28/04/2006, 17h41
  4. Pb de conversion: double[] vers un vector type???
    Par hycsos dans le forum SL & STL
    R�ponses: 4
    Dernier message: 15/01/2006, 07h59
  5. variable type tableau (vector) statique / constants
    Par Kaktus dans le forum SL & STL
    R�ponses: 5
    Dernier message: 13/10/2005, 22h46

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