Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张士柳
/
eyemLib
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
图表
网络
创建新的问题
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 6e657cd2
由
张士柳
编写于
2021-03-10 17:40:49 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
无
1 个父辈
50f8f9d5
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
72 行增加
和
57 行删除
eyemLib-Sharp/EyemLib.cs
eyemLib/eyemLib.rc
eyemLib/eyemMisc.cpp
eyemLib-Sharp/EyemLib.cs
查看文件 @
6e657cd
...
...
@@ -926,12 +926,12 @@ namespace eyemLib_Sharp
//eyemCountObjectE(image, fileName, ref pNumObj, out tpDstImg);
eyemCountObjectIrregularPartsE
(
image
,
file
.
Replace
(
".png"
,
""
),
"D://批量测试图像模板文件//"
+
file
.
Replace
(
".png"
,
""
)
+
"_tpl.png"
,
0.75
,
ref
pNumObj
,
out
tpDstImg
);
Bitmap
bmp
=
eyemCvtToBitmap
(
tpDstImg
);
//
Bitmap bmp = eyemCvtToBitmap(tpDstImg);
if
(
bmp
!=
null
)
{
bmp
.
Save
(
System
.
Windows
.
Forms
.
Application
.
StartupPath
+
"\\ResOut\\"
+
file
);
}
//
if (bmp != null)
//
{
//
bmp.Save(System.Windows.Forms.Application.StartupPath + "\\ResOut\\" + file);
//
}
////<解码测试
//int ipNum; EyemBarCode* tpResults;
...
...
@@ -1070,7 +1070,6 @@ namespace eyemLib_Sharp
#
region
将
EyemImage
转换成
Bitmap
public
static
Bitmap
eyemCvtToBitmap
(
EyemImage
tpImage
)
{
//统一将图像转换成8位显示
PixelFormat
format
;
switch
(
tpImage
.
iChannels
)
...
...
@@ -1087,17 +1086,9 @@ namespace eyemLib_Sharp
default
:
return
null
;
}
//如果图不是8位的就转成8位显示
if
(
tpImage
.
iDepth
!=
0
)
eyemCvtImageType
(
tpImage
,
"uint8_t"
,
1.0
,
0.0
,
ref
tpImage
);
//所有算法输出结果图均为8位
Bitmap
bitmap
=
new
Bitmap
(
tpImage
.
iWidth
,
tpImage
.
iHeight
,
tpImage
.
iWidth
*
tpImage
.
iChannels
,
format
,
tpImage
.
vpImage
);
BitmapData
data
=
bitmap
.
LockBits
(
new
Rectangle
(
Point
.
Empty
,
new
Size
(
tpImage
.
iWidth
,
tpImage
.
iHeight
)),
ImageLockMode
.
WriteOnly
,
format
);
if
(
format
==
PixelFormat
.
Format8bppIndexed
)
{
ColorPalette
palette
=
bitmap
.
Palette
;
...
...
eyemLib/eyemLib.rc
查看文件 @
6e657cd
此文件类型无法预览
eyemLib/eyemMisc.cpp
查看文件 @
6e657cd
...
...
@@ -66,7 +66,7 @@ static void calcRotateRect(cv::Point2f pt, float t, float length, float width, c
pts
[
3
].
y
=
(
float
)(
2
*
pt
.
y
-
pts
[
1
].
y
);
}
static
cv
::
Mat
getTplMat
(
cv
::
Mat
&
tplMat
,
double
t
)
static
cv
::
Mat
getTplMat
(
cv
::
Mat
&
tplMat
,
double
t
,
int
val
)
{
const
int
tplH
=
tplMat
.
rows
,
tplW
=
tplMat
.
cols
;
...
...
@@ -83,12 +83,12 @@ static cv::Mat getTplMat(cv::Mat &tplMat, double t)
//旋转
cv
::
Mat
tplMatD
;
cv
::
warpAffine
(
tplMat
,
tplMatD
,
matx23f
,
cv
::
Size
((
int
)
width
,
(
int
)
height
),
cv
::
INTER_LINEAR
,
cv
::
BORDER_CONSTANT
,
cv
::
Scalar
(
0
)
);
cv
::
warpAffine
(
tplMat
,
tplMatD
,
matx23f
,
cv
::
Size
((
int
)
width
,
(
int
)
height
),
cv
::
INTER_LINEAR
,
cv
::
BORDER_CONSTANT
,
val
);
return
tplMatD
;
}
static
void
findTrackModel
(
cv
::
Mat
&
image
,
cv
::
Mat
&
tplMat
,
double
t
,
double
trackWidth
,
cv
::
Point2f
*
pts
,
double
&
maxVal
,
cv
::
Point2f
&
maxLoc
)
static
void
findTrackModel
(
cv
::
Mat
&
image
,
cv
::
Mat
&
tplMat
,
double
t
,
double
trackWidth
,
cv
::
Point2f
*
pts
,
int
val
,
double
&
maxVal
,
cv
::
Point2f
&
maxLoc
)
{
//图像尺寸
int
X
=
image
.
cols
,
Y
=
image
.
rows
;
...
...
@@ -102,7 +102,7 @@ static void findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double tra
cv
::
Point2i
(
cv
::
min
(
r
.
boundingRect
().
x
+
r
.
boundingRect
().
width
+
cvRound
(
trackWidth
),
X
),
\
cv
::
min
(
r
.
boundingRect
().
y
+
r
.
boundingRect
().
height
+
cvRound
(
trackWidth
),
Y
)));
cv
::
Mat
yyu
=
getTplMat
(
tplMat
,
t
);
cv
::
Mat
yyu
=
getTplMat
(
tplMat
,
t
,
val
);
//判断待匹配图像是否小于模板图像
if
(
rr
.
width
<
yyu
.
cols
||
rr
.
height
<
yyu
.
rows
)
...
...
@@ -373,10 +373,10 @@ int eyemCountObject(EyemImage tpImage, const char *fileName, double dOffset, int
cv
::
cvtColor
(
src
,
src
,
cv
::
COLOR_BGR2GRAY
);
cv
::
Mat
src8U
;
//环鸿
&佳世达
//环鸿
//src = src(cv::Range(200, src.cols - 70), cv::Range(200, src.rows - 10)).clone();
//
苏州公司
src
=
src
(
cv
::
Range
(
10
,
src
.
cols
-
10
),
cv
::
Range
(
10
,
src
.
rows
-
1
0
)).
clone
();
//
其他设备
src
=
src
(
cv
::
Range
(
20
,
src
.
cols
-
20
),
cv
::
Range
(
20
,
src
.
rows
-
2
0
)).
clone
();
//image size
int
X
=
src
.
cols
,
Y
=
src
.
rows
;
...
...
@@ -1342,10 +1342,10 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, const char *fileName, doubl
if
(
src
.
channels
()
!=
1
)
cv
::
cvtColor
(
src
,
src
,
cv
::
COLOR_BGR2GRAY
);
//环鸿
&佳世达图像裁剪
//环鸿
//src = src(cv::Range(200, src.cols - 70), cv::Range(200, src.rows - 10)).clone();
//
苏州公司&成都纬创
src
=
src
(
cv
::
Range
(
10
,
src
.
cols
-
10
),
cv
::
Range
(
10
,
src
.
rows
-
1
0
)).
clone
();
//
其他设备
src
=
src
(
cv
::
Range
(
20
,
src
.
cols
-
20
),
cv
::
Range
(
20
,
src
.
rows
-
2
0
)).
clone
();
//图像尺寸
int
X
=
src
.
cols
,
Y
=
src
.
rows
;
...
...
@@ -2880,9 +2880,9 @@ int eyemCountObjectE(EyemImage tpImage, const char *fileName, LPSTR *lpszNumObj,
cv
::
Mat
src8U
;
//环鸿
&佳世达
//环鸿
//src = src(cv::Range(200, src.cols - 70), cv::Range(200, src.rows - 10)).clone();
//
苏州公司
//
其他设备
src
=
src
(
cv
::
Range
(
10
,
src
.
cols
-
10
),
cv
::
Range
(
10
,
src
.
rows
-
10
)).
clone
();
//image size
...
...
@@ -3855,17 +3855,20 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
if
(
src
.
channels
()
!=
1
)
cv
::
cvtColor
(
src
,
src
,
cv
::
COLOR_BGR2GRAY
);
//图像裁剪
//环鸿&佳世达
//环鸿
src
=
src
(
cv
::
Range
(
200
,
src
.
cols
-
70
),
cv
::
Range
(
200
,
src
.
rows
-
10
)).
clone
();
//
苏州公司&成都纬创
//
其他设备
//src = src(cv::Range(10, src.cols - 10), cv::Range(10, src.rows - 10)).clone();
//图像尺寸
int
X
=
src
.
cols
,
Y
=
src
.
rows
;
//加载模板
cv
::
Mat
tplMat
=
cv
::
imread
(
tplName
,
-
1
);
//图像尺寸
int
X
=
src
.
cols
,
Y
=
src
.
rows
;
//模板文件不存在
if
(
tplMat
.
empty
())
return
FUNC_CANNOT_CALC
;
//模板尺寸
int
tplWidth
,
tplHeight
;
...
...
@@ -3929,7 +3932,6 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//创建模板图像
//计数图像
cv
::
Mat
lbMat
(
Y
,
X
,
CV_8UC1
,
cv
::
Scalar
(
0
));
...
...
@@ -4024,9 +4026,9 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配(仅处理料盘区域以提高速度)
cv
::
Mat
tplResult0
;
cv
::
matchTemplate
(
srcPrev
(
cv
::
Rect
(
tl
,
br
)),
getTplMat
(
tplMat
,
t
),
tplResult0
,
cv
::
TM_CCOEFF_NORMED
);
cv
::
matchTemplate
(
srcPrev
(
cv
::
Rect
(
tl
,
br
)),
getTplMat
(
tplMat
,
t
,
(
255
-
backThresh
)
),
tplResult0
,
cv
::
TM_CCOEFF_NORMED
);
//分数大于
0.7
才当作元件处理
//分数大于
一定分数
才当作元件处理
tplResult0
=
cv
::
Mat
(
tplResult0
>
dMinScore
);
cv
::
Point
quard
[
4
]{
cv
::
Point
(
tplResult0
.
cols
,
0
),
cv
::
Point
(
0
,
0
),
cv
::
Point
(
0
,
tplResult0
.
rows
),
cv
::
Point
(
tplResult0
.
cols
,
tplResult0
.
rows
)
};
...
...
@@ -4127,7 +4129,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//计算极值
double
maxyyu
;
cv
::
Point2f
trackCentert
;
findTrackModel
(
srcPrev
,
tplMat
,
90
-
(
t
+
180
),
trackWidth
,
pts
,
maxyyu
,
trackCentert
);
findTrackModel
(
srcPrev
,
tplMat
,
90
.0
-
(
t
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
)
,
maxyyu
,
trackCentert
);
//匹配阈值
if
(
maxyyu
>
dMinScore
)
...
...
@@ -4151,7 +4153,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
dChordL
=
2.0
*
startRadius
*
sin
(((
2.0
*
asin
((
cv
::
norm
(
startCenter
-
cv
::
Point2f
((
float
)
ecpectPos
.
x
,
\
(
float
)
ecpectPos
.
y
)))
/
(
2.0
*
startRadius
)))
*
180.0
/
PI
-
dOffset
)
*
PI
/
180.0
/
2.0
);
//
cv::drawMarker(cc, cv::Point(ecpectPos.x, ecpectPos.y), cv::Scalar(0, 0, 255, 255), 0, 10);
cv
::
drawMarker
(
cc
,
cv
::
Point
(
ecpectPos
.
x
,
ecpectPos
.
y
),
cv
::
Scalar
(
0
,
0
,
255
,
255
),
0
,
10
);
}
else
{
//用先前的方式重新计算间距,因为耗时操作不会在这里,加上可以减少耗时但可能不一定准
...
...
@@ -4251,7 +4253,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配
double
maxyyu
;
cv
::
Point2f
maxyyuloc
;
findTrackModel
(
srcPrev
,
tplMat
,
90
-
(
t
+
180
),
trackWidth
,
pts
,
maxyyu
,
maxyyuloc
);
findTrackModel
(
srcPrev
,
tplMat
,
90
.0
-
(
t
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
)
,
maxyyu
,
maxyyuloc
);
//最小匹配结果
if
(
maxyyu
>
0.15
)
...
...
@@ -4259,6 +4261,9 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//存放结果
vParts
.
push_back
(
Track
(
0
,
0
,
maxyyu
,
cv
::
Point
(
cvRound
(
trackCenter
.
x
),
cvRound
(
trackCenter
.
y
)),
std
::
vector
<
cv
::
Point2f
>
()));
}
//测试标记
cv
::
drawMarker
(
cc
,
cv
::
Point
(
cvRound
(
trackCenter
.
x
),
cvRound
(
trackCenter
.
y
)),
cv
::
Scalar
(
0
,
165
,
255
,
255
),
0
,
5
);
}
//如果为0大概率是背景
...
...
@@ -4268,6 +4273,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
trackCenter
=
cv
::
Point2f
((
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
x
,
(
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
y
);
//判断是否超出图像范围
if
(
trackCenter
.
x
<
0
||
trackCenter
.
y
<
0
)
break
;
//理论元件位置
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
);
...
...
@@ -4280,15 +4289,15 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配/更新元件精确位置
double
maxyyu
;
findTrackModel
(
srcPrev
,
tplMat
,
90
-
(
trackAngle
+
180
),
trackWidth
,
pts
,
maxyyu
,
trackCenter
);
findTrackModel
(
srcPrev
,
tplMat
,
90
.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
)
,
maxyyu
,
trackCenter
);
//如果匹配得到的分数过低
if
(
maxyyu
<
0.45
)
{
vParts
.
clear
();
//旋转模板角度[-
2,2
]范围内寻找最佳
//旋转模板角度[-
3,3
]范围内寻找最佳
for
(
double
t
=
-
3.0
;
t
<
3.0
;
t
+=
dMinorStep
*
5.
)
{
findTrackModel
(
srcPrev
,
tplMat
,
90
-
(
trackAngle
+
180
)
+
t
,
trackWidth
,
pts
,
maxyyu
,
trackCenter
);
findTrackModel
(
srcPrev
,
tplMat
,
90
.0
-
(
trackAngle
+
180.0
)
+
t
,
trackWidth
,
pts
,
(
255
-
backThresh
)
,
maxyyu
,
trackCenter
);
//存放结果
vParts
.
push_back
(
Track
(
0
,
0
,
maxyyu
,
cv
::
Point
(
cvRound
(
trackCenter
.
x
),
cvRound
(
trackCenter
.
y
)),
std
::
vector
<
cv
::
Point2f
>
()));
}
...
...
@@ -4310,11 +4319,16 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//计算理论元件区域
calcRotateRect
(
trackCenterT
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
#ifdef _DEBUG
cv
::
Point2f
ptsT
[
4
];
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
ptsT
);
//画出元件区域
//for (int j = 0; j < 4; j++)
//{
// cv::line(cc, pts[j], pts[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
//}
for
(
int
j
=
0
;
j
<
4
;
j
++
)
{
cv
::
line
(
cc
,
ptsT
[
j
],
ptsT
[(
j
+
1
)
%
4
],
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
}
#endif
//判断是否追踪终止
cv
::
RotatedRect
rtt
(
pts
[
0
],
pts
[
1
],
pts
[
2
]);
...
...
@@ -4328,7 +4342,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
found
=
false
;
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
==
255
)
{
//判断
并未终止,重新确定精确
元件位置
//判断
可能并未终止,采用理论位置作为下一个
元件位置
trackCenter
=
trackCenterT
;
//标记为已追踪过
...
...
@@ -4391,7 +4405,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配
double
maxyyu
;
cv
::
Point2f
maxyyuloc
;
findTrackModel
(
srcPrev
,
tplMat
,
90
-
(
t
+
180
),
trackWidth
,
pts
,
maxyyu
,
maxyyuloc
);
findTrackModel
(
srcPrev
,
tplMat
,
90
.0
-
(
t
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
)
,
maxyyu
,
maxyyuloc
);
//最小匹配结果
if
(
maxyyu
>
0.15
)
{
...
...
@@ -4400,7 +4414,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
}
//测试标记
//
cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
cv
::
drawMarker
(
cc
,
cv
::
Point
(
cvRound
(
trackCenter
.
x
),
cvRound
(
trackCenter
.
y
)),
cv
::
Scalar
(
0
,
165
,
255
,
255
),
0
,
5
);
}
if
(
vParts
.
size
()
==
0
)
break
;
...
...
@@ -4408,6 +4422,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
trackCenter
=
cv
::
Point2f
((
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
x
,
(
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
y
);
//判断是否超出图像范围
if
(
trackCenter
.
x
<
0
||
trackCenter
.
y
<
0
)
break
;
//理论元件区域
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
);
...
...
@@ -4420,16 +4438,15 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//模板匹配/更新元件精确位置
double
maxyyu
;
findTrackModel
(
srcPrev
,
tplMat
,
90
-
(
trackAngle
+
180
),
trackWidth
,
pts
,
maxyyu
,
trackCenter
);
findTrackModel
(
srcPrev
,
tplMat
,
90
.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
)
,
maxyyu
,
trackCenter
);
//如果匹配得到的分数过低
if
(
maxyyu
<
0.45
)
{
vParts
.
clear
();
//旋转模板角度[-
2,2
]范围内寻找最佳
//旋转模板角度[-
3,3
]范围内寻找最佳
for
(
double
t
=
-
3.0
;
t
<
3.0
;
t
+=
dMinorStep
*
5.
)
{
findTrackModel
(
srcPrev
,
tplMat
,
90
-
(
trackAngle
+
180
)
+
t
,
trackWidth
,
pts
,
maxyyu
,
trackCenter
);
findTrackModel
(
srcPrev
,
tplMat
,
90
.0
-
(
trackAngle
+
180.0
)
+
t
,
trackWidth
,
pts
,
(
255
-
backThresh
)
,
maxyyu
,
trackCenter
);
//存放结果
vParts
.
push_back
(
Track
(
0
,
0
,
maxyyu
,
cv
::
Point
(
cvRound
(
trackCenter
.
x
),
cvRound
(
trackCenter
.
y
)),
std
::
vector
<
cv
::
Point2f
>
()));
}
...
...
@@ -4438,6 +4455,8 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//更新最接近的
trackCenter
=
cv
::
Point2f
(
vParts
[
0
].
Pos
.
x
,
vParts
[
0
].
Pos
.
y
);
}
if
(
trackCenter
.
x
==
1358
&&
trackCenter
.
y
==
1568
)
std
::
cout
<<
""
<<
std
::
endl
;
//更新扫描半径
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
...
...
@@ -4451,11 +4470,16 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//计算理论元件位置
calcRotateRect
(
trackCenterT
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
#ifdef _DEBUG
cv
::
Point2f
ptsT
[
4
];
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
ptsT
);
//画出元件区域
//for (int j = 0; j < 4; j++)
//{
// cv::line(cc, pts[j], pts[(j + 1) % 4], cv::Scalar(0, 0, 255, 255), 1);
//}
for
(
int
j
=
0
;
j
<
4
;
j
++
)
{
cv
::
line
(
cc
,
ptsT
[
j
],
ptsT
[(
j
+
1
)
%
4
],
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
}
#endif
//判断是否追踪终止
cv
::
RotatedRect
rtt
(
pts
[
0
],
pts
[
1
],
pts
[
2
]);
...
...
@@ -4470,7 +4494,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
found
=
false
;
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
==
255
)
{
//判断
并未终止,重新确定精确
元件位置
//判断
可能并未终止,采用理论位置作为下一个
元件位置
trackCenter
=
trackCenterT
;
//标记为已追踪过
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论