【问题标题】:Comparison method violates its general contract! while sorting Image contours in java比较法违反其总约!在java中对图像轮廓进行排序时
【发布时间】:2018-11-06 16:20:08
【问题描述】:

我知道可能还有其他类似的问题,但他们仍然没有解决我的问题。我正在尝试使用以下方法根据轮廓区域对图像轮廓进行排序:

contours.sort((Object o1, Object o2) -> 
(int) (Imgproc.contourArea((MatOfPoint) o1) - Imgproc.contourArea((MatOfPoint) o2) + 0.5));

您看到排序比较很简单(只是区域之间的差异),但我仍然收到上述错误。我不知道为什么。也许是因为面积是双倍的,我将差异转换为 int?谢谢。

【问题讨论】:

  • 可能是因为你的+ 0.5,为什么会有那个?
  • 没有。没有它是同样的问题

标签: java sorting compare opencv-contour


【解决方案1】:

您似乎正在尝试比较two doubles

contours.sort(Comparator.comparingDouble(a -> ImgProc.contourArea((MatOfPoint) a));

演员表也有点可疑:除非您实际上是在尝试对Object 的列表进行排序,否则请使用元素类型。假设contoursList<? extends Mat>

contours.sort(Comparator.comparingDouble(ImgProc::contourArea));

您可能在这里遇到的具体问题是传递性:如果a == bb == c,那么比较器的合同也需要a == c。 (这里,x == y 表示compare(x, y) == 0)。

但是由于从 double 到 int 的缩小,违反了这个要求。考虑a = 0b = 0.5c = 1int(b - a) == 0int(c - b) == 0,所以“a == b”和“b == c”。

但是,int(c - a) == 1,所以“a != c”。因此,违反了合同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多