2012-07-09 53 views
1

我想编写一个边缘检测方法。我已经使用emgucv Image类。因为我需要的灰度值我已经宣布它作为如何处理内存堆栈过载

Image<Gray,float> MyImage = new Image<Gray,float>; 

我选择一个图像,并指定其像素值到MYIMAGE作为

public void selectImage() 
      { 
       OpenFileDialog opp = new OpenFileDialog(); 
       if (opp.ShowDialog() == DialogResult.OK) 
       {     
        MyImage = new Image<Gray,float>(opp.FileName); 
        InputArray = new Image<Gray, float>(opp.FileName); 
        Convert.ToString(MyImage); 
        pictureBox1.Image = MyImage.ToBitmap();     
       }    
      } 

当我点击边缘检测按钮,它调用主递归函数

private void detect_edges_Click(object sender, EventArgs e) 
     {   
      hueckel_operator(1, 1); 
     } 

这种操作重复本身5pixel间隔。换句话说,我通过将x参数增加5来在x轴上应用它,在行的末尾我将y轴增加5,依此类推。

在hueckel_operator,其中再次计算一个非常沉重的公式被称为8次函数“一()”。这里是a()函数

public double a(int j, int counter6, int counter7) 
      { 

       for (int II = 0; II <= j ; II++) 
       { 
        for (KK = 1; KK < 70; KK++) 
        { 
         x_value = input_i_x(KK); //this function brings the x coordinate 
         y_value = input_i_y(KK); // this function brings the y coordinate 

       result += HueckelDisk(x_value,y_value,j) * MyImage[x_value+counter6, y_value+counter7].Intensity; 
       //MyImage.Dispose(); 
        } 
       }       
       return result; 
      } 

但问题是大约在坐标(75,5)它引发堆栈溢出异常。我用性能分析调试它,MyImage似乎吃掉所有的内存。你可能想看到递归函数,但由于它太大,我不能把它放在这里,我相信递归函数(hueckel_operator())不能达到终止条件,因为我发现它被调用了多少次。我想要的是找出是否有另一种方式来更有效地计算“结果”。

我的另一个问题是,对象MYIMAGE在功能使用的()69 *进行j次?它意味着它分配内存空间,69 *进行j次每当()被调用?在我绝望的尝试期间,为了减少内存使用,我已经声明和定义了几乎所有的变量作为全局变量,因为除非调用hueckel_operator()和a(),否则本地变量会在堆栈中分配额外的内存一遍又一遍,这是一个好的还是必要的方法?

我用4个非常嵌套,重功能,我不使用任何类。这会是主要问题吗?说实话,我没有看到任何东西可以转化为课堂。

我知道,我都问了太多问题,但我真的绝望了现在。自从几周以来,我正在阅读文章,我想我需要一个开始。任何帮助,将不胜感激。

enter image description here

回答

3

堆栈溢出异常并没有真正有很多工作要做,内存使用情况 - 这是从堆栈使用。在你的情况下,递归调用。

递归只能走这么深,直到堆栈耗尽。一旦发生这种情况,你的堆栈溢出。

如果在无限递归,但你需要更进一步,你可以当你创建一个线程指定堆栈大小,并运行在您的递归函数:

var stackSize = 10000000; 
var thread = new Thread(new ThreadStart(StartDetection), stackSize); 

然而,默认大小是1MB - 对于大多数任务来说这是相当多的。您可能需要验证您的递归实际上并未解除绑定,或者您无法减少或移除它。

+0

确定这似乎解决我的问题,但我必须先了解它,因为我不知道在哪里把它或者写什么,而不是“开始检测”(可能命名功能)。我也宁愿修改我的算法,但我真的没有时间,我不知道,也许它不是无限的,你说 – mctuna 2012-07-09 13:40:00

+0

是'StartDetection'在我的例子是一些函数的名称(可能只会有一个行:'hueckel_operator(1,1);') – 2012-07-09 13:52:00

+0

太谢谢你了 – mctuna 2012-07-09 14:03:32