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;
}