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 :

Plantage Programme sur zone trop grande à détecter dans une image


Sujet :

C++

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Plantage Programme sur zone trop grande à détecter dans une image
    Bonjour à tous,

    je code sous qtCreator en C++.

    je dois réaliser une identification de zones dans une image selon une méthode bien présice que j'ai mise en place.

    Pour cela j'ai créé la classe suivante sans donnée membre; uniquement un constructeur, et deux méthodes permettant de réaliser l'opération voulue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // pour la forme, il n'y a rien à l'interieur.
    MonLabeling::MonLabeling()
    {
    }
    //La première méthode ... qui appellera la méthode récursive "RechercherLabel"

    vcImg est une matrice correspondant à une image,
    itailleX, iTailleY son les dimension de l'image et donc de la matrice
    vLab est une matrice correspondant à l'image traitée,
    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
     
    int MonLabeling::Labelisation (int **vImg, int iTailleX, int iTailleY, int **vLab)
    {
        int iNbLabel = 0;
     
            //Parcours des pixels de l'image
        QRgb Pixel;
        for (int i = 0; i < iTailleX; ++i)
        {
            for (int j = 0; j < iTailleY; ++j)
            {
                if (vLab[j][i] == -1)
                {
                    Pixel = qRgb(vImg[j][i], vImg[j][i], vImg[j][i]);
    RechercherLabel(vImg, iTailleX, iTailleY, j, i, Pixel, vLab, iNbLabel);
                    std::cout << "   le courant : " << iNbLabel << std::endl;
                    //std::cout << "   Traiter : " << Traiter[j][i] << std::endl;
     
                    iNbLabel++;
                }
            }
        }
     
        return iNbLabel;
    }
    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
     
    //La fonction récursive...
     
    void MonLabeling::RechercherLabel(int ** &vImg, int iTailleX, int iTailleY, int iL, int iC, QRgb Pixel, int ** &vLab, int iLab)
    {
        if (iL >= 0 && iL < iTailleY && iC >= 0 && iC < iTailleX)
        {
            if (vLab[iL][iC] == -1)
            {
                if (qRed(Pixel) == vImg[iL][iC]) // [Plantage]
                {
                    vLab[iL][iC] = iLab;
                    RechercherLabel(vImg, iTailleX, iTailleY, iL-1, iC-1, Pixel, vLab, iLab);
                    RechercherLabel(vImg, iTailleX, iTailleY, iL-1, iC  , Pixel, vLab, iLab);
                    RechercherLabel(vImg, iTailleX, iTailleY, iL  , iC-1, Pixel, vLab, iLab);
                    RechercherLabel(vImg, iTailleX, iTailleY, iL+1, iC+1, Pixel, vLab, iLab);
                    RechercherLabel(vImg, iTailleX, iTailleY, iL+1, iC  , Pixel, vLab, iLab);
                    RechercherLabel(vImg, iTailleX, iTailleY, iL  , iC+1, Pixel, vLab, iLab);
                    RechercherLabel(vImg, iTailleX, iTailleY, iL-1, iC+1, Pixel, vLab, iLab);
                    RechercherLabel(vImg, iTailleX, iTailleY, iL+1, iC-1, Pixel, vLab, iLab);
                }
            }
        }
    }
    Revenons au problème de facon précise:

    Mon programme fonctionne, et c'est deja pas mal.
    Mais il fonctionne sur des images dont les zones à détecter ne sont pas trop grande.
    En effet, lorsque je lance mon application, le déboggeur, stoppe sur la ligne suivante [Plantage] de la fonction récursive.

    Mes pistes sont un manque de mémoire, mais la totalité de la RAM est loin d'etre utilisée.

    J'ai essayé toute sorte de passage de parametre pour la fonction recursive, int **vImg, et la derniere int ** &vImg.

    Est ce que quelqu'un aurait une solution à mon probleme ?

    je vous remercie

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    La récursivité n'est pas un bon moyen pour faire une croissance de régions. Tu empiles trop d'appels et ça plante ton application.

    L'idéal est de passer en itératif. Rapidement ça donne un truc comme ça :

    -- parcours des x
    ----parcours des y
    ------si pixel x; y pas labellisé et labellisable
    --------on le tag comme labellisé
    --------on tag comme labellisé ses voisins labellisables et on les mets dans une liste L
    --------Tant que L est pas vide
    -----------on récupère le 1er pixel de L et on le supprime de L
    -----------on tag comme labellisé ses voisins labellisables et non labellisés
    -----------on met ces voisins dans une liste L

    Après il y a plusieurs stratégies pour optimiser la gestion de L. Mais pour commencer, tu peux procéder par ajout / suppression. Ensuite tu pourras optimiser cette partie-là.

    Flo.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bonjour Flo,

    je te remercie pour ta réponse,
    je vois ce que ca donne et je te tiens au courant...

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Effectivement, avec la liste, je n'ai plus de souci.

    Merci pour ton aide.

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

Discussions similaires

  1. [WD10] Drag and drop programmé sur zone répétée
    Par mogwai162 dans le forum WinDev
    Réponses: 3
    Dernier message: 10/05/2011, 16h14
  2. [D6] Algo de détection de zones dans une image
    Par DMO dans le forum Langage
    Réponses: 4
    Dernier message: 25/11/2005, 15h15
  3. Réponses: 7
    Dernier message: 07/07/2005, 17h20
  4. Zone de texte dans une image
    Par sanna dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 18/03/2005, 22h15
  5. [FLASH 5]un bouton dans une image pour revenir sur une scene
    Par patato valdes dans le forum Flash
    Réponses: 7
    Dernier message: 28/04/2004, 20h21

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