首页 > 解决方案 > 连接组件算法的问题(递归)

问题描述

我正在做一个图像项目,我正在尝试制作一个连接组件算法。这就是我想出的:

Mat OPG3::cc(Mat imgCC) {

int p = 1;
int lable = 1;
copyMakeBorder(imgCC, imgCC, p, p, p, p, BORDER_CONSTANT, 0);

for (int imgRow = p; imgRow < imgCC.rows - p; imgRow++) {
    for (int imgCol = p; imgCol < imgCC.cols - p; imgCol++) {
        if (imgCC.at < uchar >(imgRow,imgCol) == 255) {
            imgCC.at<uchar>(imgRow, imgCol) = lable;
            recursive(imgRow, imgCol - 1, lable, p, imgCC);
            recursive(imgRow + 1, imgCol, lable, p, imgCC);
            recursive(imgRow, imgCol + 1, lable, p, imgCC);
            recursive(imgRow - 1, imgCol, lable, p, imgCC);
            ++lable;

        }
    }
}
    return imgCC;
}

void OPG3::recursive(int i, int j, int lable, int p, Mat& imgCC) {

if (imgCC.at < uchar >(i, j) == 255) {
    imgCC.at<uchar>(i, j) = lable;
    recursive(i, j - 1, lable, p, imgCC);
    recursive(i + 1, j, lable, p, imgCC);
    recursive(i, j + 1, lable, p, imgCC);
    recursive(i - 1, j, lable, p, imgCC);

}

}

当我运行代码时,它会在一些图像的执行过程中停止,但对于其他图像,它会正确执行。

算法在某些情况下是否有可能进行过多的函数调用?

标签: c++opencvrecursionconnected-components

解决方案


我不了解所有细节,但我可以看到您的递归可能会一遍又一遍地访问相邻像素。

例如,您从(i, j)(i+1, j)再从那里返回(i, j)

最有可能的是,当lable达到 255 并一遍又一遍地重新分配给所有像素时,这种递归永远不会停止的初始状态,然后才能再次递增。

当执行资源耗尽或达到某些内部编译器限制时,这种无限递归会停止。


推荐阅读