Bonjour à tous,

Après différentes lectures d'articles, messages de forum, etc. je me permets d'écrire ce message pour avoir un peu d'aide (je travaille dessus depuis trois jours sans savoir où vient le problème... !).

Je fais du traitement d'image, et je travaille sur une fonction d'étiquetage. J'ai en entré une image 8bits, nommée TS, et une image 16 en sortie, nommé TD.
Je fais un premier parcours de mon image 8 bits, TS donc, et je remplis un tableau de int* que je créé grâce à un malloc, pour gérer la fusion ou non d'objet (que je peux interpréter comme différents alors que non).

Voici mon 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
        int TfusionSize = min ( USHRT_MAX, 8 +(width*height)/8);
	int* Tfusion = (int*)malloc(TfusionSize * sizeof(int));
	if(Tfusion == NULL) return GIPS_ERR_ALLOC;
	memset(Tfusion,0,sizeof(int) * TfusionSize );
 
	Tfusion[0]=0;
	Tfusion[1]=1;
 
	int NextLabel = 1;
 
	TD[0][0] = NextLabel;
	Tfusion[NextLabel] = NextLabel;
	if (NextLabel < TfusionSize)NextLabel++;
 
		for(x=1; x<width; x++) {
			if (TS[0][x] == TS[0][x-1]) {
				TD[0][x] = TD[0][x-1];
			} else {
				TD[0][x] = NextLabel;
				Tfusion[NextLabel] = NextLabel;
				if (NextLabel < (TfusionSize - 2)) NextLabel++;
			}
		}
		for(y=1; y<height; y++)
		{
			if (TS[y][0] == TS[y-1][0]) {
				TD[y][0] = TD[y-1][0];
			} else {
				TD[y][0] = NextLabel;
				Tfusion[NextLabel] = NextLabel;
				if (NextLabel < (TfusionSize - 2)) NextLabel++;
			}
 
			for(x=1; x<width; x++)
			{
 
				int p1 = TD[y][x-1];
				int p2 = TD[y-1][x];
 
				if (TS[y][x] == TS[y][x-1] ) {
					if ((p1 != p2)&&(TS[y][x-1]==TS[y-1][x])) {
						while (Tfusion[p1]!=p1){
							p1 = Tfusion[p1];
						}
						while (Tfusion[p2]!=p2){
							p2 = Tfusion[p2];
						}
						if (p2>p1){
							TD[y][x] = Tfusion[p2] = p1;
						} else {
							TD[y][x] = Tfusion[p1] = p2;
						}
					} else { 
						TD[y][x] = TD[y][x-1];
					}
				} else if (TS[y][x] == TS[y-1][x] ) {
					if ((p1 != p2)&&(TS[y][x-1]==TS[y-1][x])) {
						while (Tfusion[p1]!=p1){
							p1 = Tfusion[p1];
						}
						while (Tfusion[p2]!=p2){
							p2 = Tfusion[p2];
						}
						if (p2>p1){
							TD[y][x] = Tfusion[p2] = p1;
						} else {
							TD[y][x] = Tfusion[p1] = p2;
						}
					} 
					else { 
						TD[y][x] = TD[y-1][x];
					}
				} 
				else {
					TD[y][x] = NextLabel;
					Tfusion[NextLabel] = NextLabel;
					if (NextLabel < TfusionSize-2 ) NextLabel++;
					else{
						NextLabel = TfusionSize ;
					}
				}
			}	
		}
	if (NextLabel>=TfusionSize) {
		free(Tfusion);
		return GIPS_ERR_OUT_OF_BOUND;
	}
j'ai un problème lors du free(Tfusion). Visual m'annonce une corruption de tas ("Head Corruption detected" est le message).

J'ai essayé de créer mon tableau avec new, et donc de le supprimer avec delete... Ne fonctionne pas non plus. Je pense que je dois effacer une zone mémoire en dehors de mon pointeur Tfusion, mais je ne suis pas sûr de moi, et surtout je ne sais pas comment régler le problème...

Quelqu'un aurait-il une idée pour m'aider ?

Merci d'avoir pris le temps de lire ce message.

Bien à vous,

Foxaltex