Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张士柳
/
eyemLib
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
图表
网络
创建新的问题
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit c13fd1b2
由
张士柳
编写于
2021-12-14 17:01:35 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
无
1 个父辈
d448a6d4
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
106 行增加
和
51 行删除
eyemLib-Sharp/EyemLib.cs
eyemLib/eyemLib.rc
eyemLib/eyemMisc.cpp
eyemLib-Sharp/EyemLib.cs
查看文件 @
c13fd1b
...
...
@@ -1301,7 +1301,7 @@ namespace eyemLib_Sharp
//tpHsvModel.dpRangeL = new double[] { 100, 43, 46 }; tpHsvModel.dpRangeU = new double[] { 124, 255, 255 };
//tpHsvModel.dpRangeLExt = new double[] { 0, 0, 0 }; tpHsvModel.dpRangeUExt = new double[] { 0, 0, 0 };
//eyemClassifier(image);
//
flag = eyemLibImpl(image, out tpDstImg);
flag
=
eyemLibImpl
(
image
,
out
tpDstImg
);
//float[] fFeatures = new float[512];
//eyemExtractWithONNX(image, fFeatures);
//string ftrs = string.Join(" ", fFeatures).Trim();
...
...
@@ -1322,9 +1322,9 @@ namespace eyemLib_Sharp
// bitmap.Save("D:\\ResOut\\" + file);
//}
//eyemImageFree(ref tpMatchImg);
//
eyemImageFree(ref tpDstImg);
//
eyemImageFree(ref image);
//
return;
eyemImageFree
(
ref
tpDstImg
);
eyemImageFree
(
ref
image
);
return
;
//EyemImage templ, search;
//flag = eyemImageRead("D://批量测试图像//template.png", -1, out templ);
...
...
@@ -1540,10 +1540,10 @@ namespace eyemLib_Sharp
#
endregion
EyemRect
tpRoi
=
new
EyemRect
();
tpRoi
.
iXs
=
200
;
tpRoi
.
iYs
=
20
0
;
tpRoi
.
iWidth
=
image
.
iWidth
-
4
00
;
tpRoi
.
iHeight
=
image
.
iHeight
-
4
00
;
flag
=
eyemAchvMatchMat
(
image
,
tpRoi
,
out
tpDstImg
);
tpRoi
.
iXs
=
50
;
tpRoi
.
iYs
=
5
0
;
tpRoi
.
iWidth
=
image
.
iWidth
-
1
00
;
tpRoi
.
iHeight
=
image
.
iHeight
-
1
00
;
//
flag = eyemAchvMatchMat(image, tpRoi, out tpDstImg);
//EyemOcsDXYR tpCircle = new EyemOcsDXYR();
//EyemRect limRoi = new EyemRect();
//limRoi.iXs = 222; limRoi.iYs = 222;
...
...
@@ -1558,7 +1558,7 @@ namespace eyemLib_Sharp
//}
//eyemImageFree(ref tpDstImg);
//eyemImageFree(ref image);
return
;
//
return;
//获取用于制作模板的图像
//flag = eyemAchvTemplateImage(image, tpRoi, out tpDstImg);
...
...
@@ -1618,13 +1618,12 @@ namespace eyemLib_Sharp
int
[]
ipReelNum
=
new
int
[
4
];
//"IP_SMALL_PARTS","IP_LARGE_PARTS","IP_LONG_PARTS",,IP_SQUARE_PARTS
//eyemCountObject(image, tpRoi, file.Replace(".png", ""), ipReelNum, out tpDstImg);
//eyemCountObjectIrregularParts(image, tpRoi, file.Replace(".png", ""), "IP_LARGE_PARTS
", ipReelNum, out tpDstImg);
eyemCountObjectE
(
image
,
tpRoi
,
file
.
Replace
(
".png"
,
""
),
ipReelNum
,
out
tpDstImg
);
eyemCountObjectIrregularParts
(
image
,
tpRoi
,
file
.
Replace
(
".png"
,
""
),
"
"
,
ipReelNum
,
out
tpDstImg
);
//
eyemCountObjectE(image, tpRoi, file.Replace(".png", ""), ipReelNum, out tpDstImg);
//eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), "D:\\模板文件\\" + "20210825095751-1.tpl", hModelID, ipReelNum, out tpDstImg);
//移除模板
//flag = eyemRemoveModelByName(hModelID, "D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl");
Bitmap
bitmap
=
eyemCvtToBitmap
(
tpDstImg
);
if
(
bitmap
!=
null
)
{
...
...
eyemLib/eyemLib.rc
查看文件 @
c13fd1b
此文件类型无法预览
eyemLib/eyemMisc.cpp
查看文件 @
c13fd1b
...
...
@@ -4128,7 +4128,7 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
else
if
(
strcmp
(
ccSubType
,
"IP_SQUARE_PARTS"
)
==
0
)
{
//
测试用,
对于个别元件需要稍微膨胀一下
//对于个别元件需要稍微膨胀一下
cv
::
morphologyEx
(
srcPrev
,
srcPrev
,
cv
::
MORPH_DILATE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
2
,
2
)));
//二值化
cv
::
threshold
(
srcPrev
,
binary
,
0
,
255
,
cv
::
THRESH_BINARY
|
cv
::
THRESH_OTSU
);
...
...
@@ -4146,13 +4146,15 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
}
cv
::
threshold
(
srcPrev
,
binary
,
Otsu
(
hist_
),
255
,
cv
::
THRESH_BINARY
);
//主要用于计算数量
cv
::
Mat
binary4Count
=
binary
.
clone
();
//计算元件大小
cv
::
Mat
m1
,
m2
,
m3
;
int
nccomps
=
cv
::
connectedComponentsWithStats
(
binary
,
m1
,
m2
,
m3
);
std
::
vector
<
uchar
>
colors0
(
nccomps
+
1
,
0
);
for
(
int
i
=
1
;
i
<
nccomps
;
i
++
)
{
colors0
[
i
]
=
255
;
if
((((
int
*
)
m2
.
data
)[(
cv
::
CC_STAT_AREA
)
+
(
i
)
*
m2
.
cols
]
<=
2
1
)
||
m2
.
ptr
<
int
>
(
i
)[
cv
::
CC_STAT_WIDTH
]
*
m2
.
ptr
<
int
>
(
i
)[
cv
::
CC_STAT_HEIGHT
]
>
400000
)
//经验值
if
((((
int
*
)
m2
.
data
)[(
cv
::
CC_STAT_AREA
)
+
(
i
)
*
m2
.
cols
]
<=
3
1
)
||
m2
.
ptr
<
int
>
(
i
)[
cv
::
CC_STAT_WIDTH
]
*
m2
.
ptr
<
int
>
(
i
)[
cv
::
CC_STAT_HEIGHT
]
>
400000
)
//经验值
{
colors0
[
i
]
=
0
;
}
...
...
@@ -4212,18 +4214,76 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
std
::
sort
(
tVector
.
begin
(),
tVector
.
end
(),
std
::
greater
<
tMap
>
());
if
(
tVector
.
size
()
<
2
)
{
return
false
;
return
FUNC_CANNOT_CALC
;
}
//单个元件面积
int
sinPartSize
=
cvRound
((
tVector
[
0
].
Key
+
tVector
[
1
].
Key
)
/
2.
);
//根据单个元件面积过滤
nccomps
=
cv
::
connectedComponentsWithStats
(
binary4Count
,
m1
,
m2
,
m3
);
std
::
vector
<
uchar
>
colors
(
nccomps
+
1
,
0
);
for
(
int
i
=
1
;
i
<
nccomps
;
i
++
)
{
colors
[
i
]
=
255
;
if
((((
int
*
)
m2
.
data
)[(
cv
::
CC_STAT_AREA
)
+
(
i
)
*
m2
.
cols
]
>
=
1.35
*
sinPartSize
)
||
(((
int
*
)
m2
.
data
)[(
cv
::
CC_STAT_AREA
)
+
(
i
)
*
m2
.
cols
]
<
0.45
*
sinPartSize
))
//经验值
if
((((
int
*
)
m2
.
data
)[(
cv
::
CC_STAT_AREA
)
+
(
i
)
*
m2
.
cols
]
>
400000
)
||
(((
int
*
)
m2
.
data
)[(
cv
::
CC_STAT_AREA
)
+
(
i
)
*
m2
.
cols
]
<
0.45
*
sinPartSize
))
//经验值
{
colors
[
i
]
=
0
;
}
}
//先过滤不符合面积的
cv
::
parallel_for_
(
cv
::
Range
(
0
,
Y
),
[
&
](
const
cv
::
Range
&
range
)
->
void
{
for
(
int
y
=
range
.
start
;
y
<
range
.
end
;
y
++
)
{
for
(
int
x
=
0
;
x
<
X
;
x
++
)
{
int
label
=
((
int
*
)
m1
.
data
)[(
x
)
+
(
y
)
*
m1
.
cols
];
CV_Assert
(
0
<=
label
&&
label
<=
nccomps
);
(
binary4Count
.
data
)[(
x
)
+
(
y
)
*
X
]
=
colors0
[
label
];
}
}
});
//膨胀
cv
::
morphologyEx
(
binary4Count
,
binary4Count
,
cv
::
MORPH_CLOSE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
3
,
3
)));
//计数
nccomps
=
cv
::
connectedComponentsWithStats
(
binary4Count
,
m1
,
m2
,
m3
);
//考虑重新计算元件尺寸
std
::
vector
<
int
>
vHist2
(
nccomps
);
for
(
int
y
=
0
;
y
<
Y
;
y
++
)
{
int
*
uPtr
=
(
int
*
)
m1
.
data
+
y
*
X
;
for
(
int
x
=
0
;
x
<
X
;
x
++
,
uPtr
++
)
{
vHist2
[
*
uPtr
]
++
;
}
}
//统计面积个数
std
::
map
<
int
,
int
>
cAreaMap2
;
for
(
const
auto
&
v
:
vHist2
)
{
std
::
map
<
int
,
int
>::
iterator
it
=
cAreaMap2
.
find
(
v
);
if
(
it
!=
cAreaMap2
.
end
())
{
it
->
second
++
;
continue
;
}
else
{
cAreaMap2
.
insert
(
std
::
make_pair
(
v
,
1
));
};
}
//获得单个元器件面积(准确性待测试,假定不粘连占大多数!)
std
::
vector
<
tMap
>
tVector2
;
std
::
map
<
int
,
int
>::
iterator
it2
;
for
(
it2
=
cAreaMap2
.
begin
();
it2
!=
cAreaMap2
.
end
();
it2
++
)
{
tVector2
.
push_back
(
tMap
(
it2
->
first
,
it2
->
second
));
}
std
::
sort
(
tVector2
.
begin
(),
tVector2
.
end
(),
std
::
greater
<
tMap
>
());
if
(
tVector2
.
size
()
<
2
)
{
return
FUNC_CANNOT_CALC
;
}
//单个元件面积
sinPartSize
=
cvRound
((
tVector2
[
0
].
Key
+
tVector2
[
1
].
Key
)
/
2.
);
//判断当数量过少时候当前方法判断的单个元件面积可能是错的
if
(
nccomps
<
35
)
{
//判断面积
sinPartSize
=
tVector2
[
tVector2
.
size
()
/
3
].
Key
;
}
std
::
vector
<
int
>
trayCount
(
nccomps
+
1
,
0
);
Palete
pal
;
unsigned
int
colorCount
=
0
;
...
...
@@ -4248,10 +4308,10 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
for
(
int
x
=
0
;
x
<
X
;
x
++
)
{
int
label
=
((
int
*
)
m1
.
data
)[(
x
)
+
(
y
)
*
m1
.
cols
];
CV_Assert
(
0
<=
label
&&
label
<=
nccomps
);
if
(
binary
.
ptr
<
uint8_t
>
(
y
)[
x
])
{
if
(
binary
4Count
.
ptr
<
uint8_t
>
(
y
)[
x
])
{
cc
.
ptr
<
cv
::
Vec4b
>
(
y
)[
x
]
=
cv
::
Vec4b
((
uchar
)
pal
[
label
].
val
[
0
],
(
uchar
)
pal
[
label
].
val
[
1
],
(
uchar
)
pal
[
label
].
val
[
2
],
255
);
}
binary
.
ptr
<
uint8_t
>
(
y
)[
x
]
=
colors
[
label
];
binary
4Count
.
ptr
<
uint8_t
>
(
y
)[
x
]
=
colors
[
label
];
}
}
});
...
...
@@ -4417,7 +4477,7 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
else
{
//判断为散料
cv
::
threshold
(
srcPrev
,
binary
,
0
,
255
,
cv
::
THRESH_BINARY
|
cv
::
THRESH_OTSU
);
cv
::
morphologyEx
(
binary
,
binary
,
cv
::
MORPH_DILATE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
75
,
7
5
)));
cv
::
morphologyEx
(
binary
,
binary
,
cv
::
MORPH_DILATE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
25
,
2
5
)));
//计算直方图
int
hist
[
256
];
for
(
int
y
=
0
;
y
<
256
;
y
++
)
hist
[
y
]
=
0
;
...
...
@@ -4432,17 +4492,14 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
}
}
}
cv
::
threshold
(
srcPrev
,
binary
,
Otsu
(
hist
),
255
,
cv
::
THRESH_BINARY
);
cv
::
threshold
(
srcPrev
,
binary
,
Otsu
(
hist
)
+
5
,
255
,
cv
::
THRESH_BINARY
);
std
::
vector
<
std
::
vector
<
cv
::
Point
>>
contours
,
contourFilter
;
//连接在一起(散料用)
cv
::
Mat
binaryEx
;
cv
::
morphologyEx
(
binary
,
binaryEx
,
cv
::
MORPH_DILATE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
75
,
75
)));
//掩膜
cv
::
Mat
mask
(
Y
,
X
,
CV_8UC1
,
cv
::
Scalar
(
0
));
cv
::
findContours
(
binaryEx
,
contours
,
cv
::
RETR_EXTERNAL
,
cv
::
CHAIN_APPROX_NONE
);
for
(
int
i
=
0
;
i
<
contours
.
size
();
i
++
)
{
...
...
@@ -7024,18 +7081,6 @@ int eyemAchvMatchMat(EyemImage tpImage, EyemRect tpRoi, EyemImage *tpDstImg)
return
FUNC_CANNOT_CALC
;
}
cv
::
Mat
srcPrev
,
srcPrevB
;
cv
::
bitwise_not
(
trays
[
0
].
Tray
,
srcPrev
);
//备份
srcPrevB
=
srcPrev
.
clone
();
//二值化可以分别放在两个算法里
cv
::
Mat
sinParts
;
cv
::
threshold
(
srcPrev
,
sinParts
,
(
255
-
trays
[
0
].
dBackThresh
),
255
,
cv
::
THRESH_BINARY
);
//判断元件尺寸
int
sinPartSize
;
bool
useTrackMethod
=
checkSize
(
srcPrev
,
sinParts
,
sinPartSize
);
//连在一起
cv
::
morphologyEx
(
sinParts
,
sinParts
,
cv
::
MORPH_DILATE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
45
,
45
)));
//间隔采样,避免采样数量过大
cv
::
Point
start
=
cv
::
Point
((
int
)
trays
[
0
].
Center
.
x
,
(
int
)
trays
[
0
].
Center
.
y
),
end
=
cv
::
Point
((
int
)
trays
[
0
].
Center
.
x
,
0
);
//画中心
...
...
@@ -7055,7 +7100,7 @@ int eyemAchvMatchMat(EyemImage tpImage, EyemRect tpRoi, EyemImage *tpDstImg)
cv
::
line
(
linesample
,
nstart
,
nend
,
cv
::
Scalar
(
255
),
1
);
cv
::
Mat
sampleLine
;
cv
::
bitwise_and
(
linesample
,
sinParts
,
sampleLine
);
cv
::
bitwise_and
(
linesample
,
binary
,
sampleLine
);
std
::
vector
<
cv
::
Point
>
idx
;
cv
::
findNonZero
(
sampleLine
,
idx
);
...
...
@@ -8151,19 +8196,6 @@ int eyemTrainImageSampler(EyemImage tpImage, int iSize, const char *ccClassName,
return
FUNC_CANNOT_CALC
;
}
cv
::
Mat
srcPrev
,
srcPrevB
;
cv
::
bitwise_not
(
trays
[
0
].
Tray
,
srcPrev
);
//备份
srcPrevB
=
srcPrev
.
clone
();
//二值化可以分别放在两个算法里
cv
::
Mat
sinParts
;
cv
::
threshold
(
srcPrev
,
sinParts
,
(
255
-
trays
[
0
].
dBackThresh
),
255
,
cv
::
THRESH_BINARY
);
//判断元件尺寸
int
sinPartSize
;
bool
useTrackMethod
=
checkSize
(
srcPrev
,
sinParts
,
sinPartSize
);
//连在一起
cv
::
morphologyEx
(
sinParts
,
sinParts
,
cv
::
MORPH_DILATE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
45
,
45
)));
//间隔采样,避免采样数量过大
cv
::
Point
start
=
cv
::
Point
((
int
)
trays
[
0
].
Center
.
x
,
(
int
)
trays
[
0
].
Center
.
y
),
end
=
cv
::
Point
((
int
)
trays
[
0
].
Center
.
x
,
0
);
//画中心
...
...
@@ -8183,7 +8215,7 @@ int eyemTrainImageSampler(EyemImage tpImage, int iSize, const char *ccClassName,
cv
::
line
(
linesample
,
nstart
,
nend
,
cv
::
Scalar
(
255
),
1
);
cv
::
Mat
sampleLine
;
cv
::
bitwise_and
(
linesample
,
sinParts
,
sampleLine
);
cv
::
bitwise_and
(
linesample
,
binary
,
sampleLine
);
std
::
vector
<
cv
::
Point
>
idx
;
cv
::
findNonZero
(
sampleLine
,
idx
);
...
...
@@ -8278,10 +8310,34 @@ int eyemLibImpl(EyemImage tpImage, EyemImage *tpDstImg)
{
CV_Assert
(
NULL
!=
tpImage
.
vpImage
);
cv
::
Mat
image
=
cv
::
Mat
(
tpImage
.
iHeight
,
tpImage
.
iWidth
,
MAKETYPE
(
tpImage
.
iDepth
,
tpImage
.
iChannels
),
tpImage
.
vpImage
).
clone
();
if
(
image
.
empty
())
return
FUNC_IMAGE_NOT_EXIST
;
//图像尺寸
int
X
=
image
.
cols
,
Y
=
image
.
rows
;
//用于去除黑色坏点干扰
cv
::
Mat
medBlur
;
cv
::
medianBlur
(
image
,
medBlur
,
3
);
//去除局部量斑影响(默认亮斑尺寸不会大于15个像素)
cv
::
morphologyEx
(
medBlur
,
medBlur
,
cv
::
MORPH_ERODE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
15
,
15
)));
//图像增强
double
min
,
max
;
cv
::
minMaxLoc
(
medBlur
,
&
min
,
&
max
,
NULL
);
image
.
convertTo
(
image
,
CV_64FC1
);
image
-=
min
;
image
/=
(
max
-
min
);
image
*=
65535
;
image
.
convertTo
(
image
,
CV_16UC1
);
cv
::
Mat
image8U
;
image
.
convertTo
(
image8U
,
CV_8UC1
,
1
/
255.
);
cv
::
cvtColor
(
image8U
,
image8U
,
cv
::
COLOR_BGR2GRAY
);
cv
::
Mat
eqhist
;
cv
::
equalizeHist
(
image8U
,
eqhist
);
cv
::
imwrite
(
"0.png"
,
image8U
);
return
FUNC_OK
;
#pragma region
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论