我只是尋找一個有效的方式,因爲我得到一個堆棧溢出錯誤,我給了儘可能多的信息,但也許你不需要所有這些解釋只是本身就足夠的代碼,任何幫助,將不勝感激,讓我得到這個錯誤的乘駕;堆棧溢出錯誤,由於大量的計算
我所試圖做的同時將操作員(Hueckel邊緣檢測算)到9x9的區域,並重復整個圖像。所以它是一個常規的邊緣檢測基礎。你可以在第二張照片上看到我的意思。
函數A()是在一個時間被調用另一個函數稱爲hueckel_operator()的8倍和hueckel_operator是遞歸函數,其調用自身5爲x和y參數每一次。這意味着一個()被調用幾乎爲大圖像和真正的問題MYIMAGE []這是一個emgucv圖像<>對象。因爲MYIMAGE []應該檢查在9×9矩陣的每個像素,並把它的值,它被稱爲比函數69 *進行j次以上的()。
函數input_i_y()帶有y座標,還有另一個函數叫做input_i_x(),它帶來了9x9矩陣的x座標。我知道,這是極端的,使兩個不同的功能,以將它們作爲另一個函數的參數,但我找不到任何更好的解決方案。 HueckelDisk類計算根據X的9個不同的hueckel磁盤式中,y座標。根據擬合精度,我們可以確定是否存在邊緣。
這裏是hueckel_operator()
if (mod_width + counter4 + 10 >= MyImage.Width && mod_height + counter5 + 10 >= MyImage.Height)
{
goto EXIT2;
}
這裏的終止條件是hueckel_operator()的開始和結束
public void hueckel_operator(int counter2, int counter3)
{
counter2 = counter4;
counter3 = counter5;
int mod_width = MyImage.Width % 5;
int mod_height = MyImage.Height % 5;
if (mod_width + counter4 + 10 >= MyImage.Width && mod_height + counter5 + 10 >= MyImage.Height)
{
goto EXIT2;
}
else
{
if (mod_width + counter4 + 10 >= MyImage.Width)
{
if (counter5 == 1)
{
counter5 += 4;
}
else
{
counter5 += 5;
}
counter4 = 1;
}
if (counter4 == 1)
{
counter4 += 4;
}
else if(counter4 != 0)
{
counter4 += 5;
}
if (counter5 == 0 && counter4 == 0)
{
counter4 = 1;
counter5 = 1;
}
}
這裏是的結束hueckel_operator();
EXIT:
hueckel_operator(counter5, counter4);
EXIT2:
MessageBox.Show("done");
}
這裏是函數()
public double a(int j, int counter6, int counter7)
{
double result = 0;
HueckelDisks hueckel_formula = new HueckelDisks();
counter6 = counter4;
counter7 = counter5;
for (int II = 0; II <= j ; II++)
{
for (KK = 1; KK < 69; KK++)
{
result += hueckel_formula.HueckelDisk(input_i_x(KK),input_i_y(KK),j) * MyImage[point_a, point_b].Intensity;
}
}
return result;
}
public int input_i_y(int y)
{
Tuple<int, int>[] myArray =
{
Tuple.Create(3,1),Tuple.Create(4,1),Tuple.Create(5,1),Tuple.Create(6,1),Tuple.Create(7,1),Tuple.Create(2,2),
Tuple.Create(3,2),Tuple.Create(4,2),Tuple.Create(5,2),Tuple.Create(6,2),Tuple.Create(7,2),Tuple.Create(8,2),
Tuple.Create(1,3),Tuple.Create(2,3),Tuple.Create(3,3),Tuple.Create(4,3),Tuple.Create(5,3),Tuple.Create(6,3),
Tuple.Create(7,3),Tuple.Create(8,3),Tuple.Create(9,3),Tuple.Create(1,4),Tuple.Create(2,4),Tuple.Create(3,4),
Tuple.Create(4,4),Tuple.Create(5,4),Tuple.Create(6,4),Tuple.Create(7,4),Tuple.Create(8,4),Tuple.Create(9,4),
Tuple.Create(1,5),Tuple.Create(1,5),Tuple.Create(2,5),Tuple.Create(3,5),Tuple.Create(4,5),Tuple.Create(5,5),
Tuple.Create(6,5),Tuple.Create(7,5),Tuple.Create(8,5),Tuple.Create(9,5),Tuple.Create(1,6),Tuple.Create(2,6),
Tuple.Create(3,6),Tuple.Create(4,6),Tuple.Create(5,6),Tuple.Create(6,6),Tuple.Create(7,6),Tuple.Create(8,6),
Tuple.Create(8,6),Tuple.Create(1,7),Tuple.Create(2,7),Tuple.Create(3,7),Tuple.Create(4,7),Tuple.Create(5,7),
Tuple.Create(6,7),Tuple.Create(7,7),Tuple.Create(8,7),Tuple.Create(9,7),Tuple.Create(2,8),Tuple.Create(3,8),
Tuple.Create(4,8),Tuple.Create(5,8),Tuple.Create(6,8),Tuple.Create(7,8),Tuple.Create(8,8),Tuple.Create(3,9),
Tuple.Create(4,9),Tuple.Create(5,9),Tuple.Create(6,9),Tuple.Create(7,9),
};
return myArray[y].Item2;
}
堆棧溢出來自遞歸。您發佈的代碼不包含任何內容。所以我們可能需要看到不同的代碼。 – 2012-07-08 14:30:53
堆棧溢出通常與無限遞歸相關聯(即,一個函數在沒有導致遞歸終止的「基本情況」的情況下不斷調用自身)。所以我會先檢查你的代碼是否正確。當代碼正確但計算仍然會導致堆棧溢出時,通常意味着您提出的算法效率低下,無法在合理的時間內完成。最後,你的函數'input_i_y'在你每次調用它時創建並初始化一個新的數組。這並不能解釋堆棧溢出,但它會很慢。 – arx 2012-07-08 14:32:58
@arx我正在編輯我的問題,你可以看到它是否有界限,但是它被阻塞並且在x = 70,y = 1時拋出堆棧溢出600x800 – mctuna 2012-07-08 14:36:57