我正在尝试按照此处显示的代码遍历二进制EmguCV图像中的所有像素: https://stackoverflow.com/a/5107490/1092688
对找到的任何白色像素进行递归调用,并将连续对象放入其自己的二进制图像中。有一个List存储这些二进制图像,然后我需要在列表上执行一些操作。但是,我的递归函数中出现堆栈溢出错误。迭代图像的代码块如下所示:
//globals:
byte[,,] outputData;
byte[,,] inputData;
int count = 0;
//iterative loop
inputData = input.Data;
for (int i = input.Rows - 1; i >= 0; i--)
{
for (int j = input.Cols - 1; j >= 0; j--)
{
if (inputData[i, j, 0] == 255)
{
count = 0;
Image<Gray, Byte> temp = new Image<Gray, Byte>(input.Size);
outputData = temp.Data;
crawlFrom(i, j);
//outputData should now contain a byte[,,] representing the data of a single object to be processed.
}
}
}
递归函数如下所示(注意它使用上面显示的全局变量):
private void crawlFrom(int i, int j)
{
outputData[i, j, 0] = 255;//add pixel to output
count++;//increment count
inputData[i, j, 0] = 0;//blacken input image
//recursively call on neighbors:
if(i + 1 < height)
if (inputData[i + 1, j, 0] == 255)
crawlFrom(i + 1, j);
if (i - 1 >= 0)
if (inputData[i - 1, j, 0] == 255)
crawlFrom(i - 1, j);
if (j + 1 < width)
if (inputData[i, j + 1, 0] == 255)
crawlFrom(i, j + 1);
if (j - 1 >= 0)
if (inputData[i, j - 1, 0] == 255)
crawlFrom(i, j - 1);
}
我在递归调用它之前检查了邻居的颜色,试图阻止堆栈溢出,是我也试过了
if(inputData[i, j, 0] == 0) return;
在功能开始时。
其他一些信息:
堆栈大小为1GB
图像尺寸为1920x1080
图像的白色像素应小于10%。看起来导致堆栈溢出的图像往往具有更多的白色像素(可能高达30%)
这是一个实时应用程序
物体并不总是封闭的形状。
我该如何解决这个问题?我对Image.Data属性的工作方式以及我是否正确使用它非常不熟悉所以我希望它是显而易见的。如果它不是一个简单的错误修正,我愿意接受调整现有算法的建议或完全改变我的算法进行对象检测,只要该解决方案符合我的检测和速度标准。
谢谢你的时间!