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 :

Problème de lecture des éléments d'un vecteur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de miss_angel
    Inscrit en
    Février 2008
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 210
    Par défaut Problème de lecture des éléments d'un vecteur
    Bonsoir,
    J'ai un problème avec la fonction "HOGDescriptor" de la bib OpenCV, qui permet d'extraire les descripteurs d'une image via des histogrammes orientés de gradient. Bref, en appliquant cette fonction, en particulier quand je veux accéder aux éléments du vecteur contenant les descripteurs de l'image, ça bug avec une erreur de violation d'accès: Access violation reading location 0x00000004.
    Voici ma version de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    IplImage img = cvLoadImage("C:/Test.jpg");
    HOGDescriptor d;
    vector<float> descriptorsValues;
    vector<Point> locations;
    d.compute( img, descriptorsValues, Size(0,0), Size(0,0), locations);
     
    cout << "HOG descriptor size is " << d.getDescriptorSize() << endl;
    for(int i=0; i<d.getDescriptorSize() ; i++)
    {
        cout << "Element N°: " << i << " = "<<descriptorsValues[i] <<endl; 
       // J'ai également essayé descriptorsValues. at(i)
    }
    Ce bout de code affiche la taille de Hog Descriptors mais se plante quand il veut accéder aux éléments du vecteur. Quelqu'un a une idée pourquoi ça bug??

    Merci d'avance ^^

  2. #2
    Membre confirmé Avatar de miss_angel
    Inscrit en
    Février 2008
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 210
    Par défaut
    Merci de déplacer ma question à la section du C/C++, parce que paraît que c'est un problème qui touche la classe vector du C++ plus que la bib OpenCV.
    J'ai bien vérifié mon vector descriptorsValues, il n'est pas vide (j'ai vérifié avec la fonction empty()) mais une fois je veux accèder à ses éléments avec descriptorsValues. back() ou descriptorsValues.front() ou descriptorsValues[i] ou descriptorsValues.at(i) j'arrive pas à y accéder, j'ai une erreur de type, violation d'accès ou encore vector iterator not dereferecable and vector iterator + offset out of range
    Je vois pas où est le problème.
    Merci de déplacer ma question ainsi que votre aide

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    est-ce que par hasard ton vector ne contiendrait pas des pointeurs qui ont été supprimés ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre confirmé Avatar de miss_angel
    Inscrit en
    Février 2008
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 210
    Par défaut
    Bonsoir,

    Non, comme vous voyez, avant d'utiliser mon vecteur, j'affiche sa taille et je vérifie s'il est vide ou pas, et je fais aucun traitement pour supprimer ou manipuler ses pointeurs ou ses valeurs

  5. #5
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    peut être ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cout << "HOG descriptor size is " << descriptorsValues.size() << endl;
    for(int i=0; i<descriptorsValues.size() ; i++)
    {
        cout << "Element N°: " << i << " = "<< descriptorsValues[i] <<endl; 
    }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par miss_angel Voir le message
    et je fais aucun traitement pour supprimer ou manipuler ses pointeurs ou ses valeurs
    On ne sait pas ce que fait d.compute, donc rien n'est assuré.
    Citation Envoyé par miss_angel Voir le message
    Non, comme vous voyez, avant d'utiliser mon vecteur, j'affiche sa taille et je vérifie s'il est vide ou pas,
    Qu'un vector contienne quelque chose ne signifie pas que cette chose existe et est accessible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<int*> vec;
    int* pi = new int;
    *pi = 5;
    vec.push_back(pi);
    std::cout<<vec[0]<<std::endl;
    delete vec[0];
    std::cout<<"length : "<<vec.size()<<" "<<vec[0];
    Il te dira que tu as 1 élément, mais tu auras un crash en y accédant.

    Btw, tu affiches et utilises d.getDescriptorSize et non la taille du vector réellement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre confirmé Avatar de miss_angel
    Inscrit en
    Février 2008
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 210
    Par défaut
    Merci PilloBuenaGente et Bousk pour les réponses
    On ne sait pas ce que fait d.compute, donc rien n'est assuré.
    d.compute les descripteurs d'une image, elle retourne ces descripteurs dans un vecteur : descriptorsValues, ce même vecteur descripteur que j'arrive pas à lire ses éléments. Cette fonction compute est prédéfinie dans la bibliothèque OpenCV, la façon de l'appeler et l'utiliser existe sur pas mal de site et froum, on l'invoque de cette façon et on utilise les descripteurs de son vecteur output de la façon dont je vien de citer. J'ai galéré dans pas mal de site et parait que personne n'a rencontré ce problème

    Btw, tu affiches et utilises d.getDescriptorSize et non la taille du vector réellement.
    Complètement d'accord, t'as une idée pour savoir le nombre d'éléments qui existe réellement? j'ai testé avec la fonction empty() et ça affiche que j'ai des éléments dans mon vecteur

    peut être ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cout << "HOG descriptor size is " << descriptorsValues.size() << endl;
    for(int i=0; i<descriptorsValues.size() ; i++)
    {
        cout << "Element N°: " << i << " = "<< descriptorsValues[i] <<endl; 
    }
    Cher PilloBuenaGente, je vois pas ta proposition, elle est où?

  8. #8
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Si c'est pour connaître la taille du vector<float> descriptorsValues;
    tu peux simplement faire int taille = descriptorsValues.size();
    En prenant cette taille comme condition de boucle, tu ne pourras sortir du tableau.
    (Après openCV, je connais pas)

Discussions similaires

  1. [POI] Problème de lecture des fichiers Word
    Par Dari dans le forum Documents
    Réponses: 9
    Dernier message: 05/07/2007, 14h08
  2. [POI]Problème de lecture des cellules vides
    Par ng.phung dans le forum Documents
    Réponses: 1
    Dernier message: 02/05/2007, 14h45
  3. Réponses: 1
    Dernier message: 21/03/2007, 16h43
  4. Problème de lecture des cellules dans une feuille Excel
    Par wangjun dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/10/2006, 09h35
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

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