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

OpenCV Discussion :

Probleme avec cvGet2D


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Par défaut Probleme avec cvGet2D
    bonjour,


    j'ai un problème de fuite mémoire pour cvGet2D.
    je suis aller un peut partout sur le net mais je n'ai pas trouver la solution mis a part qu'il y avait bien des problème de fuite mémoire sur la fonction CvGet2D.
    je cherche donc à la contourner.

    voila ma fonction fonction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for(i = 0; i < abs(Xx2-Xx1+1); i++)
    {
    for(j = 0; j < abs(Yy2-Yy1+1); j++)
    {
    int r = cvGet2D(img2, j, i).val[2];
    int g = cvGet2D(img2, j, i).val[1];
    int b = cvGet2D(img2, j, i).val[0];
    CvScalar pixel = cvScalar(b, g, r);
    cvSet2D(img4, j, i, pixel);
    }
    }
    j'ai tenté de passer avec un seul cvGet2D comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for(i = 0; i < abs(Xx2-Xx1+1); i++)
    {
    for(j = 0; j < abs(Yy2-Yy1+1); j++)
    {
    CvScalar c= cvGet2D(img2, j, i);
    int r = c.val[2];
    int g = c.val[1];
    int b = c.val[0];
    CvScalar pixel = cvScalar(b, g, r);
    cvSet2D(img4, j, i, pixel);
    }
    }
    effectivement j'ai moins de perte mémoire donc mon programme tourne plus longtemps mais il plante quand même au bout de 30 secondes!!!!!


    comment puis-je faire pour ne pas utiliser cvGet2D?
    ou pour éviter la fuite mémoire?

    merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    Bonjour,

    Je ne pense pas que le problème de fuite mémoire vienne de CvGet2D dont le code est mis ci-dessous.
    Cela te donne au passage la méthode pour accéder à ton élément (i,j) de ton image

    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
    // Returns specifed element of 2D array
    CV_IMPL  CvScalar
    cvGet2D( const CvArr* arr, int y, int x )
    {
        CvScalar scalar = {{0,0,0,0}};
        int type = 0;
        uchar* ptr;
     
        if( CV_IS_MAT( arr ))
        {
            CvMat* mat = (CvMat*)arr;
     
            if( (unsigned)y >= (unsigned)(mat->rows) ||
                (unsigned)x >= (unsigned)(mat->cols) )
                CV_Error( CV_StsOutOfRange, "index is out of range" );
     
            type = CV_MAT_TYPE(mat->type);
            ptr = mat->data.ptr + (size_t)y*mat->step + x*CV_ELEM_SIZE(type);
        }
        else if( !CV_IS_SPARSE_MAT( arr ))
            ptr = cvPtr2D( arr, y, x, &type );
        else
        {
            int idx[] = { y, x };
            ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, &type, 0, 0 );
        }
     
        if( ptr )
            cvRawDataToScalar( ptr, type, &scalar );
     
        return scalar;
    }

  3. #3
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    Bonjour

    Peux tu nous indiquer comment tu utilise ta fonction (ou tu l'appelle et comment) en nous postant ton code

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Par défaut
    bonjour,

    Merci pour ta réponse Picard2200 grâce au bout de code que tu a mis j'ai pus me faire une fonction cvGet2D mais à ma sauce pour que ça marche.
    en tout cas il y a bien une fuite mémoire sur la fonction cvGet2D je l'ai bien constatée.

    En gros je l’utilisais de la façon suivante:

    je définie deux images de la même taille img1 et img2;
    je charge une image dans img1;
    je met touts les pixels de img2 en noir avec cvSet;
    je définie une ROI sur img1 "grâce a une détection de la souris" de dimension (Xx1,Yy1)coin en haut à gauche (Xx2,Yy2)coin en bas à droite;
    chaque pixel de cette ROI je les replace dans le centre de mon image noir img2 et s'est la que j'ai besoin de cvGet2D;
    et tout ça je le faisais dans un while(1) car chaque image correspond a une frame d'une vidéo;

    au final cvGet2D était appelée un très grand nombre de fois (une fois par pixel à déplacer).

    en remplaçant cvGet2D par une fonction du même style que se que m'a donner Picard2200 ça marche!

    au final je fait ça car j'avais besoin de créer un logiciel pour faire de la découpe de vidéo frame par frame en choisissant les régions que je veux découper.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Par défaut
    Citation Envoyé par altyok Voir le message
    bonjour,

    Merci pour ta réponse Picard2200 grâce au bout de code que tu a mis j'ai pus me faire une fonction cvGet2D mais à ma sauce pour que ça marche.
    en tout cas il y a bien une fuite mémoire sur la fonction cvGet2D je l'ai bien constatée.

    En gros je l’utilisais de la façon suivante:

    je définie deux images de la même taille img1 et img2;
    je charge une image dans img1;
    je met touts les pixels de img2 en noir avec cvSet;
    je définie une ROI sur img1 "grâce a une détection de la souris" de dimension (Xx1,Yy1)coin en haut à gauche (Xx2,Yy2)coin en bas à droite;
    chaque pixel de cette ROI je les replace dans le centre de mon image noir img2 et s'est la que j'ai besoin de cvGet2D;
    et tout ça je le faisais dans un while(1) car chaque image correspond a une frame d'une vidéo;

    au final cvGet2D était appelée un très grand nombre de fois (une fois par pixel à déplacer).

    en remplaçant cvGet2D par une fonction du même style que se que m'a donner Picard2200 ça marche!

    au final je fait ça car j'avais besoin de créer un logiciel pour faire de la découpe de vidéo frame par frame en choisissant les régions que je veux découper.
    Je vais investiguer pour voir d'où vient la fuite mémoire par relecture de code.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Par défaut
    Après une petite recherche sur les raison de cette fuite j'ai vue que se problème n'arrive que sur codeblocks???
    Je ne sais pas pourquoi? peut-être une mauvaise compilation?
    J'ai utilisé cvGet2D sous visual C++ et ça marche...
    Mais bon tout mes programme sont sous codeblocks car sous linux donc je vais faire avec.

    Encore merci Picard2200 et si tu trouve la solution à cette petite fuite je veux bien que tu m'explique.

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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