循环的奇怪行为

3

好的,我已经花了几个小时在这上面了,所以如果解决这个问题可能非常简单,请原谅。我有一个循环迭代图像,它从某个像素开始,向左移动几个像素并检查它们是否满足条件。如果我找到符合条件的点,我会返回它。如果没有找到或超出图像范围,我将返回{-1,-1}

private static int[] checkLineLeft(int[] point, Mat intensity) {
    for (int i = 1; i < intensity.width()*0.2f; i += 1) {
        try {
            if (intensity.get(point[1], point[0] - i)[0] > 100
                    && intensity.get(point[1], point[0] - i)[2] < 50) {
                return new int[]{point[0] - i, point[1]};
            } else {
                continue;
            }
        } catch (Exception e) {
            return new int[]{-1, -1};
        }
    }
    return new int[]{-1, -1};
}

我的问题是我得到了非常奇怪的结果。我总是得到一个点{-23646,286}(第二个值是正确的)。我无法解释为什么会出现这种情况。我调试了一下,发现在某个点上条件没有满足(我想检测的那个点),但函数却返回到for循环的开始处重新开始,而不是返回我的{-1,-1}
以下是我调用该函数的方式:
int[] newMarkerBottom = checkLineLeft(markerBottom, intensity);
while (newMarkerBottom[0] != -1) {
    markerBottom = newMarkerBottom.clone();
    newMarkerBottom = checkLineLeft(markerBottom, intensity);
}

编辑

我再次检查了,当if条件的内部部分为false时,并没有捕获到任何异常。调试器只是跳回到for(...)这一行并继续执行。

编辑2

我正在运行一个Android应用程序。然而,我认为这不能成为问题的一部分。

编辑3

这可能有所帮助:当我将断点设置为return return new int[]{point[0] - i, point[1]};时,它会停在那里,然后在下一步中跳转到最后一个return new int[]{-1,-1};,并且永远不会再次到达断点。


5
那个"catch块"很危险。如果发生异常,你将永远不会知道。至少记录一下异常是一个好主意。 - m0skit0
3
不需要else/continue - Andy Turner
1
顺便提一下,你正在扫描点作为[x,y],但返回[y,x]。 - Draco18s no longer trusts SE
2
"我总是有一个点{-23646,286}",看起来你的point[0]相当小,而i很高,所以在return new int[]{point[0] - i, point[1]}中,point[0] - i将为负数。你能创建一个可运行的示例,这样我们就可以在本地运行你的代码吗?" - Tom
1
不是答案,但是一些建议:不要使用“int”数组作为坐标 - 创建或使用特殊类,在其中指定x和y。删除else和continue块 - 它们绝对没有用。删除try-catch - 它们什么也不做。 回答你的问题 - 我需要关于intensity.width参数的信息。 - Pavel Uvarov
显示剩余10条评论
1个回答

2

我不确定您的源代码表现出奇怪行为的原因(可能有很多种可能性)。

根据您的源代码,最终的源代码应该如下所示: 额外的类:

public class Point {
   private final int x;
   private final int y;
   public Point(int x, int y) {
     this.x = x;
     this.y = y;
   }
   public int getX() {
     return x;
   }
   public int getY() {
     return y;
   }
}

检查方法:
private static Point checkLineLeft(Point point, Mat intensive) {
  int minX = point.getX() - intensive.width()*0.2;
  int y = point.getY();
  for (int x = point.getX() - 1 ; x > minX && x >= 0 ; x--) {
    if (isCorrectPoint(intensive, x, y)) {
      return new Point(x, y);
    }
  }
  return new Point(-1, -1);
}

private static boolean isCorrectPoint(Mat intensive, int x, int y) {
  return intensity.get(y, x)[0] > 100
      && intensity.get(y, x)[2] < 50;
}

更新一些内容,使源代码更清晰并提高可读性。


我稍微修改了你的代码并尝试了一下,它运行得很好!非常感谢!不过,我真的很想知道为什么我的解决方案不起作用 =) - PKlumpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接