Commit b290e77b SK

分组算法优化

1 个父辈 bf447aef
...@@ -9,7 +9,7 @@ namespace AccImage ...@@ -9,7 +9,7 @@ namespace AccImage
{ {
public class SplitItem public class SplitItem
{ {
public static double DIFF_PERCENT = 0.5; public static double DIFF_PERCENT = 0.4;
public bool isEnd = false; public bool isEnd = false;
public double avgRadius = 0; public double avgRadius = 0;
public int centerX = 0; public int centerX = 0;
...@@ -17,12 +17,10 @@ namespace AccImage ...@@ -17,12 +17,10 @@ namespace AccImage
public double currentMaxRadius = 0; public double currentMaxRadius = 0;
public List<Circle> circles = new List<Circle>(); public List<Circle> circles = new List<Circle>();
private List<Circle> nearbyCircles = new List<Circle>();
/// <summary> /// <summary>
/// 一遍结束后调用 /// 一遍结束后调用, 返回当前圆是否有效
/// </summary> /// </summary>
public void calOneItem(double theFixRadius=-1) public Circle calOneItem(double theFixRadius=-1)
{ {
//该半径是否有效 //该半径是否有效
bool isValid = false; bool isValid = false;
...@@ -44,7 +42,7 @@ namespace AccImage ...@@ -44,7 +42,7 @@ namespace AccImage
if(currentMaxRadius == 0) if(currentMaxRadius == 0)
{ {
isEnd = true; isEnd = true;
return; return null;
} }
Circle circle = new Circle(); Circle circle = new Circle();
if(theFixRadius != -1 && currentMaxRadius > theFixRadius) if(theFixRadius != -1 && currentMaxRadius > theFixRadius)
...@@ -55,11 +53,6 @@ namespace AccImage ...@@ -55,11 +53,6 @@ namespace AccImage
circle.x = centerX; circle.x = centerX;
circle.y = centerY; circle.y = centerY;
circles.Add(circle); circles.Add(circle);
if(nearbyCircles.Count % 50 == 0)
{
nearbyCircles = nearbyCircles.Where(c => centerX - c.x < 2 * currentMaxRadius).ToList();
}
nearbyCircles.Add(circle);
currentMaxRadius = 0; currentMaxRadius = 0;
centerX = 0; centerX = 0;
centerY = 0; centerY = 0;
...@@ -67,13 +60,14 @@ namespace AccImage ...@@ -67,13 +60,14 @@ namespace AccImage
{ {
avgRadius = circle.radius; avgRadius = circle.radius;
} }
return circle;
} }
else else
{ {
isEnd = true; isEnd = true;
} }
return null;
} }
...@@ -84,46 +78,87 @@ namespace AccImage ...@@ -84,46 +78,87 @@ namespace AccImage
{ {
c.calDistanceToCenter(center); c.calDistanceToCenter(center);
} }
List<List<Circle>> allGroupCircle = new List<List<Circle>>(); //排序
List<int> allreadyGroup = new List<int>(); circles.OrderBy(c => c.distanceToCenter);
//List<Circle> groupCircle = new List<Circle>(); List<List<Circle>> lineCircles = new List<List<Circle>>();
//groupCircle.Clear(); List<int> allreadyLabel = new List<int>();
//与圆心距离在h范围内的分为一组
while (true) while (true)
{ {
List<Circle> groupCircle = new List<Circle>(); List<Circle> lineCircle = new List<Circle>();
Circle labelCircle = null; Circle firstLineCircle = null;
for (int i=0;i<circles.Count; i++) for (int i = 0; i < circles.Count; i++)
{ {
if (!allreadyGroup.Contains(i)) if (!allreadyLabel.Contains(i))
{ {
Circle c = circles[i]; Circle c = circles[i];
if (labelCircle == null) if (firstLineCircle == null)
{ {
labelCircle = c; firstLineCircle = c;
allreadyGroup.Add(i); allreadyLabel.Add(i);
groupCircle.Add(c); lineCircle.Add(c);
} }
else else
{ {
//到圆心的距离差小于H //到圆心的距离差小于H
if (Math.Abs(c.distanceToCenter - labelCircle.distanceToCenter) < h) if (Math.Abs(c.distanceToCenter - firstLineCircle.distanceToCenter) < h)
{ {
//两圆心之间的距离+直径小于W认为是同一个元器件 lineCircle.Add(c);
if (c.distanceToCircle(labelCircle) < w+h*2/3) allreadyLabel.Add(i);
{
groupCircle.Add(c);
allreadyGroup.Add(i);
}
} }
} }
} }
} }
allGroupCircle.Add(groupCircle); lineCircles.Add(lineCircle);
if (allreadyGroup.Count == circles.Count) if (allreadyLabel.Count == circles.Count)
{ {
break; break;
} }
} }
//再按长度划分
List<List<Circle>> allGroupCircle = new List<List<Circle>>();
foreach (var lineCircle in lineCircles)
{
//排序
lineCircle.OrderBy(c => c.x);
List<int> lineAllreadyLabel = new List<int>();
while (true)
{
List<Circle> groupCircle = new List<Circle>();
Scalar color = Scalar.Yellow;
for (int i = 0; i < lineCircle.Count; i++)
{
if (!lineAllreadyLabel.Contains(i))
{
Circle c = lineCircle[i];
//圆心之间的距离+直径小于W认为是同一个元器件
bool inGroup = true;
foreach (var gCircle in groupCircle)
{
if (c.distanceToCircle(gCircle) > w)
{
inGroup = false;
}
}
if (inGroup)
{
c.color = color;
groupCircle.Add(c);
lineAllreadyLabel.Add(i);
}
}
}
allGroupCircle.Add(groupCircle);
if (lineAllreadyLabel.Count == lineCircle.Count)
{
break;
}
}
}
return allGroupCircle; return allGroupCircle;
} }
...@@ -133,14 +168,14 @@ namespace AccImage ...@@ -133,14 +168,14 @@ namespace AccImage
/// <param name="px"></param> /// <param name="px"></param>
/// <param name="py"></param> /// <param name="py"></param>
/// <returns></returns> /// <returns></returns>
public double minDistanceToCircles(int px, int py, Point2d reelCenter, double oneBlobWidth =-1, double oneBlobRadius = -1) public double minDistanceToCircles(int px, int py, double oneBlobWidth =-1, double oneBlobRadius = -1)
{ {
Point2d point = new Point2d(px, py); Point2d point = new Point2d(px, py);
double minDistanceToCircle = -1; double minDistanceToCircle = -1;
List<Circle> neighbourCircles = nearbyCircles; List<Circle> neighbourCircles = circles;
if (oneBlobRadius > 0) if (oneBlobRadius > 0)
{ {
neighbourCircles = nearbyCircles.Where(c => Math.Abs(c.x - px) <= 2 * oneBlobRadius && Math.Abs(c.y - py) <= 2 * oneBlobRadius).ToList(); neighbourCircles = neighbourCircles.Where(c => Math.Abs(c.x - px) <= 2 * oneBlobRadius && Math.Abs(c.y - py) <= 2 * oneBlobRadius).ToList();
} }
foreach (Circle c in neighbourCircles) foreach (Circle c in neighbourCircles)
{ {
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!