Gå til innhold

Stack overflow ved rekursive kall


Anbefalte innlegg

Hei

 

Jeg har thresholdet et bilde, og skal klassifisere sammenhengende piksler inn i regioner med felles identifikator. Kanskje jeg er litt trøtt, men jeg klarer ikke å se for meg noen andre måter å gjøre det på, på denne måten får jeg stack overflow ved bilder over ca. 200x200, jeg skal analysere ett på ca. 900x500.

 

Noen tips til andre angrepsmåter for å unngå så mange rekursive kall ?

 

/* Searches from top-left in a B/W image for the first pixel not yet assigned to a region, and then completes that region. */
void findRegion(imageRGB *outImg) {
int width,height,w,h,color;
width = (*outImg).width;
height = (*outImg).height;

//Padding
for (w=0;w<width;w++) {
 for (color=0;color<3;color++) {
  (*outImg).data[3*(w)+color]=0;
  (*outImg).data[3*(w+((height-1)*width))+color]=0;
 }
}
//Padding
for (h=0;h<height;h++) {
 for (color=0;color<3;color++) {
  (*outImg).data[3*(h*width)+color]=0;
  (*outImg).data[3*(width-1 + h*width)+color]=0;
 }
}

for (w=1;w<width;w++) {
 for (h=1;h<height;h++) {
  //255 -> pixel not yet assigned a region.
  if ((*outImg).data[3*(w+h*width)+1]==255) {
   fourConnect(outImg,w,h,regionCount);
   regionCount=regionCount+1;
  }
 }
}
}

/* Using G-component of RGB pixel as region number. 255 means it has not yet
  been assigned a number. Uses 4-connectedness */
void fourConnect(imageRGB *img,int posX, int posY,int region) {
(*img).data[3*(posX+posY*(*img).width)+1]= region % 255;

if (posX > 0 && posY >0 && posX <(*img).width-1 && posY<(*img).height-1) {
 if ((*img).data[3*(posX-1+posY*(*img).width)+1] == 255) {
  fourConnect(img,posX-1,posY,region);
 }
 if ((*img).data[3*(posX+1+posY*(*img).width)+1] == 255) {
  fourConnect(img,posX+1,posY,region);
 }
 if ((*img).data[3*(posX+(posY-1)*(*img).width)+1] == 255) {
  fourConnect(img,posX,posY-1,region);
 }
 if ((*img).data[3*(posX+(posY+1)*(*img).width)+1] == 255) {
  fourConnect(img,posX,posY+1,region);
 }
}
}

Lenke til kommentar
Videoannonse
Annonse
Hei

 

Jeg har thresholdet et bilde, og skal klassifisere sammenhengende piksler inn i regioner med felles identifikator. Kanskje jeg er litt trøtt, men jeg klarer ikke å se for meg noen andre måter å gjøre det på, på denne måten får jeg stack overflow ved bilder over ca. 200x200, jeg skal analysere ett på ca. 900x500.

 

Noen tips til andre angrepsmåter for å unngå så mange rekursive kall ?

 

Tror kanskje din void fourConnect(...) løper amok. Den har jo ingen måte å kunne avslutte på, fordi den kommer "hoppende" tilbake til de pixelene den prøver å undersøker.

 

Edit:

Kanskje lagd et nytt buffer i tillegg og fylt opp dette for hver pixel sin 4-naboskap. Da slipper du rekursjon.

Endret av hishadow
Lenke til kommentar
Hei

 

Jeg har thresholdet et bilde, og skal klassifisere sammenhengende piksler inn i regioner med felles identifikator. Kanskje jeg er litt trøtt, men jeg klarer ikke å se for meg noen andre måter å gjøre det på, på denne måten får jeg stack overflow ved bilder over ca. 200x200, jeg skal analysere ett på ca. 900x500.

 

Noen tips til andre angrepsmåter for å unngå så mange rekursive kall ?

 

Tror kanskje din void fourConnect(...) løper amok. Den har jo ingen måte å kunne avslutte på, fordi den kommer "hoppende" tilbake til de pixelene den prøver å undersøker.

 

Edit:

Kanskje lagd et nytt buffer i tillegg og fylt opp dette for hver pixel sin 4-naboskap. Da slipper du rekursjon.

Heisann.

 

Neida, gitt nok plass til stacken terminerer den, men det blir for mange rekursive kall på store datamengder.

 

Fant ut at jeg i bunn og grunn laget en flood fill-algoritme (slike som brukes i tegneprogram), så jeg fant et par som var effektive nok for store datamengder. :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...