Sort List <point>自定义比较器

时间:2018-12-13 20:42:02

标签: sorting

我正在使用HoughCircles来检测图像上的圆圈。很好但是,未按图像中显示的顺序检测到圆圈。我得到Mat circles的随机顺序。因此,我使用圆的半径和中心对所需的半径进行排序。

List<Point> tempPoints = new ArrayList<>();
List<Point> index = new ArrayList<>();

private temp intToPoint(int i) {
    /*
     *  get the circle details, circleCoordinates[0, 1, 2] = (x,y,r)
     * (x,y) are the coordinates of the circle's center
     */
    double[] circleCoordinates = circles.get(0, i);
    double x = circleCoordinates[0], y = circleCoordinates[1], z = circleCoordinates[2];
    return new temp(new Point(x, y), (int) z);
}

for (int i = 0; i < numberOfCircles/*80 detected as needed*/; i++) {
    temp t = intToPoint(i);
    Point center = t.foo;
    int radius = t.bar;

    /* circle points to sorted in order */
    tempPoints.add(center);

    if(/*required condition*/) {
        // circle outline in green
        Imgproc.circle(mat, center, radius, new Scalar(0, 255, 0), 4);
        //required circle co-ordinates
        index.add(center);
    }
 }

现在,我需要知道这些圆圈出现的顺序,以便执行进一步的计算。因此,我将上面的i保存在List<Integer>中或将Point(x,y)保存在List<Point>中,以便可以在有序列表中找到它。比较的列表不会被重写;仅比较和排序,但结果使整个列表变得混乱。 sortedList.contains(intToPoint(i).foo)产生-1

比较是通过以下功能完成的:

private static void sortTopLeft2BottomRight(List<Point> points){
    // top-left to right-bottom sort
    Collections.sort(points, (e1, e2) -> {return Double.compare(e1.y, e2.y);});
}

private static void sortLeft2Right(List<Point> points){
    // left to right sort
    Collections.sort(points, (e1, e2) -> {return Double.compare(e1.x, e2.x)});
}

然后调用该函数从上到下模糊地排序,然后配对为10列。然后将这些列按顺序排序。

sortTopLeft2BottomRight(tempPoints);
List<Point> bubbles = new ArrayList<>();

for(int j = 0; j < numberOfCircles; j += 8){
    List<Point> row = tempPoints.subList(j, j + 8);
    sortLeft2Right(row);
    bubbles.addAll(row);
}

我在循环中将其排序错误还是自定义比较?我试图寻找其中一种,但显然此解决方案应该可行;我发现index的值甚至不属于我的bubbles列表。 Mat circles不是grayScale,也不使用1个颜色的通道,因此我需要进行自定义比较。在查看输出bubbles列表时,我最好的猜测是自定义比较器仅交换x或仅交换y而不交换相邻坐标。会发生吗?

0 个答案:

没有答案