我正在处理一个图像项目,并且正在尝试建立一个连接组件算法。这是我想出的:
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);
}
}
当我运行代码时,它会在执行过程中停下来并显示一些图像,但是在正常情况下它会正确执行。
在某些情况下,算法是否可能进行过多的函数调用?
答案 0 :(得分:0)
我不了解所有细节,但是我可以看到您的递归可能会反复访问相邻的像素。
例如,您从(i, j)
到(i+1, j)
,然后从那里回到(i, j)
。
在lable
达到255并一遍又一遍地重新分配给所有像素之前,最有可能出现这种递归从未停止的初始状态。
当执行资源用尽或达到内部编译器限制时,这种无限递归就会停止。