Bonjour à tous,
je code sous qtCreator en C++.
je dois réaliser une identification de zones dans une image selon une méthode bien présice que j'ai mise en place.
Pour cela j'ai créé la classe suivante sans donnée membre; uniquement un constructeur, et deux méthodes permettant de réaliser l'opération voulue.
//La première méthode ... qui appellera la méthode récursive "RechercherLabel"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // pour la forme, il n'y a rien à l'interieur. MonLabeling::MonLabeling() { }
vcImg est une matrice correspondant à une image,
itailleX, iTailleY son les dimension de l'image et donc de la matrice
vLab est une matrice correspondant à l'image traitée,
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 int MonLabeling::Labelisation (int **vImg, int iTailleX, int iTailleY, int **vLab) { int iNbLabel = 0; //Parcours des pixels de l'image QRgb Pixel; for (int i = 0; i < iTailleX; ++i) { for (int j = 0; j < iTailleY; ++j) { if (vLab[j][i] == -1) { Pixel = qRgb(vImg[j][i], vImg[j][i], vImg[j][i]); RechercherLabel(vImg, iTailleX, iTailleY, j, i, Pixel, vLab, iNbLabel); std::cout << " le courant : " << iNbLabel << std::endl; //std::cout << " Traiter : " << Traiter[j][i] << std::endl; iNbLabel++; } } } return iNbLabel; }Revenons au problème de facon précise:
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 //La fonction récursive... void MonLabeling::RechercherLabel(int ** &vImg, int iTailleX, int iTailleY, int iL, int iC, QRgb Pixel, int ** &vLab, int iLab) { if (iL >= 0 && iL < iTailleY && iC >= 0 && iC < iTailleX) { if (vLab[iL][iC] == -1) { if (qRed(Pixel) == vImg[iL][iC]) // [Plantage] { vLab[iL][iC] = iLab; RechercherLabel(vImg, iTailleX, iTailleY, iL-1, iC-1, Pixel, vLab, iLab); RechercherLabel(vImg, iTailleX, iTailleY, iL-1, iC , Pixel, vLab, iLab); RechercherLabel(vImg, iTailleX, iTailleY, iL , iC-1, Pixel, vLab, iLab); RechercherLabel(vImg, iTailleX, iTailleY, iL+1, iC+1, Pixel, vLab, iLab); RechercherLabel(vImg, iTailleX, iTailleY, iL+1, iC , Pixel, vLab, iLab); RechercherLabel(vImg, iTailleX, iTailleY, iL , iC+1, Pixel, vLab, iLab); RechercherLabel(vImg, iTailleX, iTailleY, iL-1, iC+1, Pixel, vLab, iLab); RechercherLabel(vImg, iTailleX, iTailleY, iL+1, iC-1, Pixel, vLab, iLab); } } } }
Mon programme fonctionne, et c'est deja pas mal.
Mais il fonctionne sur des images dont les zones à détecter ne sont pas trop grande.
En effet, lorsque je lance mon application, le déboggeur, stoppe sur la ligne suivante [Plantage] de la fonction récursive.
Mes pistes sont un manque de mémoire, mais la totalité de la RAM est loin d'etre utilisée.
J'ai essayé toute sorte de passage de parametre pour la fonction recursive, int **vImg, et la derniere int ** &vImg.
Est ce que quelqu'un aurait une solution à mon probleme ?
je vous remercie
Partager