1

我正在尝试做一个程序,通过网络摄像头提要创建各种过滤器,并在 BLOB 分析和其他一些问题上遇到了一些问题。

每次我激活我的草火功能时,我都会收到 segFault。这是我的草火功能的代码:

void testApp::grassFire(int mask_Y, int mask_X, unsigned char labelCnt)
{
    blobArray[mask_Y * camWidth + mask_X] = labelCnt;
    if (mask_X + 1 <= camWidth - 1 && blobArray[mask_Y * camWidth + mask_X + 1] == 0)
       grassFire(mask_Y, mask_X + 1, labelCnt);
    if (mask_Y + 1 <= camHeight - 1 && blobArray[(mask_Y + 1) * camWidth + mask_X] == 0)
       grassFire(mask_Y + 1, mask_X, labelCnt);
    if (mask_X - 1 >= 0 && blobArray[mask_Y * camWidth + mask_X - 1] == 0)
       grassFire(mask_Y, mask_X - 1, labelCnt);
    if (mask_Y - 1 >= 0 && blobArray[(mask_Y - 1) * camWidth + mask_X] == 0)
       grassFire(mask_Y - 1, mask_X, labelCnt);
}

它的调用方式是由每帧运行的 switch case这意味着它在每帧更新时被调用

函数本身在任何其他范围之外声明。

我知道这是一个非常重的过滤器,它可能会使用大量内存,但与其他一些过滤器相比,它并没有那么糟糕,所以我不知道为什么会出现 segFault。

我还在另一个过滤器上得到了 segFault,这不应该是对内存使用的要求。我在 win 7 的代码块中使用 openframeworks。

4

3 回答 3

2

由于您进行了一些检查,因此您似乎无法读取/写入粘贴末尾的内容blobArray,因此这意味着您是堆栈溢出的受害者。

您应该使用调试器并运行回溯,许多调用无法隐藏。

于 2013-01-05T21:43:06.400 回答
0

如果您有很多 0 的数组值,则由于函数的高度递归性质,您可能会遇到堆栈溢出。我建议尝试使用迭代洪水填充算法,看看是否能解决问题。

于 2013-01-05T21:39:49.587 回答
0

我会使用valgrind来检测应用程序。Valgrind 将显示分段错误发生位置的堆栈跟踪。

于 2013-01-14T19:52:46.137 回答