Commit dc4f85e6 SK

优化粘连

1 个父辈 e7982bd2
...@@ -63,6 +63,7 @@ ...@@ -63,6 +63,7 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="AccUtil.cs" />
<Compile Include="ImageUtil.cs" /> <Compile Include="ImageUtil.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SplitItem.cs" /> <Compile Include="SplitItem.cs" />
......
此文件的差异被折叠, 点击展开。
...@@ -9,6 +9,7 @@ namespace AccImage ...@@ -9,6 +9,7 @@ namespace AccImage
{ {
public class SplitItem public class SplitItem
{ {
public static double DIFF_PERCENT = 0.5;
public bool isEnd = false; public bool isEnd = false;
public double avgRadius = 0; public double avgRadius = 0;
public int centerX = 0; public int centerX = 0;
...@@ -16,6 +17,8 @@ namespace AccImage ...@@ -16,6 +17,8 @@ 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>
...@@ -29,9 +32,9 @@ namespace AccImage ...@@ -29,9 +32,9 @@ namespace AccImage
} }
else else
{ {
//与平均半径差值在10%以内,认为OK //与平均半径差值在50%以内,认为OK
double diff = avgRadius - currentMaxRadius; double diff = avgRadius - currentMaxRadius;
if (diff/avgRadius <= 0.5) if (diff/avgRadius <= DIFF_PERCENT)
{ {
isValid = true; isValid = true;
} }
...@@ -52,26 +55,26 @@ namespace AccImage ...@@ -52,26 +55,26 @@ 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;
////平均半径
//double total = 0;
//foreach (Circle c in circles)
//{
// total = total + c.radius;
//}
//avgRadius = total / circles.Count;
if(circle.radius > avgRadius) if(circle.radius > avgRadius)
{ {
avgRadius = circle.radius; avgRadius = circle.radius;
} }
} }
else else
{ {
isEnd = true; isEnd = true;
} }
} }
...@@ -134,31 +137,23 @@ namespace AccImage ...@@ -134,31 +137,23 @@ namespace AccImage
{ {
Point2d point = new Point2d(px, py); Point2d point = new Point2d(px, py);
double minDistanceToCircle = -1; double minDistanceToCircle = -1;
foreach (Circle c in circles) List<Circle> neighbourCircles = nearbyCircles;
if (oneBlobRadius > 0)
{
neighbourCircles = nearbyCircles.Where(c => Math.Abs(c.x - px) <= 2 * oneBlobRadius && Math.Abs(c.y - py) <= 2 * oneBlobRadius).ToList();
}
foreach (Circle c in neighbourCircles)
{ {
Point2d circleCenter = new Point2d(c.x, c.y); Point2d circleCenter = new Point2d(c.x, c.y);
double distanceToCircle = point.DistanceTo(circleCenter); double distanceToCircle = point.DistanceTo(circleCenter) - c.radius;
if (distanceToCircle <= c.radius) if (distanceToCircle <= DIFF_PERCENT * c.radius)
{ {
return 0; return 0;
} }
//当前点到料盘中心与圆心到料盘中心的距离在直径内,忽略
//if(oneBlobRadius != -1 && oneBlobWidth != -1)
//{
// double distanceToReelCenter = point.DistanceTo(reelCenter);
// double circleCenterToReelCenter = circleCenter.DistanceTo(reelCenter);
// if (Math.Abs(distanceToReelCenter - circleCenterToReelCenter) < oneBlobRadius)
// {
// if (distanceToCircle < oneBlobWidth)
// {
// return 0;
// }
// }
//}
if (minDistanceToCircle == -1 || distanceToCircle < minDistanceToCircle) if (minDistanceToCircle == -1 || distanceToCircle < minDistanceToCircle)
{ {
minDistanceToCircle = distanceToCircle - c.radius; minDistanceToCircle = distanceToCircle;
} }
} }
return minDistanceToCircle; return minDistanceToCircle;
...@@ -171,6 +166,7 @@ namespace AccImage ...@@ -171,6 +166,7 @@ namespace AccImage
public int x; public int x;
public int y; public int y;
public double radius; public double radius;
public Scalar color = Scalar.Green;
public double distanceToCenter = 0; public double distanceToCenter = 0;
public double distanceToCircle(Circle c) public double distanceToCircle(Circle c)
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!