我是C ++的新手,我自己实现了Canny边缘检测器算法。为此,我声明了一些2D数组。它给我一个错误“ ConsoleApplication3.exe中0x000A1809的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000,0x00E92000)”
我最大程度地减少了数组元素的数量,并且可以正常工作。但是当我需要包含更多元素的数组时
//2.Gradian Calculation: a.Calculating Gx and Gy b.Calculation sqrt(Gx^2 + Gy^2) c.Calculating the gradiant orientation
int Fx[3][3] = { {-1,0,1},{-2,0,2},{-1,0,1} };
int Fy[3][3] = { {1,2,1},{0,0,0},{-1,-2,-1} };
int image[100][100] = { 50 };
int gradian_x[100][100] = { 0 };
int gradian_y[100][100] = { 0 };
double edgeStrength[100][100] = { 0 };
//Calculating Gx
for (int i = 1; i < 99; i++)
{
for (int j = 1; j < 99; j++)
{
gradian_x[j][i] = image[j - 1][i - 1] * Fx[0][0] + image[j][i - 1] * Fx[1][0] + image[j + 1][i - 1] * Fx[2][0] + image[j + 1][i + 1] * Fx[2][2] + image[j][i + 1] * Fx[1][2] + image[j - 1][i + 1] * Fx[0][2];
}
}
堆栈空间有限。假设平台上的int
是4个字节,double
是8个字节,则您需要195 kiB的内存,该内存可能在堆栈中可用,也可能不可用(这忽略了堆栈中的任何其他必需的东西,例如函数调用等)。
为了存储更大的数据集,应将动态内存分配与std::vector
一起使用(它使用堆内存而不是比堆栈大得多的堆栈内存:]
const int initialValue = 50;
std::vector<std::vector<int>> image (100, std::vector<int>(100, initial_value);
请注意,int image[100][100] = { 50 };
会将only初始化为image[0][0]
为50,其余元素初始化为0。在上面的示例中已将其固定(在那里所有元素均以50初始化),但是如果要保留该行为,则应使initial_value
等于0并直接更改image[0][0]
。
为了提高性能,最好使用像Eigen
这样的专用库。如果您不需要外部资源,则可以改用std::vector<std::array<int, 100>>
,它将在单个块中分配内存(最好用于处理器缓存):
std::array<int, 100> initialArray;
std::fill(initialArray.begin(), initialArray.end(), 50);
std::vector<std::array<int, 100>> image (100, initialArray);