0

画像処理プロジェクトでは、BlodshedDev-C++を使用しています。ビデオフレームに連結成分ラベリングを実装しています。何度も再帰する再帰関数を使用する必要があるため、スタックオーバーフローが発生します。どうすればスタックサイズを大きくできますか?いくつかのリンカーパラメータまたは同様のものを介してそれを変更することは可能ですか?

void componentLabel(int i,int j,IplImage *img){
  //   blueFrame = img->imageData[i*3*width+j*3];
//     greenFrame = img->imageData[i*3*width+j*3+1];
//     redFrame = img->imageData[i*3*width+j*3+2];

     if(!( img->imageData[i*3*width+j*3]==0 && img->imageData[i*3*width+j*3+1]==0 && img->imageData[i*3*width+j*3+2]==0 )  ){
           //printf("iffffff aq\n");
           return;     
     }
     else{
           //printf("else aq  %d\n",sayac_label);                          
               img->imageData[i*3*width+j*3]=1;  

               new_object.pixel_count=new_object.pixel_count+1;
               new_object.total_row=new_object.total_row+i;
               new_object.total_col=new_object.total_col+j;

               if(j<width-1 ){                   
                         componentLabel(i,j+1,img);                         
               }               
               if(j>0 ){                   
                         componentLabel(i,j-1,img);                   
               }             
               if(i<height-1 ){  
                         if(i>new_object.bottom.satir){
                              new_object.bottom.satir=i;
                              new_object.bottom.sutun=j;                                               
                         }

                         componentLabel(i+1,j,img);                         
               }              
               if(i>0 ){ 
                         if(i<new_object.top.satir){
                              new_object.top.satir=i;
                              new_object.top.sutun=j;                                               
                         }                  
                         return componentLabel(i-1,j,img);               
               }      
     }
4

1 に答える 1

1

スタックサイズが不足しないことを保証するアプローチは1つだけです。アルゴリズムを末尾再帰に再定式化します(コンパイラが末尾呼び出しを最適化していることを確認します。通常は-O3(または-O2?)最適化フラグです)。

それが足りない場合は、シェルがタスクに付与する最大スタックサイズを増やしましたか?

  ulimit -s <maximum stack size>
于 2012-04-15T04:29:54.440 に答える