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 :

Erreur de segmentation non trouvée


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Points : 19
    Points
    19
    Par défaut Erreur de segmentation non trouvée
    Bonjour

    Je suis entrain de créer une fonction servant à lisser une image, en supprimant le bruit.

    Cependant, je bloque sur une erreur SIGSEGV qui se trouve dans cette méthode.
    Avez vous une idée d'où peut provenir l'erreur ?

    info: - Je commence mes attributs par "m_"
    - J'utilise code::blocks

    edit 20h04: (
    remarque: Après plusieurs test avec des images .png , cette fonction marche pour certaines et fait SIGSEGV pour d'autres. )

    Voici la fonction:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    /*------------------------------------*/
    //supprimer le bruit <=> lissage
    /*------------------------------------*/
    void ImageMod::smoothing(int proximity)
    {
        //si jamais l'image n'est pas en niveau de gris.
        if(m_image->nChannels!=1)
            return;
        //On vérifie que le voisinage est impair sinon on le corrige
        if(proximity%2==0)
            proximity++;
     
        CvScalar pixel;
        //déclaration de l'image intermédiaire: image de stockage.
        int flip = origin(m_image);
        IplImage* imgSmooth = cvCloneImage(m_image);
     
        CvRect roi=cvRect(0, 0,proximity,proximity);
        //tableau pour récupérer les valeurs des pixels dans la zone ROI
        vector<int> neighbour(proximity*proximity);
     
        for(int y=0; y < m_image->height; y++)
        {
            for(int x=0; x < m_image->width; x++)
            {
                //Pour chaque pixel, s'il est trop "au bord" :
                if (x<(proximity-1)/2 || x>(m_image->width - 1 - (proximity-1)/2) ||
                    y<(proximity-1)/2 || y>(m_image->height -  1 - (proximity-1)/2))
                {
                    //Dans ce cas on recopie simplement le pixel
                    cvSet2D(imgSmooth, y, x, cvGet2D(m_image, y, x));
                }
                //sinon on applique la médiane au pixel par rapport à son entourage (voisinage*voisinage)
                else
                {
                    //On centre le voisinage sur le pixel en cours
                    roi.x= x - (proximity-1)/2;
                    roi.y= y - (proximity-1)/2;
     
                    //On initialise la région d'intérêt
                    cvSetImageROI(m_image, roi);
                    //Cette fois on parcourt juste la zone Roi (le voisinage) pour récupérer les valeurs dans un tableau
                    for(int j=0; j < proximity; j++)
                    {
                        for(int i=0; i<proximity; i++)
                        {
                            //application de la médiane sur le pixel
                            pixel = cvGet2D(m_image, j, i);
                            neighbour[i*proximity + j] = pixel.val[0];
                        }
                    }
     
                    //On relâche la région d'intérêt
                    cvResetImageROI(m_image);
                    //On classe les valeurs dans l'ordre croissant  sort(v_min, v_max)
                    sort( neighbour.begin(), neighbour.end());
                    //On choisit la valeur médiane
                    pixel.val[0] = neighbour[(proximity*proximity-1)/2];
                    //On la remplace dans l'image de destination
                    cvSet2D(imgSmooth, y, x, pixel);
                }
            }
        }
     
        setImage(imgSmooth);
     
    }
     
    void ImageMod::setImage(IplImage*& imageToGet)
    {
        cvReleaseImage(&m_image);
        m_image=cvCloneImage(imageToGet);
        cvReleaseImage(&imageToGet);
    }
     
    //vérifier l'origine de l'image
    int ImageMod::origin(IplImage*& img)
    {
     
        //Si l'origine n'est pas en haut à gauche, il faut la corriger
        int flip=0;
        if(img->origin!=IPL_ORIGIN_TL)
        {
            flip=CV_CVTIMG_FLIP;
        }
        return flip;
    }

    Informations données par le débugger : segmentation fault in function ntdll!RtlEqualLuid() (C:\Windows\system32\ntdll.dll)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1) Pourquoi ne pas utiliser cvSmooth ?

    2) Je pense qu'il faut mettre >= dans cette condition au lieu de > :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                //Pour chaque pixel, s'il est trop "au bord" :
                if (x<(proximity-1)/2 || x>=(m_image->width - 1 - (proximity-1)/2) ||
                    y<(proximity-1)/2 || y>=(m_image->height -  1 - (proximity-1)/2))
    c'est classique pour les bords... pour une ligne donnée le dernier pixel étant à la position w-1, on est sur le bord quand on est "> w-2" ou bien ">= w-1".

    A+

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Merci de la réponse

    1) Si je n'ai pas utilisé cvSmooth c'est juste pour m'entraîner à faire des algos de manipulation d'images.

    2)J'ai appliqué la modification dont tu m'a parlé, mais j'obtiens toujours la "segmentation fault".

  4. #4
    Invité
    Invité(e)
    Par défaut
    Est-ce que sur les images où tu n'as pas de segmentation fault, tu as le resultat attendu ? Je ne sais pas si cvGet2D et cvSet2D tiennent compte de la région d'intérêt.

    Est-ce que tu as le crash lorsque tu buildes en mode debug ? Si oui quelle est la pile des appels et la ligne sur laquelle le crash survient dans la classe ImageMod ?

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    - Oui sur l'image qui n'a pas de segmentation le résultat est le bon.

    - Oui le programme crash en mode debug.

    Résulat avec debug/continue:
    Call stack:

    Nr: 0 ; Address: 76ECB533 ; Function: ntdll!EtwpNotificationThread() ;
    File: C:\Windows\system32\ntdll.dll


    Sinon pour la ligne exacte j'ai fais plusieurs tests, dont mettre un break point au niveau du cvSet2D() , résultat pas d'erreur sur la 1ere boucle for nécessitant d'utiliser la médiane.
    Cependant, j'ai pas eu le courage de refaire cette action autant de fois qu'il y a de pixels pour obtenir l'erreur.

  6. #6
    Invité
    Invité(e)
    Par défaut
    N'as-tu pas accès à la pile complète des appels ? "ntdll!EtwpNotificationThread() ;" n'est que le haut de cette pile, il faudrait voir dans quelle est la ligne précise dans ton code qui appelle la fonction qui appelle la fonction qui appelle... etc... jusqu'à cet appel système.

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Désolé pour le temps de réponse,

    En fait je n'arrive plus à comprendre ce qu'il se passe, je n'ai pas touché à cette fonction dans le prog mais cette fois quand je compile il n'y a plus de seg fault mais par contre la fonction ne fais rien. Même sur l'image avec laquelle cela marchait précédemment.

    Je vais donc voir pour reprendre une version antérieur du prog pour pouvoir poursuivre ce problème.

    Je vous tiens au courant si j'arrive à obtenir la pile complète.

    Merci en tout cas

Discussions similaires

  1. Message d'erreur "explorasi.exe" non trouvé
    Par hocine dans le forum Windows XP
    Réponses: 1
    Dernier message: 25/10/2007, 18h57
  2. Erreur : Classe TStoredProc non trouvée
    Par Sunchaser dans le forum C++Builder
    Réponses: 1
    Dernier message: 24/11/2006, 00h03
  3. bdd : erreur 3265 élément non trouvé dans cette collection
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/07/2006, 09h52
  4. Erreur de "Élément non trouvé dans cette collection"
    Par charleshbo dans le forum Access
    Réponses: 4
    Dernier message: 04/05/2006, 18h42
  5. [Debutant][Install][VS]erreur sur fichier non trouvé.
    Par silvermoon dans le forum DirectX
    Réponses: 4
    Dernier message: 16/07/2004, 20h59

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