我正在使用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
而不交换相邻坐标。会发生吗?