2014-01-23 24 views
1

我明白,stackoverflow異常通常是無限循環,但我已經檢查了我的邏輯並遍歷代碼,並且無法弄清楚。沒有無限循環,因爲我在處理它時用locationID標記每個像素!爲什麼我得到一個stackoverflow異常(EMGU,openCV for C#,Visual Studio 2010 Express)

private void setAttachedPixels(ref Image<Gray, byte> source, int X, int Y, byte locationID) //recursively set a pixel, and all adjacent unmarked pixels, to a certain number 
    { 
     if (X >= 0 && Y >= 0 && X < source.Rows && Y < source.Cols) 
     { 
      if (source.Data[X, Y, 0] == 1) // 1 means unprocessed - locationID starts at 2 and increments elsewhere 
      { 

       source.Data[X, Y, 0] = locationID; //mark origin pixel 
       setAttachedPixels(ref source, X+1, Y-1, locationID); //down left pixel 
       setAttachedPixels(ref source, X+1, Y, locationID); //down 
       setAttachedPixels(ref source, X+1, Y+1, locationID); //down right 
       setAttachedPixels(ref source, X, Y - 1, locationID); //left 
       setAttachedPixels(ref source, X, Y + 1, locationID); //right 
       setAttachedPixels(ref source, X - 1, Y - 1, locationID);//up left 
       setAttachedPixels(ref source, X - 1, Y, locationID); //up 
       setAttachedPixels(ref source, X - 1, Y + 1, locationID); //up right 
      } 
     } 
     return; 
    } 

代碼解釋:我通過圖像(基本上是2維數組),在它的一些斑點,並試圖循環「算」有多少像素每個斑的一部分。希望你能看到我在做什麼。

下面是錯誤的截圖。它和堆棧跟蹤沒有任何幫助,但我知道有人會問。

enter image description here

+1

FYI:你不應該使用'ref'供大家參考類型參數。看[這個問題](http://stackoverflow.com/questions/21297071)。 –

+1

遞歸不一定是無限的,會導致堆棧溢出,它必須足夠深以至於堆棧指針超出堆棧邊界。 – Nacimota

回答

2

這不是在這種情況下無限循環,但它可以是非常深的。 根據我對您的代碼的理解,您不僅設置了相鄰像素,還設置了它們的相鄰像素以及相鄰像素的相鄰像素等等。

例如對於1000 * 1000的圖像,如果我打電話給setAttachedPixels(image, 0, 999, XX),那麼最終只需要999個電話就可以看到左下像素。

如果你只是想添加的像素和與其相鄰的,你應該使用類似:

private void SetPixels(Image<Gray, byte> source, int X, int Y, byte locationID) 
{ 
    if (X >= 0 && Y >= 0 && X < source.Rows && Y < source.Cols) 
    { 
     if (source.Data[X, Y, 0] == 1) // 1 means unprocessed - locationID starts at 2 and increments elsewhere 
     { 
      source.Data[X, Y, 0] = locationID; //mark origin pixel    
     } 
    } 
} 

private void SetAttachedPixels(Image<Gray, byte> source, int X, int Y, byte locationID) 
{ 
    setPixels(source, X, Y, locationID); 
    setPixels(source, X+1, Y-1, locationID); //down left pixel 
    setPixels(source, X+1, Y, locationID); //down 
    setPixels(source, X+1, Y+1, locationID); //down right 
    setPixels(source, X, Y - 1, locationID); //left 
    setPixels(source, X, Y + 1, locationID); //right 
    setPixels(source, X - 1, Y - 1, locationID);//up left 
    setPixels(source, X - 1, Y, locationID); //up 
    setPixels(source, X - 1, Y + 1, locationID); //up right  
} 
相關問題