c++ - 连接组件算法的问题(递归)
问题描述
我正在做一个图像项目,我正在尝试制作一个连接组件算法。这就是我想出的:
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);
}
}
当我运行代码时,它会在一些图像的执行过程中停止,但对于其他图像,它会正确执行。
算法在某些情况下是否有可能进行过多的函数调用?
解决方案
我不了解所有细节,但我可以看到您的递归可能会一遍又一遍地访问相邻像素。
例如,您从(i, j)
到(i+1, j)
再从那里返回(i, j)
。
最有可能的是,当lable
达到 255 并一遍又一遍地重新分配给所有像素时,这种递归永远不会停止的初始状态,然后才能再次递增。
当执行资源耗尽或达到某些内部编译器限制时,这种无限递归会停止。
推荐阅读
- python - 根据 PySpark 中的值相等过滤键/值对的 RDD
- java - Java 8 - 三重嵌套的 for 循环
- kdb - 修改单个元素的横截面
- python - 在 bokeh 2.x 中使用 Annual_wedge 在饼图/甜甜圈图中添加标签
- sql - 使用 Cosmos SQL 查询选择数组元素
- ruby-on-rails - Rails 6 - 将数组属性保存到模型正在从数组中删除最后一项?
- actionscript - ActionScript 对符号的访问不起作用
- angular - 在启动时调用 PWA 服务,该服务返回对可观察对象的订阅
- javascript - 流中的 NodeJs 范围
- reactjs - 如何在 react.js 中使用谷歌地图 iframe 嵌入代码