Bonjour,
Voil� je travaille actuellement sur un algo de traitement de l'image. Le but �tant de reconnaitre les formes sur une image binaris�e (noir et blanc). Mon algo se base sur un th�orie que j'ai pens�e � force de m'�nerver sur les algos classiques qui ne marchent pas ^^
Je parcours mon image en long et en large, et lorsque je trouve un pixel interessant ( en noir) je lance ma boucle r�ccursive qui va chercher tous les voisins � partir de ce pixel noir, et les voisins des voisins... etc...
Apres avoir �t� confront� � une tonne de stack overflow... j'ai compris que d'augmenter la taille de la pile pourrait suffir � d�bugguer mon programme. En effet, le code fonctionne tres bien, cependant, j'ai besoin des parametres de pile suivants :
taille de la r�serve de pile : 4000000
taille de validation de pile : 10000
(soit : /STACK:4000000,10000 )
Est ce normal d'en arriver l� pour faire tourner un algo r�ccursif qui ne me parrait pas si "bourrin" que �a ?
PS : je tourne sous Visual C++ express
Voil� le code utilis� :
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 ImagePGM pgm_bin("test.pgm"); Binaire bin2(200); //seuil de binarisation S2D<unsigned char> s_bin = bin2(pgm_bin.GetData()); pgm_bin.Save("test_binarise.pgm"); S2D<int> C(pgm_bin.Width(),pgm_bin.Height()); C.set(0); int classe = 1; for(int i=1 ; i<pgm_bin.Width(); i++) for(int j=1 ; j<pgm_bin.Height(); j++) { //Si il dépasse le seuil on le récupere (et si il n'est pas déjà classé) if((s_bin[j][i] > 200) && (C[j][i] == 0)) { select_classe(&s_bin, &C, i, j, classe, 200); classe++; cout << "classe " << classe << endl; //system("pause"); } }
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 /** Fonction récursive de selection d'une classe par propagation **/ void select_classe( S2D<unsigned char>* s_bin, S2D<int>* C, int w, int h, int classe, int seuil) { /* 1 | 2 | 3 4 | X | 5 6 | 7 | 8 */ //cout << "Appel en ["<<w<<"]["<<h<<"]"<<endl; //cas d'arret if(((*s_bin)[h][w] > seuil) && ((*C)[h][w] == 0)) { //on marque le courant. (*C)[h][w] = classe; //cout<<"On marque C["<<h<<"]["<<w<<"] avec la classe "<<classe<<endl; //system("pause"); /* //les voisins sont > seuil ou encore non classés if(((*s_bin)[h-1][w-1] > seuil) && ((*C)[h-1][w-1] == 0)) //1 select_classe(s_bin, C, w-1, h-1, classe, seuil); */ if(((*s_bin)[h][w-1] > seuil) && ((*C)[h][w-1] == 0)) //2 select_classe(s_bin, C, w-1, h, classe, seuil); /* if(((*s_bin)[h+1][w-1] > seuil) && ((*C)[h+1][w-1] == 0)) //3 select_classe(s_bin, C, w-1, h+1, classe, seuil); */ if(((*s_bin)[h-1][w] > seuil) && ((*C)[h-1][w] == 0)) //4 select_classe(s_bin, C, w, h-1, classe, seuil); if(((*s_bin)[h+1][w] > seuil) && ((*C)[h+1][w] == 0)) //5 select_classe(s_bin, C, w, h+1, classe, seuil); /* if(((*s_bin)[h-1][w+1] > seuil) && ((*C)[h-1][w+1] == 0)) //6 select_classe(s_bin, C, w+1, h-1, classe, seuil); */ if(((*s_bin)[h][w+1] > seuil) && ((*C)[h][w+1] == 0)) //7 select_classe(s_bin, C, w+1, h, classe, seuil); /* if(((*s_bin)[h+1][w+1] > seuil) && ((*C)[h+1][w+1] == 0)) //8 select_classe(s_bin, C, w+1, h+1, classe, seuil); */ } return; }
Merci de vos conseils.
Partager