Commit b290e77b SK

分组算法优化

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