我知道 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 中有多少像素。希望你能看到我在做什么。
这是错误的屏幕截图。它和堆栈跟踪没有帮助,但我知道有人会问。
最佳答案
在这种情况下,这不是无限循环,但它可能非常深。 根据我对你的代码的理解,你不仅要设置相邻像素,还要设置它们的相邻像素,以及相邻像素的相邻像素等等。
例如对于 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/