Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张士柳
/
eyemLib
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
图表
网络
创建新的问题
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 9e0af8f7
由
张士柳
编写于
2021-03-15 17:11:18 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
无
1 个父辈
168a9ae6
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
169 行增加
和
44 行删除
eyemLib/eyemLib.h
eyemLib/eyemMisc.cpp
eyemLib/eyemLib.h
查看文件 @
9e0af8f
...
@@ -836,7 +836,9 @@ extern "C" {
...
@@ -836,7 +836,9 @@ extern "C" {
EXPORTS
int
eyemCountObjectE
(
EyemImage
tpImage
,
const
char
*
fileName
,
LPSTR
*
lpszNumObj
,
EyemImage
*
tpDstImg
);
EXPORTS
int
eyemCountObjectE
(
EyemImage
tpImage
,
const
char
*
fileName
,
LPSTR
*
lpszNumObj
,
EyemImage
*
tpDstImg
);
EXPORTS
int
eyemCountObjectIrregularParts
(
EyemImage
tpImage
,
const
char
*
fileName
,
double
dOffset
,
const
char
*
ccSubType
,
int
iMaxArea
,
int
iWinSize
,
LPSTR
*
lpszNumObj
,
EyemImage
*
tpDstImg
);
EXPORTS
int
eyemCountObjectIrregularParts
(
EyemImage
tpImage
,
const
char
*
fileName
,
double
dOffset
,
const
char
*
ccSubType
,
int
iMaxArea
,
int
iWinSize
,
LPSTR
*
lpszNumObj
,
EyemImage
*
tpDstImg
);
EXPORTS
int
eyemCountObjectIrregularPartsE
(
EyemImage
tpImage
,
const
char
*
fileName
,
const
char
*
ccTplName
,
double
dMinScore
,
LPSTR
*
lpszNumObj
,
EyemImage
*
tpDstImg
);
EXPORTS
int
eyemCountObjectIrregularPartsE
(
EyemImage
tpImage
,
const
char
*
fileName
,
const
char
*
ccTplName
,
double
dMinScore
,
LPSTR
*
lpszNumObj
,
EyemImage
*
tpDstImg
);
EXPORTS
int
eyemCreateTemplateModel
(
EyemImage
tpImage
,
EyemRect
tpRoi
,
const
char
*
ccTplName
);
EXPORTS
int
eyemCalcTemplateImage
(
EyemImage
tpImage
,
EyemImage
*
tpDstImg
);
EXPORTS
int
eyemCreateTemplateModel
(
EyemImage
tpImage
,
EyemRect
tpRoi
,
double
dMinScore
,
const
char
*
ccTplName
);
EXPORTS
int
eyemMatchTemplateModel
(
EyemImage
tpImage
,
const
char
*
ccTplNames
,
LPSTR
*
lpszTplName
);
EXPORTS
int
eyemTrackFeature
(
EyemImage
tpPrevImg
,
EyemImage
tpNextImg
,
EyemRect3
*
tpRois
,
int
iRoiNum
,
int
*
ipResults
);
EXPORTS
int
eyemTrackFeature
(
EyemImage
tpPrevImg
,
EyemImage
tpNextImg
,
EyemRect3
*
tpRois
,
int
iRoiNum
,
int
*
ipResults
);
EXPORTS
int
eyemAOIForTSAV
(
EyemImage
tpRefImg
,
EyemImage
tpNextImg
,
EyemRect3
*
tpRois
,
int
iRoiNum
);
EXPORTS
int
eyemAOIForTSAV
(
EyemImage
tpRefImg
,
EyemImage
tpNextImg
,
EyemRect3
*
tpRois
,
int
iRoiNum
);
...
...
eyemLib/eyemMisc.cpp
查看文件 @
9e0af8f
...
@@ -129,14 +129,27 @@ static bool findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double tra
...
@@ -129,14 +129,27 @@ static bool 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
::
Point2i
(
cv
::
min
(
r
.
boundingRect
().
x
+
r
.
boundingRect
().
width
+
cvRound
(
trackWidth
),
X
),
\
cv
::
min
(
r
.
boundingRect
().
y
+
r
.
boundingRect
().
height
+
cvRound
(
trackWidth
),
Y
)));
cv
::
min
(
r
.
boundingRect
().
y
+
r
.
boundingRect
().
height
+
cvRound
(
trackWidth
),
Y
)));
cv
::
Mat
yuuc
=
image
(
rr
&
cv
::
Rect
(
0
,
0
,
X
,
Y
));
float
matx
[
6
];
float
matx
[
6
];
cv
::
Mat
tty
=
getTrackMat
(
yuuc
,
-
t
,
val
,
matx
);
cv
::
Mat
trackMat
=
getTrackMat
(
image
(
rr
&
cv
::
Rect
(
0
,
0
,
X
,
Y
)).
clone
(),
-
t
,
val
,
matx
);
if
(
trackMat
.
cols
<=
(
tplMat
.
cols
-
1
)
||
trackMat
.
rows
<=
(
tplMat
.
rows
-
1
))
return
true
;
const
int
icvTemplateMatchModes
[
2
]
=
{
cv
::
TM_SQDIFF_NORMED
,
cv
::
TM_CCOEFF_NORMED
};
//计算匹配位置
//计算匹配位置
cv
::
Mat
tplResult0
;
std
::
vector
<
cv
::
Mat
>
tplResults
(
6
);
cv
::
matchTemplate
(
tty
,
tplMat
,
tplResult0
,
cv
::
TM_CCOEFF_NORMED
);
cv
::
parallel_for_
(
cv
::
Range
(
0
,
2
),
[
&
](
const
cv
::
Range
&
range
)
->
void
{
for
(
int
m
=
range
.
start
;
m
<
range
.
end
;
m
++
)
{
cv
::
Mat
tplResult
;
cv
::
matchTemplate
(
trackMat
,
tplMat
,
tplResult
,
icvTemplateMatchModes
[
m
]);
tplResults
[
icvTemplateMatchModes
[
m
]]
=
tplResult
;
}
});
cv
::
Mat
tplResult0
=
tplResults
[
5
]
-
tplResults
[
1
];
//计算极值坐标
//计算极值坐标
cv
::
Point
maxyyuloc
;
cv
::
Point
maxyyuloc
;
...
@@ -145,22 +158,14 @@ static bool findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double tra
...
@@ -145,22 +158,14 @@ static bool findTrackModel(cv::Mat& image, cv::Mat &tplMat, double t, double tra
//偏移到中心
//偏移到中心
maxyyuloc
+=
cv
::
Point
(
tplMat
.
cols
/
2
,
tplMat
.
rows
/
2
);
maxyyuloc
+=
cv
::
Point
(
tplMat
.
cols
/
2
,
tplMat
.
rows
/
2
);
//
测试用,
限制在理论范围内
//
结果坐标
限制在理论范围内
if
(
bFinal
)
if
(
bFinal
)
{
{
//重新确定位置
//重新确定位置
cv
::
Rect
rLimit
(
cv
::
Point
((
tty
.
cols
-
tplMat
.
cols
)
/
2
,
(
tty
.
rows
-
tplMat
.
rows
)
/
2
),
tplMat
.
size
());
cv
::
Rect
rLimit
(
cv
::
Point
((
trackMat
.
cols
-
tplMat
.
cols
)
/
2
,
(
trackMat
.
rows
-
tplMat
.
rows
)
/
2
),
tplMat
.
size
());
cv
::
Mat
showMat
;
cv
::
cvtColor
(
tty
,
showMat
,
cv
::
COLOR_GRAY2BGR
);
cv
::
rectangle
(
showMat
,
rLimit
,
cv
::
Scalar
(
0
,
255
,
0
,
255
));
cv
::
Mat
test
=
getTplMat
(
mask
.
getMat
()(
rr
&
cv
::
Rect
(
0
,
0
,
X
,
Y
)),
-
t
,
0
);
//判断区域内有效面积所占比例
//判断区域内有效面积所占比例
if
((
float
)
cv
::
countNonZero
(
test
(
rLimit
))
/
(
float
)
rLimit
.
area
()
<
0.15
)
{
if
((
float
)
cv
::
countNonZero
(
getTplMat
(
mask
.
getMat
()(
rr
&
cv
::
Rect
(
0
,
0
,
X
,
Y
)),
-
t
,
0
)(
rLimit
))
/
(
float
)
rLimit
.
area
()
<
0.18
)
{
//料盘结束
//料盘结束
return
true
;
return
true
;
}
}
...
@@ -426,6 +431,14 @@ static bool checkSize(cv::Mat &srcPrev, cv::Mat &mask, int &partSize)
...
@@ -426,6 +431,14 @@ static bool checkSize(cv::Mat &srcPrev, cv::Mat &mask, int &partSize)
return
partSize
>=
20
;
return
partSize
>=
20
;
}
}
void
sumTest
()
{
int
a
=
0
;
for
(
int
i
=
0
;
i
<
100000000
;
i
++
)
a
++
;
}
#pragma endregion
#pragma endregion
int
eyemCountObject
(
EyemImage
tpImage
,
const
char
*
fileName
,
double
dOffset
,
int
iMinArea
,
int
iMaxArea
,
int
iWinSize
,
LPSTR
*
lpszNumObj
,
EyemImage
*
tpDstImg
)
int
eyemCountObject
(
EyemImage
tpImage
,
const
char
*
fileName
,
double
dOffset
,
int
iMinArea
,
int
iMaxArea
,
int
iWinSize
,
LPSTR
*
lpszNumObj
,
EyemImage
*
tpDstImg
)
...
@@ -3940,6 +3953,15 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -3940,6 +3953,15 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
int
tplWidth
,
tplHeight
;
int
tplWidth
,
tplHeight
;
tplWidth
=
tplMat
.
cols
,
tplHeight
=
tplMat
.
rows
;
tplWidth
=
tplMat
.
cols
,
tplHeight
=
tplMat
.
rows
;
// double begin0 = (double)cv::getTickCount();
// //并行计算测试用
////#pragma omp parallel for
// for (int i = 0; i < 100; i++)
// {
// sumTest();
// }
// std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
//去除局部量斑影响(默认亮斑尺寸不会大于15个像素)
//去除局部量斑影响(默认亮斑尺寸不会大于15个像素)
cv
::
Mat
srcTmp
;
cv
::
Mat
srcTmp
;
cv
::
morphologyEx
(
src
,
srcTmp
,
cv
::
MORPH_ERODE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
15
,
15
)));
cv
::
morphologyEx
(
src
,
srcTmp
,
cv
::
MORPH_ERODE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
15
,
15
)));
...
@@ -4075,7 +4097,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4075,7 +4097,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
tl
=
cv
::
Point
(
cv
::
max
(
rec
.
tl
().
x
-
35
,
0
),
cv
::
max
(
rec
.
tl
().
y
-
35
,
0
));
br
=
cv
::
Point
(
cv
::
min
(
rec
.
br
().
x
+
35
,
Y
),
cv
::
min
(
rec
.
br
().
y
+
35
,
Y
));
tl
=
cv
::
Point
(
cv
::
max
(
rec
.
tl
().
x
-
35
,
0
),
cv
::
max
(
rec
.
tl
().
y
-
35
,
0
));
br
=
cv
::
Point
(
cv
::
min
(
rec
.
br
().
x
+
35
,
Y
),
cv
::
min
(
rec
.
br
().
y
+
35
,
Y
));
tr
=
cv
::
Point
(
br
.
x
,
tl
.
y
);
bl
=
cv
::
Point
(
tl
.
x
,
br
.
y
);
tr
=
cv
::
Point
(
br
.
x
,
tl
.
y
);
bl
=
cv
::
Point
(
tl
.
x
,
br
.
y
);
//用八个方向的模板进行模板匹配(模板匹配的方式对于发生形变的器件效果不好)
//用八个方向的模板进行模板匹配(模板匹配的方式对于发生形变的器件效果不好
,实在不行就用八个方向,增加起点数量来弥补追踪终止导致的偏差
)
const
float
icvDirections
[
4
]
=
{
0
,
90
,
180
,
-
90
};
const
float
icvDirections
[
4
]
=
{
0
,
90
,
180
,
-
90
};
//用以计算元件中心
//用以计算元件中心
...
@@ -4137,7 +4159,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4137,7 +4159,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
*/
*/
for
(
std
::
vector
<
cv
::
Point
>::
iterator
itv
=
matchPts
.
begin
();
itv
!=
matchPts
.
end
();
++
itv
)
for
(
std
::
vector
<
cv
::
Point
>::
iterator
itv
=
matchPts
.
begin
();
itv
!=
matchPts
.
end
();
++
itv
)
{
{
//
cv::drawMarker(cc, cv::Point((*itv).x, (*itv).y), cv::Scalar(0, 255, 0, 255));
cv
::
drawMarker
(
cc
,
cv
::
Point
((
*
itv
).
x
,
(
*
itv
).
y
),
cv
::
Scalar
(
0
,
255
,
0
,
255
));
}
}
#endif
#endif
...
@@ -4214,12 +4236,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4214,12 +4236,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
std
::
sort
(
track4ChordL
.
begin
(),
track4ChordL
.
end
(),
std
::
greater
<
Track
>
());
std
::
sort
(
track4ChordL
.
begin
(),
track4ChordL
.
end
(),
std
::
greater
<
Track
>
());
cv
::
Point
e
c
pectPos
=
track4ChordL
[
0
].
Pos
;
cv
::
Point
e
x
pectPos
=
track4ChordL
[
0
].
Pos
;
dChordL
=
2.0
*
startRadius
*
sin
(((
2.0
*
asin
((
cv
::
norm
(
startCenter
-
cv
::
Point2f
((
float
)
e
c
pectPos
.
x
,
\
dChordL
=
2.0
*
startRadius
*
sin
(((
2.0
*
asin
((
cv
::
norm
(
startCenter
-
cv
::
Point2f
((
float
)
e
x
pectPos
.
x
,
\
(
float
)
e
c
pectPos
.
y
)))
/
(
2.0
*
startRadius
)))
*
180.0
/
PI
-
dOffset
)
*
PI
/
180.0
/
2.0
);
(
float
)
e
x
pectPos
.
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(expectPos.x, expectPos.y), cv::Scalar(0, 0, 255, 255), 0, 10);
}
}
else
{
else
{
//用先前的方式重新计算间距,因为耗时操作不会在这里,加上可以减少耗时但可能不一定准
//用先前的方式重新计算间距,因为耗时操作不会在这里,加上可以减少耗时但可能不一定准
...
@@ -4241,6 +4264,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4241,6 +4264,10 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
if
(
trackMat
.
ptr
<
uint8_t
>
((
int
)
startCenter
.
y
)[(
int
)
startCenter
.
x
]
==
255
)
if
(
trackMat
.
ptr
<
uint8_t
>
((
int
)
startCenter
.
y
)[(
int
)
startCenter
.
x
]
==
255
)
continue
;
continue
;
//除去内圈干扰
if
(
cv
::
norm
(
startCenter
-
reelCenter
)
<
150
)
continue
;
//计算元件区域
//计算元件区域
cv
::
Point2f
points
[
4
];
cv
::
Point2f
points
[
4
];
{
{
...
@@ -4286,8 +4313,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4286,8 +4313,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//并行处理
//并行处理
//#pragma omp parallel sections
//#pragma omp parallel sections
{
{
//(顺时针)
//#pragma omp section //(顺时针)
//#pragma omp section
{
{
//追踪中心
//追踪中心
cv
::
Point2f
trackCenter
=
cv
::
Point2f
(
startCenter
.
x
,
startCenter
.
y
);
cv
::
Point2f
trackCenter
=
cv
::
Point2f
(
startCenter
.
x
,
startCenter
.
y
);
...
@@ -4339,10 +4365,6 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4339,10 +4365,6 @@ 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
);
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
);
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
);
...
@@ -4360,12 +4382,11 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4360,12 +4382,11 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//进一步确认元件位置
//进一步确认元件位置
bool
trayEnd
=
false
;
bool
trayEnd
=
false
;
if
(
true
)
{
if
(
true
)
{
//考虑增加[-2,2]角度范围以应对料盘变形
//再确认一下
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
true
,
maxyyu
,
trackCenter
,
binary
);
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
true
,
maxyyu
,
trackCenter
,
binary
);
}
}
//if (cvRound(trackCenter.x) ==
597 && cvRound(trackCenter.y) == 1504
)
//if (cvRound(trackCenter.x) ==
336 && cvRound(trackCenter.y) == 536
)
// std::cout << "" << std::endl;
// std::cout << "" << std::endl;
//更新扫描半径
//更新扫描半径
...
@@ -4431,6 +4452,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4431,6 +4452,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//标记当前位置
//标记当前位置
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
}
else
else
{
{
...
@@ -4443,6 +4465,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4443,6 +4465,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//标记当前位置
//标记当前位置
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
}
//std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
//std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
...
@@ -4451,8 +4474,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4451,8 +4474,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
}
while
(
!
trackEnd
);
}
while
(
!
trackEnd
);
}
}
//#pragma omp section
//#pragma omp section //(逆时针)
//逆时针追踪
{
{
//追踪起点
//追踪起点
cv
::
Point2f
trackCenter
(
startCenter
.
x
,
startCenter
.
y
);
cv
::
Point2f
trackCenter
(
startCenter
.
x
,
startCenter
.
y
);
...
@@ -4499,10 +4521,6 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4499,10 +4521,6 @@ 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
);
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
);
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
);
...
@@ -4520,12 +4538,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4520,12 +4538,13 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//
//
bool
trayEnd
=
false
;
bool
trayEnd
=
false
;
if
(
true
)
{
if
(
true
)
{
//
再确认一下
//
考虑增加[-2,2]角度范围以应对料盘变形
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
true
,
maxyyu
,
trackCenter
,
binary
);
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
true
,
maxyyu
,
trackCenter
,
binary
);
}
}
//if (cvRound(trackCenter.x) == 1230 && cvRound(trackCenter.y) == 497)
//if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){
// std::cout << "" << std::endl;
// std::cout << "xx" << std::endl;
//}
//更新扫描半径
//更新扫描半径
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
...
@@ -4591,6 +4610,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4591,6 +4610,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//标记当前位置
//标记当前位置
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
}
else
else
{
{
...
@@ -4603,6 +4623,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4603,6 +4623,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//标记当前位置
//标记当前位置
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
}
trackEnd
=
(
!
found
);
trackEnd
=
(
!
found
);
...
@@ -4633,7 +4654,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4633,7 +4654,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
//内存尺寸
//内存尺寸
int
_Size
=
tpDstImg
->
iWidth
*
tpDstImg
->
iHeight
*
tpDstImg
->
iChannels
*
sizeof
(
uint8_t
);
int
_Size
=
tpDstImg
->
iWidth
*
tpDstImg
->
iHeight
*
tpDstImg
->
iChannels
*
sizeof
(
uint8_t
);
//分配内存
//分配
初始化
内存
tpDstImg
->
vpImage
=
(
uint8_t
*
)
malloc
(
_Size
);
tpDstImg
->
vpImage
=
(
uint8_t
*
)
malloc
(
_Size
);
if
(
NULL
==
tpDstImg
->
vpImage
)
if
(
NULL
==
tpDstImg
->
vpImage
)
return
FUNC_NOT_ENOUGH_MEM
;
return
FUNC_NOT_ENOUGH_MEM
;
...
@@ -4646,14 +4667,46 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
...
@@ -4646,14 +4667,46 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, const char *fileName, cons
return
FUNC_OK
;
return
FUNC_OK
;
}
}
int
eyemCreateTemplateModel
(
EyemImage
tpImage
,
EyemRect
tpRoi
,
const
char
*
ccTplName
)
int
eyemCalcTemplateImage
(
EyemImage
tpImage
,
EyemImage
*
tpDstImg
)
{
cv
::
Mat
image
=
cv
::
Mat
(
tpImage
.
iHeight
,
tpImage
.
iWidth
,
MAKETYPE
(
tpImage
.
iDepth
,
tpImage
.
iChannels
),
tpImage
.
vpImage
);
//检查文件是否存在
if
(
image
.
empty
())
return
FUNC_IMAGE_NOT_EXIST
;
cv
::
Mat
srcPrev
;
//预处理
///<输出计数结果标记图像
{
tpDstImg
->
iWidth
=
srcPrev
.
cols
;
tpDstImg
->
iHeight
=
srcPrev
.
rows
;
tpDstImg
->
iDepth
=
srcPrev
.
depth
();
tpDstImg
->
iChannels
=
srcPrev
.
channels
();
//内存尺寸
int
_Size
=
tpDstImg
->
iWidth
*
tpDstImg
->
iHeight
*
tpDstImg
->
iChannels
*
sizeof
(
uint8_t
);
//分配初始化内存
tpDstImg
->
vpImage
=
(
uint8_t
*
)
malloc
(
_Size
);
if
(
NULL
==
tpDstImg
->
vpImage
)
return
FUNC_NOT_ENOUGH_MEM
;
memset
(
tpDstImg
->
vpImage
,
0
,
_Size
);
//拷贝数据
memcpy
(
tpDstImg
->
vpImage
,
srcPrev
.
data
,
_Size
);
}
return
FUNC_OK
;
}
int
eyemCreateTemplateModel
(
EyemImage
tpImage
,
EyemRect
tpRoi
,
double
dMinScore
,
const
char
*
ccTplName
)
{
{
cv
::
Mat
tplMat
=
cv
::
Mat
(
tpImage
.
iHeight
,
tpImage
.
iWidth
,
MAKETYPE
(
tpImage
.
iDepth
,
tpImage
.
iChannels
),
tpImage
.
vpImage
)
\
cv
::
Mat
tplMat
=
cv
::
Mat
(
tpImage
.
iHeight
,
tpImage
.
iWidth
,
MAKETYPE
(
tpImage
.
iDepth
,
tpImage
.
iChannels
),
tpImage
.
vpImage
)
\
(
cv
::
Rect
(
tpRoi
.
iXs
,
tpRoi
.
iYs
,
tpRoi
.
iWidth
,
tpRoi
.
iHeight
)).
clone
();
(
cv
::
Rect
(
tpRoi
.
iXs
,
tpRoi
.
iYs
,
tpRoi
.
iWidth
,
tpRoi
.
iHeight
)).
clone
();
//模板信息
//模板信息
std
::
string
hint
=
" "
+
std
::
to_string
(
tpRoi
.
iXs
)
+
","
+
std
::
to_string
(
tpRoi
.
iYs
)
+
","
\
std
::
string
hint
=
" "
+
std
::
to_string
(
tpRoi
.
iXs
)
+
","
+
std
::
to_string
(
tpRoi
.
iYs
)
+
","
\
+
std
::
to_string
(
tpRoi
.
iWidth
)
+
","
+
std
::
to_string
(
tpRoi
.
iHeight
);
+
std
::
to_string
(
tpRoi
.
iWidth
)
+
","
+
std
::
to_string
(
tpRoi
.
iHeight
)
+
","
+
std
::
to_string
(
dMinScore
)
;
//内存尺寸(将信息添加到图像后面)
//内存尺寸(将信息添加到图像后面)
int
_Size
=
tplMat
.
cols
*
tplMat
.
rows
*
tplMat
.
channels
()
*
sizeof
(
uint8_t
);
int
_Size
=
tplMat
.
cols
*
tplMat
.
rows
*
tplMat
.
channels
()
*
sizeof
(
uint8_t
);
...
@@ -4683,6 +4736,76 @@ int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, const char *ccTpl
...
@@ -4683,6 +4736,76 @@ int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, const char *ccTpl
return
FUNC_OK
;
return
FUNC_OK
;
}
}
static
void
getFiles
(
std
::
string
filePath
,
std
::
vector
<
std
::
string
>&
fileNames
)
{
//文件句柄
intptr_t
hFile
=
0
;
//文件信息
struct
_finddata_t
fileinfo
;
std
::
string
p
;
if
((
hFile
=
_findfirst
(
p
.
assign
(
filePath
).
append
(
"
\\
*"
).
c_str
(),
&
fileinfo
))
!=
-
1
)
{
do
{
//如果是目录,迭代之,如果不是,加入列表
if
((
fileinfo
.
attrib
&
_A_SUBDIR
))
{
if
(
strcmp
(
fileinfo
.
name
,
"."
)
!=
0
&&
strcmp
(
fileinfo
.
name
,
".."
)
!=
0
)
getFiles
(
p
.
assign
(
filePath
).
append
(
"
\\
"
).
append
(
fileinfo
.
name
),
fileNames
);
}
else
{
fileNames
.
push_back
(
p
.
assign
(
filePath
).
append
(
"
\\
"
).
append
(
fileinfo
.
name
));
}
}
while
(
_findnext
(
hFile
,
&
fileinfo
)
==
0
);
_findclose
(
hFile
);
}
}
int
eyemMatchTemplateModel
(
EyemImage
tpImage
,
const
char
*
ccTplNames
,
LPSTR
*
lpszTplName
)
{
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
;
const
float
icvDirections
[
4
]
=
{
0
,
90
,
180
,
-
90
};
//获取文件路径
std
::
vector
<
std
::
string
>
fileNames
;
getFiles
(
std
::
string
(
ccTplNames
),
fileNames
);
//载入所有模板
std
::
vector
<
cv
::
Mat
>
tplMats
;
for
(
int
i
=
0
;
i
<
(
int
)
fileNames
.
size
();
i
++
)
{
cv
::
Mat
tplMat
;
//
//
//
tplMats
.
push_back
(
tplMat
);
}
//遍历所有模板
cv
::
parallel_for_
(
cv
::
Range
(
0
,
tplMats
.
size
()),
[
&
](
const
cv
::
Range
&
range
)
->
void
{
for
(
int
tpl
=
range
.
start
;
tpl
<
range
.
end
;
tpl
++
)
{
cv
::
Mat
tplMat
=
tplMats
[
tpl
];
for
(
int
d
=
0
;
d
<
4
;
d
++
)
{
//模板匹配
cv
::
matchTemplate
(
image
,
tplMat
,
cv
::
noArray
(),
cv
::
TM_CCOEFF_NORMED
);
}
}
});
//计算最佳匹配模板
return
FUNC_OK
;
}
int
eyemTrackFeature
(
EyemImage
tpRefImg
,
EyemImage
tpNextImg
,
EyemRect3
*
tpRois
,
int
iRoiNum
,
int
*
ipResults
)
int
eyemTrackFeature
(
EyemImage
tpRefImg
,
EyemImage
tpNextImg
,
EyemRect3
*
tpRois
,
int
iRoiNum
,
int
*
ipResults
)
{
{
cv
::
Mat
refImg
(
tpRefImg
.
iHeight
,
tpRefImg
.
iWidth
,
cv
::
Mat
refImg
(
tpRefImg
.
iHeight
,
tpRefImg
.
iWidth
,
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论