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 :

cvPyrSegmentation : afficher le résultat


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 17
    Points
    17
    Par défaut cvPyrSegmentation : afficher le résultat
    Bonjour tout le monde,

    J'ai récemment (hier) mis en place la fonction pyramide qui est implémenté sous opencv, j'arrive à faire fonctionner la fonction mais le problème intervient quand je dois isoler un (ou deux) éléments et afficher le résultat a part dans une image et bien sur pour faire des calculs dessus. Je dirai aussi que je ne comprends pas bien comment fonctionne CvSeq, même comment en lire une. La doc est un peu confuse ou c'est moi qui le suis un peu

    j'ai essayé avec cvdrawcontours sans succès, compilation puis plantage, je ne sais pas exactement pourquoi mais je pense que les pixels a tracer doivent être blanc ou noir dans la CvSeq d'origine (serait logique si on regarde de plus près cvfindcontours qui est svt utilisé avant dans certains codes), ce qui n'est pas le cas de mon image.

    L'autre idée c'est de prendre direct le pointeur (char*) retourné par cvGetSeqElem et le lire dans une image mais la encore je sèche comment faire. Si quelqu'un a déjà été confronté a ce problème et a une solution et je suis sur qu'elle existe, n'hésitez pas a m'en faire part.

    Par avance merci
    Damien
    Voici le code

    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
     
    #include "cv.h"
    #include "highgui.h"
    #include <math.h>
    #include <stdio.h>
     
    int main( void)
    {
     IplImage*  imagestart =0, *imagecopy = 0, *imagepyr = 0;
     CvSeq *comp;
     CvMemStorage *storage;
     
     int  threshold1=80;
     int  threshold2=10;
     int  level =4;
     int  block_size = 1000;
     
     // Chargement image 3 canaux
     IplImage *imgcontourfinal =cvLoadImage( "c:\\imagetest1\\imageref1.bmp", 1);
     cvZero(imgcontourfinal);
     
     // Chargement image 1 canaux
       imagestart=cvLoadImage( "c:\\imagetest1\\imageenhanced.bmp", 0);
     
      cvNamedWindow("Source", 0);
      cvNamedWindow("contours", 0);
      cvNamedWindow("Pyramide Segmentation", 0);
     
    	cvShowImage("Source", imagestart);
     
      storage = cvCreateMemStorage ( block_size );
      imagecopy = cvCloneImage(imagestart);
      imagepyr = cvCloneImage(imagestart);
     
      cvPyrSegmentation(imagecopy, imagepyr, storage, &comp,level, threshold1, threshold2);
     
      cvShowImage("Pyramide Segmentation", imagepyr);
     
      ////////////////////////////////////
      // prob ici //
      CvSeq * zone=0;
      zone = (CvSeq *)cvGetSeqElem(comp,1);
         if(zone) printf("zone reconnue");
      cvDrawContours( imgcontourfinal, zone, CV_RGB(255,0,0), CV_RGB(0,255,0), 0, 3, CV_AA, cvPoint(0,0) );
     
      cvShowImage( "contours", imgcontourfinal);
      ///////////////////////////////
     
      //Petit test de manip des sequences
      printf("\n\n");
      printf("nbre d'elts %d ",comp->total);
      cvSeqRemove(comp, 12);
      printf("\n\n");
      printf("nbre d'elts apres %d ",comp->total);
     
      cvWaitKey(0);
     
      cvDestroyWindow("Segmentation");
      cvDestroyWindow("Source");
     
      cvReleaseMemStorage(&storage );
      cvReleaseImage(&imagestart);
      cvReleaseImage(&imagecopy);
      cvReleaseImage(&imagepyr);
     
      return 0;
    }

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 17
    Points
    17
    Par défaut La reponse
    Bon ben j'ai réussi hier à faire ce que je voulais. bien que je ne garderai surement pas cette technique, je poste le code "premier jet" qui pourra peut être en servir d'autre.

    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
     
     
     #include "cv.h"  
     #include "highgui.h"
     #include <stdio.h>
     
     
     
     IplImage  *imagesrc=0, *imagesegm = 0; 
     int  thresholdmax, thresholdmin; 
     int treshmax, treshmin;  
     
    void ON_SEGMENT(int a) 
    {     
       int  level = 4; 
       CvSeq *comp; 
     
       CvMemStorage *storage; 
       int block_size = 1000; 
       storage = cvCreateMemStorage ( block_size ); 
     
       cvPyrSegmentation(imagesrc, imagesegm, storage,&comp,level, thresholdmax, thresholdmin); 
     
       int seqnb = comp->total; 
       printf( "nb de sequence %d\n ",seqnb);
     
    CvScalar myval;
    CvConnectedComp *cur_comp;
     
    double *mypixelval= new double [seqnb];
    double minval=255.0;
    double maxval=0.0;
     
    for (int i=0;i<seqnb;i++)
        {   
    	  cur_comp = (CvConnectedComp*)cvGetSeqElem (comp,i);     	
    	   myval=cur_comp->value;
           mypixelval[i]=myval.val[0];
    	   if ( mypixelval[i] < minval) minval= mypixelval[i];
    	   if ( mypixelval[i] > maxval) maxval= mypixelval[i];
       }
     
     for (int i=0;i<seqnb;i++)
          printf( "%d  ",(int)mypixelval[i]);
     
     printf("\n"); printf( "min pixels val: %d  ",(int)minval);
     printf("\n"); printf( "max pixels val: %d  ",(int)maxval);	
     printf("\n\n\n");
     
     
    IplImage* mask = cvCreateImage(cvGetSize(imagesrc),imagesrc->depth,imagesrc->nChannels);
    cvZero(mask);
     
    cvCmpS(imagesegm, minval, mask, CV_CMP_EQ);
     
    cvNamedWindow("components", 0);  
    cvShowImage("components", mask); 
    cvShowImage("Pyramid Segmentation", imagesegm); 
     
     }  
     
     int main( int argc, char** argv ) 
     { 
        imagesrc = cvLoadImage( "c:\\imagetest1\\imageenhanced.bmp", 0);
     
        cvNamedWindow("Source", 0);  
        cvShowImage("Source", imagesrc);  
        cvNamedWindow("Pyramid Segmentation", 0);  
     
        imagesegm = cvCloneImage (imagesrc); 
     
        thresholdmax =150;  
        thresholdmin =80;  
     
       ON_SEGMENT(1);
       treshmax = cvCreateTrackbar("treshmax", "Pyramid Segmentation", &thresholdmax, 255,ON_SEGMENT); 
       treshmin = cvCreateTrackbar("treshmin", "Pyramid Segmentation", &thresholdmin, 255,ON_SEGMENT); 
     
       cvShowImage("Segmentation", imagesegm); 
       cvWaitKey(0);  
     
      return 0;  
    }
    cdt,
    D

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    bonjour,
    j'ai exécuté votre code mais j'ai l’erreur suivante :

    Assertion failed (src1.size == dst.size && dst.type() == CV_8U) in cvCmpS

    pourriez-vous m'aider?
    Merci

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

Discussions similaires

  1. Calculer et afficher le résultat d'un questionnaire
    Par lipao17 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 22/02/2020, 20h03
  2. Afficher le résultat d'un COUNT même null
    Par trangsene dans le forum Langage SQL
    Réponses: 10
    Dernier message: 18/11/2005, 18h07
  3. Réponses: 3
    Dernier message: 18/11/2005, 16h58
  4. [QReport] Afficher le résultat d'une requete
    Par PFX dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/05/2005, 14h38
  5. Réponses: 37
    Dernier message: 25/04/2005, 21h47

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