图像处理- c++ segFault问题

image processing - c++ segFault issue

本文关键字:问题 segFault c++ 图像处理      更新时间:2023-10-16

我试图做一个程序,通过网络摄像头feed创建各种过滤器,并遇到了blob分析和其他一些问题。

我得到segFault每次我激活我的草火功能。下面是我的grassfire函数的代码:

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,这应该不是内存使用要求。我在win7的代码块中使用开放框架。

它看起来不像你可以读/写粘贴你的blobArray的末尾,因为你做了一些检查,所以这意味着你是一个堆栈溢出的受害者。

您应该使用调试器并运行反向跟踪,因为许多调用无法隐藏

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

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