与连接的组件算法有关的问题(递归)

时间:2018-10-27 21:55:25

标签: c++ opencv recursion connected-components

我正在处理一个图像项目,并且正在尝试建立一个连接组件算法。这是我想出的:

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);

}

}

当我运行代码时,它会在执行过程中停下来并显示一些图像,但是在正常情况下它会正确执行。

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

1 个答案:

答案 0 :(得分:0)

我不了解所有细节,但是我可以看到您的递归可能会反复访问相邻的像素。

例如,您从(i, j)(i+1, j),然后从那里回到(i, j)

lable达到255并一遍又一遍地重新分配给所有像素之前,最有可能出现这种递归从未停止的初始状态。

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

相关问题