Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连接的组件不适用于较大的矩阵大小_C++_Image Processing - Fatal编程技术网

C++ 连接的组件不适用于较大的矩阵大小

C++ 连接的组件不适用于较大的矩阵大小,c++,image-processing,C++,Image Processing,我有这段代码,用于在二进制图像中查找所有连接的组件,以及该组件中的像素总数 int isSafe(unsigned char *M, int row, int col, bool visited[][COL]) { return (row >= 0) && (row < ROW) && (col >= 0) && (col < COL) && (M[row*ROW + col]

我有这段代码,用于在二进制图像中查找所有连接的组件,以及该组件中的像素总数

int isSafe(unsigned char *M, int row, int col, bool visited[][COL])
{
    return (row >= 0) && (row < ROW) && (col >= 0) && (col < COL) &&     
       (M[row*ROW + col] && !visited[row][col]); 
}

void DFS(unsigned char *M, int row, int col, bool visited[][COL])
{
    indexes.push_back(count_elements);//
    indexes.at(count_elements)= ((row+1)*ROW + col+1);
    ++count_elements;
    //add index positions to array or vector
    static int rowNbr[] = {-1, -1, -1,  0, 0,  1, 1, 1};
    static int colNbr[] = {-1,  0,  1, -1, 1, -1, 0, 1};

    visited[row][col] = true;

    for (int k = 0; k < 8; ++k)
    if (isSafe(M, row + rowNbr[k], col + colNbr[k], visited) )
    {
        DFS(M, row + rowNbr[k], col + colNbr[k], visited);
    }
}

int countComponents(unsigned char *M)
{
    bool visited[ROW][COL];
    memset(visited, 0, sizeof(visited));    

    for (int i = 0; i < ROW; ++i)
    for (int j = 0; j < COL; ++j)
        if (M[i*ROW + j] && !visited[i][j]) 
        {
            //indexes.clear();
            count_elements=0;
            DFS(M, i, j, visited);
            elements[count] = count_elements;
            ++count;                
        }

    /*for (int i = 1; i < ROW; ++i)
    {
    if(elements[0]<elements[i])
        elements[0] = elements[i];      
    }*/
    //printf("%d ", elements[0]);
    return count;
}
int-isSafe(未签名字符*M、int行、int列、bool访问[][col])
{
返回(行>=0)&&(行<行)&&(列>=0)&&(列<列)&&
(M[行*行+列]&&!访问[行][列];
}
无效DFS(未签名字符*M,整数行,整数列,布尔访问[][col])
{
索引。推回(计数元素)//
索引.at(count_元素)=((行+1)*行+col+1);
++元素计数;
//将索引位置添加到数组或向量
静态int rowNbr[]={-1,-1,-1,0,0,1,1,1};
静态int-colNbr[]={-1,0,1,-1,1,-1,0,1};
访问[行][列]=真;
对于(int k=0;k<8;++k)
if(isSafe(M,row+rowNbr[k],col+colNbr[k],已访问))
{
DFS(M,row+rowNbr[k],col+colNbr[k],已访问);
}
}
int countComponents(无符号字符*M)
{
布尔访问了[世界其他地区][哥伦比亚];
memset(已访问,0,sizeof(已访问));
对于(int i=0;iif(elements[0]堆栈大小不足。在Visual Studio的默认设置下,即使一个函数的唯一参数是int,也只能递归4711次(调试模式,我的计算机)。您传递了更多参数,并在堆栈上放置了大量数据(bool访问了[ROW][COL],在未发布的代码中可能还有更多)。因此,在对DFS进行数千次递归调用后,会出现堆栈溢出(尽管实际崩溃可能出现在new()中)。
一些替代解决方案:

  • 通过命令行或链接器选项更改堆栈大小。这是非常不推荐的

  • 使用向量作为堆栈(直接或使用std::stack adapter)而不是递归。这意味着DPS不需要递归,只需保留一个未开发点的向量,取最后一个,找到所有未访问的邻居,安置它们,等等

  • 使用更好的连接组件算法


  • M[行*行+列]
    -这里有一件事:如果我做对了,函数应该检查行/列像素是否在m矩阵内。如果你在矩阵外传递一个点的函数坐标,它会给你一个访问冲突。@tsuki这个检查就是
    isSafe
    应该做的。@Gaurav请发布你的code、 似乎您正在使用上面未显示其定义的全局变量,特别是
    索引
    元素
    计数
    计数
    @Gaurav。这可能是堆栈溢出问题。组件大小为3200表示递归深度为3200。如果是这种情况,则为DFS递归这是不合适的。我推荐联合查找算法。它不是递归的;你只遍历矩阵一次。而且它更有效。@ Gaurav也不需要8连通性。4连通性就足够了。如果你实现了联合查找,你只需通过矩阵,在每个位置只考虑T。两个邻居,一个在上面,一个在左边。下面和右边的将在稍后进行检查。