Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张士柳
/
eyemLib
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
图表
网络
创建新的问题
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 01b04fdd
由
张士柳
编写于
2021-04-07 17:27:45 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
无
1 个父辈
5d801ec0
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
88 行增加
和
7 行删除
eyemLib-Sharp/EyemLib.cs
eyemLib/eyemLib.h
eyemLib/eyemMisc.cpp
eyemLib-Sharp/EyemLib.cs
查看文件 @
01b04fd
...
...
@@ -999,9 +999,9 @@ namespace eyemLib_Sharp
EyemRect
tpRoi
=
new
EyemRect
();
tpRoi
.
iXs
=
50
;
tpRoi
.
iYs
=
5
0
;
tpRoi
.
iWidth
=
image
.
iWidth
-
1
00
;
tpRoi
.
iHeight
=
image
.
iHeight
-
1
00
;
tpRoi
.
iXs
=
200
;
tpRoi
.
iYs
=
20
0
;
tpRoi
.
iWidth
=
image
.
iWidth
-
4
00
;
tpRoi
.
iHeight
=
image
.
iHeight
-
4
00
;
//
string
pNumObj
=
""
;
...
...
eyemLib/eyemLib.h
查看文件 @
01b04fd
...
...
@@ -859,6 +859,7 @@ extern "C" {
EXPORTS
int
eyemReleaseModel
(
IntPtr
&
hModelID
);
EXPORTS
int
eyemTrackFeature
(
EyemImage
tpPrevImg
,
EyemImage
tpNextImg
,
EyemRect3
*
tpRois
,
int
iRoiNum
,
int
*
ipResults
,
EyemImage
*
tpDstImg
);
EXPORTS
int
eyemAOIForTSAV
(
EyemImage
tpRefImg
,
EyemImage
tpNextImg
,
EyemRect3
*
tpRois
,
int
iRoiNum
);
EXPORTS
int
eyemAllMethodTest
(
EyemImage
tpImage
);
#ifdef __cplusplus
}
...
...
eyemLib/eyemMisc.cpp
查看文件 @
01b04fd
...
...
@@ -4332,10 +4332,61 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//计数图像
cv
::
Mat
lbMat
(
Y
,
X
,
CV_8UC1
,
cv
::
Scalar
(
0
));
//测试用,根据模板尺寸顶帽处理,去掉中间料盘
int
minPart
=
cv
::
min
(
tplWidth
,
tplHeight
);
cv
::
Mat
srcPrevWithMask
(
Y
,
X
,
CV_8UC1
);
srcPrev
.
copyTo
(
srcPrevWithMask
);
if
(
minPart
<
12
)
{
cv
::
Mat
srcPrevEx
;
cv
::
morphologyEx
(
srcPrev
,
srcPrevEx
,
cv
::
MORPH_TOPHAT
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
minPart
,
minPart
)));
//
cv
::
Mat
srcPrevExb
;
cv
::
threshold
(
srcPrevEx
,
srcPrevExb
,
0
,
255
,
cv
::
THRESH_BINARY
|
cv
::
THRESH_OTSU
);
//膨胀
cv
::
morphologyEx
(
srcPrevExb
,
srcPrevExb
,
cv
::
MORPH_DILATE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
minPart
,
minPart
)));
//去掉盘本身的影响
srcPrevWithMask
=
cv
::
Scalar
(
255
-
backT
);
srcPrev
.
copyTo
(
srcPrevWithMask
,
srcPrevExb
);
}
//使用大料算法(模板匹配方式)
cv
::
threshold
(
srcPrev
,
binary
,
0
,
255
,
cv
::
THRESH_BINARY
|
cv
::
THRESH_OTSU
);
//去掉小于5个像素的干扰
cv
::
Mat
labels0
,
stats0
,
centroids0
;
int
nccomps0
=
cv
::
connectedComponentsWithStats
(
binary
,
labels0
,
stats0
,
centroids0
,
4
);
//过滤连通域面积及长/宽比例不符合的,允许50%误差
std
::
vector
<
uchar
>
colors0
(
nccomps0
+
1
,
0
);
for
(
int
i
=
1
;
i
<
nccomps0
;
i
++
)
{
colors0
[
i
]
=
255
;
if
((
stats0
.
ptr
<
int
>
(
i
)[
cv
::
CC_STAT_AREA
]
<
10
))
{
colors0
[
i
]
=
0
;
}
}
//过滤
cv
::
parallel_for_
(
cv
::
Range
(
0
,
Y
),
[
&
](
const
cv
::
Range
&
range
)
->
void
{
for
(
int
y
=
range
.
start
;
y
<
range
.
end
;
y
++
)
{
uint8_t
*
ptrRow
=
binary
.
ptr
<
uint8_t
>
(
y
);
for
(
int
x
=
0
;
x
<
X
;
x
++
)
{
int
label
=
labels0
.
ptr
<
int
>
(
y
)[
x
];
CV_Assert
(
0
<=
label
&&
label
<=
nccomps0
);
ptrRow
[
x
]
=
colors0
[
label
];
}
}
});
cv
::
Mat
srcPrevEx0
;
//连接
cv
::
morphologyEx
(
binary
,
srcPrevEx0
,
cv
::
MORPH_CLOSE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
95
,
95
)));
//定位料盘中心
...
...
@@ -4376,6 +4427,21 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
}
}
//面积小于50000判断不是中心
if
(
contourMaxArea
<
50000
)
{
cv
::
findContours
(
image
,
contours
,
cv
::
RETR_EXTERNAL
,
cv
::
CHAIN_APPROX_NONE
);
//最大轮廓
for
(
int
i
=
1
;
i
<
contours
.
size
();
i
++
)
{
double
contourArea
=
cv
::
contourArea
(
contours
[
i
]);
if
(
contourArea
>
contourMaxArea
)
{
contourMax
=
contours
[
i
];
contourMaxArea
=
contourArea
;
}
}
}
//质心
cv
::
Moments
mu
=
cv
::
moments
(
contourMax
);
cv
::
Point2f
reelCenter
(
float
(
mu
.
m10
/
mu
.
m00
),
float
(
mu
.
m01
/
mu
.
m00
));
...
...
@@ -4399,6 +4465,9 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
}
}
//去掉料盘中心
cv
::
circle
(
srcPrevWithMask
,
cv
::
Point
(
reelCenter
),
150
,
cv
::
Scalar
(
255
-
backT
),
-
1
);
cv
::
Rect
rec
=
cv
::
boundingRect
(
contourMax
);
//顶点坐标
...
...
@@ -4421,7 +4490,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
{
//模板匹配(仅处理料盘区域以提高速度)
cv
::
Mat
tplResult0
;
cv
::
matchTemplate
(
srcPrev
(
cv
::
Rect
(
tl
,
br
)),
getTplMat
(
tplMat
,
icvDirections
[
tpl
],
(
255
-
backT
)),
tplResult0
,
cv
::
TM_CCOEFF_NORMED
);
cv
::
matchTemplate
(
srcPrev
WithMask
(
cv
::
Rect
(
tl
,
br
)),
getTplMat
(
tplMat
,
icvDirections
[
tpl
],
(
255
-
backT
)),
tplResult0
,
cv
::
TM_CCOEFF_NORMED
);
//分数大于一定分数才当作元件处理
tplResult0
=
cv
::
Mat
(
tplResult0
>
matchDeg
);
...
...
@@ -4454,10 +4523,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//旋转图像,计算另外四个方向的起点
float
matx
[
6
];
cv
::
Mat
srcPrev45
=
getTrackMat
(
srcPrev
(
cv
::
Rect
(
tl
,
br
)),
45.0
,
0
,
matx
);
cv
::
Mat
srcPrev45
=
getTrackMat
(
srcPrev
WithMask
(
cv
::
Rect
(
tl
,
br
)),
45.0
,
0
,
matx
);
cv
::
Mat
showMat2
;
cv
::
cvtColor
(
srcPrev
(
cv
::
Rect
(
tl
,
br
)),
showMat2
,
cv
::
COLOR_GRAY2BGRA
);
/*
cv::Mat showMat2;
cv::cvtColor(srcPrev(cv::Rect(tl, br)), showMat2, cv::COLOR_GRAY2BGRA);
*/
cv
::
parallel_for_
(
cv
::
Range
(
0
,
4
),
[
&
](
const
cv
::
Range
&
range
)
->
void
{
for
(
int
tpl
=
range
.
start
;
tpl
<
range
.
end
;
tpl
++
)
...
...
@@ -5800,4 +5869,15 @@ int eyemAOIForTSAV(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois, i
cv
::
waitKey
(
1
);
return
FUNC_OK
;
}
int
eyemAllMethodTest
(
EyemImage
tpImage
)
{
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
;
return
FUNC_OK
;
}
\ No newline at end of file
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论