Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
ReelCounter
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit b290e77b
由
SK
编写于
2019-04-28 17:31:24 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
分组算法优化
1 个父辈
bf447aef
全部展开
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
68 行增加
和
33 行删除
AccImage/AccUtil.cs
AccImage/SplitItem.cs
AccImage/AccUtil.cs
查看文件 @
b290e77
此文件的差异被折叠,
点击展开。
AccImage/SplitItem.cs
查看文件 @
b290e77
...
@@ -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,45 +78,86 @@ namespace AccImage
...
@@ -84,45 +78,86 @@ 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
>
group
Circle
=
new
List
<
Circle
>();
List
<
Circle
>
line
Circle
=
new
List
<
Circle
>();
Circle
label
Circle
=
null
;
Circle
firstLine
Circle
=
null
;
for
(
int
i
=
0
;
i
<
circles
.
Count
;
i
++)
for
(
int
i
=
0
;
i
<
circles
.
Count
;
i
++)
{
{
if
(!
allready
Group
.
Contains
(
i
))
if
(!
allready
Label
.
Contains
(
i
))
{
{
Circle
c
=
circles
[
i
];
Circle
c
=
circles
[
i
];
if
(
label
Circle
==
null
)
if
(
firstLine
Circle
==
null
)
{
{
label
Circle
=
c
;
firstLine
Circle
=
c
;
allready
Group
.
Add
(
i
);
allready
Label
.
Add
(
i
);
group
Circle
.
Add
(
c
);
line
Circle
.
Add
(
c
);
}
}
else
else
{
{
//到圆心的距离差小于H
//到圆心的距离差小于H
if
(
Math
.
Abs
(
c
.
distanceToCenter
-
label
Circle
.
distanceToCenter
)
<
h
)
if
(
Math
.
Abs
(
c
.
distanceToCenter
-
firstLine
Circle
.
distanceToCenter
)
<
h
)
{
{
//两圆心之间的距离+直径小于W认为是同一个元器件
lineCircle
.
Add
(
c
);
if
(
c
.
distanceToCircle
(
labelCircle
)
<
w
+
h
*
2
/
3
)
allreadyLabel
.
Add
(
i
);
}
}
}
}
lineCircles
.
Add
(
lineCircle
);
if
(
allreadyLabel
.
Count
==
circles
.
Count
)
{
{
groupCircle
.
Add
(
c
);
break
;
allreadyGroup
.
Add
(
i
);
}
}
}
}
//再按长度划分
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
);
allGroupCircle
.
Add
(
groupCircle
);
if
(
allreadyGroup
.
Count
==
circles
.
Count
)
if
(
lineAllreadyLabel
.
Count
==
lineCircle
.
Count
)
{
{
break
;
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
=
nearbyC
ircles
;
List
<
Circle
>
neighbourCircles
=
c
ircles
;
if
(
oneBlobRadius
>
0
)
if
(
oneBlobRadius
>
0
)
{
{
neighbourCircles
=
ne
arby
Circles
.
Where
(
c
=>
Math
.
Abs
(
c
.
x
-
px
)
<=
2
*
oneBlobRadius
&&
Math
.
Abs
(
c
.
y
-
py
)
<=
2
*
oneBlobRadius
).
ToList
();
neighbourCircles
=
ne
ighbour
Circles
.
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!
Cancel
请
注册
或
登录
后发表评论