Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : juillet 2007
    Messages : 29
    Points : 11
    Points
    11

    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 :
    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
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : juillet 2007
    Messages : 29
    Points : 11
    Points
    11

    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 :
    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
    Invité régulier
    Inscrit en
    juin 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 23
    Points : 6
    Points
    6

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •