c# - 为什么我会收到 stackoverflow 异常(EMGU、用于 C# 的 openCV、Visual Studio 2010 Express)

标签 c# visual-studio-2010 opencv emgucv

我知道 stackoverflow 异常通常是无限循环,但我检查了我的逻辑并单步执行了代码,但无法解决这个问题。没有无限循环,因为我在处理时用 locationID 标记了每个像素!

    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;
    }

代码解释:我正在尝试遍历其中包含一些 Blob 的图像(基本上是一个二维数组),并“计算”每个 Blob 中有多少像素。希望你能看到我在做什么。

这是错误的屏幕截图。它和堆栈跟踪没有帮助,但我知道有人会问。

enter image description here

最佳答案

在这种情况下,这不是无限循环,但它可能非常深。 根据我对你的代码的理解,你不仅要设置相邻像素,还要设置它们的相邻像素,以及相邻像素的相邻像素等等。

例如对于 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       
}

关于c# - 为什么我会收到 stackoverflow 异常(EMGU、用于 C# 的 openCV、Visual Studio 2010 Express),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21300228/

相关文章:

c# - 识别原始打印机

c# - 将一个类移动到不同的命名空间,是否可以向我的文件添加隐式使用?

javascript - resharper javascript intellisense可以在解决方案中引用另一个项目中的js文件吗?

python - 数据框从内存大小相差很大的文件夹中读取图像

opencv - 如何将 opencv_contrib 构建到现有的 opencv 文件夹中?

c# - 如何用 Unicode 转换特殊字符?

javascript - MVC 4 Razor - 创建动态 DropDownList

c# - Linq比较字符串日期

C++ 我无法访问我需要的功能

android - 如何优化 multimap 像拼接?