Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张士柳
/
eyemLib
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
图表
网络
创建新的问题
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 6b03fe92
由
张士柳
编写于
2021-03-19 16:21:30 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
无
1 个父辈
84029fbf
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
260 行增加
和
261 行删除
eyemLib-Sharp/EyemLib.cs
eyemLib/eyemLib.rc
eyemLib/eyemMisc.cpp
eyemLib-Sharp/EyemLib.cs
查看文件 @
6b03fe9
...
@@ -912,9 +912,9 @@ namespace eyemLib_Sharp
...
@@ -912,9 +912,9 @@ namespace eyemLib_Sharp
EyemRect
tpRoi
=
new
EyemRect
();
EyemRect
tpRoi
=
new
EyemRect
();
tpRoi
.
iXs
=
20
0
;
tpRoi
.
iYs
=
20
0
;
tpRoi
.
iXs
=
20
;
tpRoi
.
iYs
=
2
0
;
tpRoi
.
iWidth
=
image
.
iWidth
-
40
0
;
tpRoi
.
iWidth
=
image
.
iWidth
-
40
;
tpRoi
.
iHeight
=
image
.
iHeight
-
40
0
;
tpRoi
.
iHeight
=
image
.
iHeight
-
40
;
//
//
string
pNumObj
=
""
;
string
pNumObj
=
""
;
...
@@ -932,12 +932,12 @@ namespace eyemLib_Sharp
...
@@ -932,12 +932,12 @@ namespace eyemLib_Sharp
//创建模板匹配模型
//创建模板匹配模型
EyemRect
tpRoi2
=
new
EyemRect
();
EyemRect
tpRoi2
=
new
EyemRect
();
tpRoi2
.
iXs
=
1026
;
tpRoi2
.
iYs
=
513
;
tpRoi2
.
iXs
=
0
;
tpRoi2
.
iYs
=
0
;
tpRoi2
.
iWidth
=
41
;
tpRoi2
.
iWidth
=
image
.
iWidth
;
tpRoi2
.
iHeight
=
14
;
tpRoi2
.
iHeight
=
image
.
iHeight
;
double
matchDeg
=
0.75
;
double
matchDeg
=
0.75
;
//flag = eyemCreateTemplateModel(
tpDstImg
, tpRoi2, matchDeg, "D:\\模板文件\\" + file.Replace(".png", ".tpl"));
//flag = eyemCreateTemplateModel(
image
, tpRoi2, matchDeg, "D:\\模板文件\\" + file.Replace(".png", ".tpl"));
//string selectModel = "";
//string selectModel = "";
//flag = eyemMatchTemplateModel(tpDstImg, "D:\\模板文件", ref selectModel);
//flag = eyemMatchTemplateModel(tpDstImg, "D:\\模板文件", ref selectModel);
...
@@ -952,7 +952,7 @@ namespace eyemLib_Sharp
...
@@ -952,7 +952,7 @@ namespace eyemLib_Sharp
//eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), selectModel, ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), selectModel, ref pNumObj, out tpDstImg);
eyemCountObjectIrregularPartsE
(
image
,
tpRoi
,
file
.
Replace
(
".png"
,
""
),
"D:\\模板文件\\"
+
file
.
Replace
(
".png"
,
".tpl"
),
ref
pNumObj
,
out
tpDstImg
);
eyemCountObjectIrregularPartsE
(
image
,
tpRoi
,
file
.
Replace
(
".png"
,
""
),
"D:\\模板文件\\"
+
file
.
Replace
(
".png"
,
".tpl"
),
ref
pNumObj
,
out
tpDstImg
);
Bitmap
bitmap
=
eyemCvtToBitmap
(
tpDstImg
);
//
Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
//if (bitmap != null)
//if (bitmap != null)
//{
//{
...
...
eyemLib/eyemLib.rc
查看文件 @
6b03fe9
此文件类型无法预览
eyemLib/eyemMisc.cpp
查看文件 @
6b03fe9
...
@@ -4470,89 +4470,133 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
...
@@ -4470,89 +4470,133 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//偏移角度(元件尺寸)
//偏移角度(元件尺寸)
const
double
dOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
startRadius
)))
*
180.
/
PI
;
const
double
dOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
startRadius
)))
*
180.
/
PI
;
//优化开关
#define OPTIMAL_ON true
#if OPTIMAL_ON
//考虑作并行处理
//考虑作并行处理
tbb
::
parallel_invoke
(
tbb
::
parallel_invoke
(
[
&
]
[
&
]
#endif
{
{
std
::
cout
<<
tbb
::
this_tbb_thread
::
get_id
()
<<
std
::
endl
;
///< 顺时针追踪
//追踪中心
cv
::
Point2f
trackCenter
=
cv
::
Point2f
(
startCenter
.
x
,
startCenter
.
y
);
//追踪角度、半径
double
trackAngle
=
startAngle
,
trackRadius
=
startRadius
;
//元件本身角度
double
trackOffset
=
dOffset
;
//元件间间距
double
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//外接矩形顶点
cv
::
Point2f
pts
[
4
];
//开始追踪
bool
trackEnd
=
true
;
do
{
double
begin0
=
(
double
)
cv
::
getTickCount
();
#pragma region //(顺时针)
bool
found
=
true
;
std
::
vector
<
Track
>
vParts
;
{
for
(
double
t
=
trackAngle
+
(
trackOffset
/
2.0
+
partDist
+
trackOffset
/
3.0
);
t
<
trackAngle
+
\
//追踪中心
(
trackOffset
/
2.0
+
partDist
+
trackOffset
/
3.0
)
+
trackOffset
/
3.0
;
t
+=
dMinorStep
)
cv
::
Point2f
trackCenter
=
cv
::
Point2f
(
startCenter
.
x
,
startCenter
.
y
);
//追踪角度、半径
double
trackAngle
=
startAngle
,
trackRadius
=
startRadius
;
//元件本身角度
double
trackOffset
=
dOffset
;
//元件间间距
double
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//外接矩形顶点
cv
::
Point2f
pts
[
4
];
//开始追踪
bool
trackEnd
=
true
;
do
{
{
double
begin0
=
(
double
)
cv
::
getTickCount
();
trackCenter
.
x
=
reelCenter
.
x
+
(
float
)
trackRadius
*
(
float
)
cos
(
t
*
c
);
trackCenter
.
y
=
reelCenter
.
y
+
(
float
)
trackRadius
*
(
float
)
sin
(
t
*
c
);
bool
found
=
true
;
//计算旋转矩形
std
::
vector
<
Track
>
vParts
;
calcRotateRect
(
trackCenter
,
(
float
)
t
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
)
;
for
(
double
t
=
trackAngle
+
(
trackOffset
/
2.0
+
partDist
+
trackOffset
/
3.0
);
t
<
trackAngle
+
\
//模板匹配
(
trackOffset
/
2.0
+
partDist
+
trackOffset
/
3.0
)
+
trackOffset
/
3.0
;
t
+=
dMinorStep
)
double
maxyyu
;
cv
::
Point2f
maxyyuloc
;
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
t
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
false
,
maxyyu
,
maxyyuloc
,
cv
::
noArray
());
//最小匹配结果
if
(
maxyyu
>
0.15
)
{
{
trackCenter
.
x
=
reelCenter
.
x
+
(
float
)
trackRadius
*
(
float
)
cos
(
t
*
c
);
//存放结果
trackCenter
.
y
=
reelCenter
.
y
+
(
float
)
trackRadius
*
(
float
)
sin
(
t
*
c
);
vParts
.
push_back
(
Track
(
0
,
0
,
maxyyu
,
cv
::
Point
(
cvRound
(
trackCenter
.
x
),
cvRound
(
trackCenter
.
y
)),
std
::
vector
<
cv
::
Point2f
>
()));
}
//计算旋转矩形
//测试标记
calcRotateRect
(
trackCenter
,
(
float
)
t
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
//cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
}
//模板匹配
//如果为0大概率是背景
double
maxyyu
;
cv
::
Point2f
maxyyuloc
;
if
(
vParts
.
size
()
<=
0
)
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
t
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
false
,
maxyyu
,
maxyyuloc
,
cv
::
noArray
())
;
break
;
//最小匹配结果
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
if
(
maxyyu
>
0.15
)
trackCenter
=
cv
::
Point2f
((
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
x
,
(
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
y
);
{
//存放结果
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);
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
);
}
//如果为0大概率是背景
//更新扫描角度
if
(
vParts
.
size
()
<=
0
)
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
break
;
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
trackCenter
=
cv
::
Point2f
((
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
x
,
(
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
y
);
//理论元件位置
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
);
//更新扫描角度
//模板匹配/更新元件精确位置
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
double
maxyyu
;
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, trackCenter, cv::noArray());
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
//进一步确认元件位置
bool
trayEnd
=
false
;
if
(
true
)
{
//考虑增加[-2,2]角度范围以应对料盘变形
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
true
,
maxyyu
,
trackCenter
,
binary
);
}
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
//if (cvRound(trackCenter.x) == 336 && cvRound(trackCenter.y) == 536)
// std::cout << "" << std::endl;
//更新扫描半径
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
//更新扫描角度
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
//更新偏移量(元件大小)
trackOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//更新元件间角度
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//计算实际元件区域
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
//模板匹配/更新元件精确位置
#ifdef _DEBUG
double
maxyyu
;
cv
::
Point2f
ptsT
[
4
]
;
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, trackCenter, cv::noArray()
);
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
ptsT
);
//进一步确认元件位置
if
(
!
trayEnd
)
bool
trayEnd
=
false
;
{
if
(
true
)
{
//画出元件区域
//考虑增加[-2,2]角度范围以应对料盘变形
for
(
int
j
=
0
;
j
<
4
;
j
++
)
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
true
,
maxyyu
,
trackCenter
,
binary
);
{
cv
::
line
(
cc
,
ptsT
[
j
],
ptsT
[(
j
+
1
)
%
4
],
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
}
}
}
//if (cvRound(trackCenter.x) == 336 && cvRound(trackCenter.y) == 536)
#endif
// std::cout << "" << std::endl;
//判断是否追踪终止
if
(
trayEnd
)
{
//不再判断,大概率已经终止
found
=
false
;
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenterT
.
y
))[
cvRound
(
trackCenterT
.
x
)]
==
255
)
{
//不再判断,大概率已经终止
found
=
false
;
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
==
255
)
{
//判断可能并未终止,遂采用理论位置作为下一个元件位置
trackCenter
=
trackCenterT
;
///<更新追踪信息
//更新扫描半径
//更新扫描半径
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
//更新扫描角度
//更新扫描角度
...
@@ -4562,161 +4606,159 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
...
@@ -4562,161 +4606,159 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//更新元件间角度
//更新元件间角度
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//计算
实际
元件区域
//计算
理论
元件区域
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
#ifdef _DEBUG
//标记为已追踪过
cv
::
Point2f
ptsT
[
4
]
;
std
::
vector
<
cv
::
Point
>
ptPoly
=
{
cv
::
Point
(
pts
[
0
]),
cv
::
Point
(
pts
[
1
])
,
cv
::
Point
(
pts
[
2
])
,
cv
::
Point
(
pts
[
3
])
}
;
c
alcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
ptsT
);
c
v
::
fillConvexPoly
(
trackMat
,
ptPoly
,
cv
::
Scalar
(
255
)
);
if
(
!
trayEnd
)
//标记计数
{
lbMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
=
255
;
//画出元件区域
for
(
int
j
=
0
;
j
<
4
;
j
++
)
{
cv
::
line
(
cc
,
ptsT
[
j
],
ptsT
[(
j
+
1
)
%
4
],
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
}
}
#endif
//判断是否追踪终止
//标记当前位置
if
(
trayEnd
)
{
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);
found
=
false
;
}
}
else
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenterT
.
y
))[
cvRound
(
trackCenterT
.
x
)]
==
255
)
{
{
//不再判断,大概率已经终止
//标记为已追踪过
found
=
false
;
std
::
vector
<
cv
::
Point
>
ptPoly
=
{
cv
::
Point
(
pts
[
0
]),
cv
::
Point
(
pts
[
1
])
,
cv
::
Point
(
pts
[
2
])
,
cv
::
Point
(
pts
[
3
])
};
}
cv
::
fillConvexPoly
(
trackMat
,
ptPoly
,
cv
::
Scalar
(
255
));
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
==
255
)
{
//判断可能并未终止,遂采用理论位置作为下一个元件位置
//标记计数
trackCenter
=
trackCenterT
;
lbMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
=
255
;
///<更新追踪信息
//标记当前位置
//更新扫描半径
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
//更新扫描角度
}
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
//更新偏移量(元件大小)
trackOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//更新元件间角度
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//计算理论元件区域
//std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
//标记为已追踪过
trackEnd
=
(
!
found
);
std
::
vector
<
cv
::
Point
>
ptPoly
=
{
cv
::
Point
(
pts
[
0
]),
cv
::
Point
(
pts
[
1
])
,
cv
::
Point
(
pts
[
2
])
,
cv
::
Point
(
pts
[
3
])
};
}
while
(
!
trackEnd
);
cv
::
fillConvexPoly
(
trackMat
,
ptPoly
,
cv
::
Scalar
(
255
));
//标记计数
}
lbMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
=
255
;
#if OPTIMAL_ON
,
[
&
]
#endif
{
///< 逆时针追踪
//追踪起点
cv
::
Point2f
trackCenter
(
startCenter
.
x
,
startCenter
.
y
);
//起始扫描角度、半径
double
trackAngle
=
startAngle
,
trackRadius
=
startRadius
;
//元件本身角度
double
trackOffset
=
dOffset
;
//元件间间距
double
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//外接矩形
cv
::
Point2f
pts
[
4
];
//开始追踪
bool
trackEnd
=
true
;
//
do
{
bool
found
=
true
;
std
::
vector
<
Track
>
vParts
;
for
(
double
t
=
trackAngle
-
(
trackOffset
/
3.0
+
partDist
+
trackOffset
/
2.0
);
t
>
trackAngle
-
\
(
trackOffset
/
3.0
+
partDist
+
trackOffset
/
2.0
)
-
trackOffset
/
3.0
;
t
-=
dMinorStep
)
{
trackCenter
.
x
=
float
(
reelCenter
.
x
+
trackRadius
*
cos
(
t
*
c
));
trackCenter
.
y
=
float
(
reelCenter
.
y
+
trackRadius
*
sin
(
t
*
c
));
//标记当前位置
//计算旋转矩形
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
calcRotateRect
(
trackCenter
,
(
float
)
t
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
else
{
//标记为已追踪过
std
::
vector
<
cv
::
Point
>
ptPoly
=
{
cv
::
Point
(
pts
[
0
]),
cv
::
Point
(
pts
[
1
])
,
cv
::
Point
(
pts
[
2
])
,
cv
::
Point
(
pts
[
3
])
};
cv
::
fillConvexPoly
(
trackMat
,
ptPoly
,
cv
::
Scalar
(
255
));
//标记计数
//模板匹配
lbMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
=
255
;
double
maxyyu
;
cv
::
Point2f
maxyyuloc
;
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
t
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
false
,
maxyyu
,
maxyyuloc
,
cv
::
noArray
());
//标记当前位置
//最小匹配结果
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
if
(
maxyyu
>
0.15
)
{
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
//存放结果
vParts
.
push_back
(
Track
(
0
,
0
,
maxyyu
,
cv
::
Point
(
cvRound
(
trackCenter
.
x
),
cvRound
(
trackCenter
.
y
)),
std
::
vector
<
cv
::
Point2f
>
()));
}
}
//std::cout << "总体耗时:" << 1000 * (static_cast<double>(cv::getTickCount()) - begin0) / cv::getTickFrequency() << std::endl;
//测试标记
//cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
trackEnd
=
(
!
found
);
}
}
while
(
!
trackEnd
);
if
(
vParts
.
size
()
==
0
)
}
break
;
#pragma endregion
},
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
[
&
]
trackCenter
=
cv
::
Point2f
((
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
x
,
(
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
y
);
{
std
::
cout
<<
tbb
::
this_tbb_thread
::
get_id
()
<<
std
::
endl
;
#pragma region //(逆时针)
//理论元件区域
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
);
{
//更新扫描角度
//追踪起点
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
cv
::
Point2f
trackCenter
(
startCenter
.
x
,
startCenter
.
y
);
//起始扫描角度、半径
double
trackAngle
=
startAngle
,
trackRadius
=
startRadius
;
//元件本身角度
double
trackOffset
=
dOffset
;
//元件间间距
double
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//外接矩形
cv
::
Point2f
pts
[
4
];
//开始追踪
bool
trackEnd
=
true
;
//
do
{
bool
found
=
true
;
std
::
vector
<
Track
>
vParts
;
for
(
double
t
=
trackAngle
-
(
trackOffset
/
3.0
+
partDist
+
trackOffset
/
2.0
);
t
>
trackAngle
-
\
(
trackOffset
/
3.0
+
partDist
+
trackOffset
/
2.0
)
-
trackOffset
/
3.0
;
t
-=
dMinorStep
)
{
trackCenter
.
x
=
float
(
reelCenter
.
x
+
trackRadius
*
cos
(
t
*
c
));
trackCenter
.
y
=
float
(
reelCenter
.
y
+
trackRadius
*
sin
(
t
*
c
));
//计算旋转矩形
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
calcRotateRect
(
trackCenter
,
(
float
)
t
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
//模板匹配
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
double
maxyyu
;
cv
::
Point2f
maxyyuloc
;
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
t
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
false
,
maxyyu
,
maxyyuloc
,
cv
::
noArray
());
//最小匹配结果
//模板匹配/更新元件精确位置+判断
if
(
maxyyu
>
0.15
)
{
double
maxyyu
;
//存放结果
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, trackCenter, cv::noArray());
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);
bool
trayEnd
=
false
;
}
if
(
true
)
{
if
(
vParts
.
size
()
==
0
)
//考虑增加[-2,2]角度范围以应对料盘变形
break
;
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
true
,
maxyyu
,
trackCenter
,
binary
);
}
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
//if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){
trackCenter
=
cv
::
Point2f
((
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
x
,
(
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
y
);
// std::cout << "xx" << std::endl;
//}
//理论元件区域
//更新扫描半径
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
);
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
//更新扫描角度
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
//更新偏移量
trackOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//更新元件间角度
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//更新扫描角度
//计算实际元件位置
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
)
;
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
#ifdef _DEBUG
cv
::
Point2f
ptsT
[
4
];
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
ptsT
);
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
if
(
!
trayEnd
)
{
//画出元件区域
for
(
int
j
=
0
;
j
<
4
;
j
++
)
{
cv
::
line
(
cc
,
ptsT
[
j
],
ptsT
[(
j
+
1
)
%
4
],
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
}
}
//模板匹配/更新元件精确位置+判断
#endif
double
maxyyu
;
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backThresh), false, maxyyu, trackCenter, cv::noArray());
//
//判断是否追踪终止
bool
trayEnd
=
false
;
if
(
trayEnd
)
if
(
true
)
{
{
//考虑增加[-2,2]角度范围以应对料盘变形
//不再判断,大概率已经终止
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backThresh
),
true
,
maxyyu
,
trackCenter
,
binary
);
found
=
false
;
}
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenterT
.
y
))[
cvRound
(
trackCenterT
.
x
)]
==
255
)
{
//不再判断,大概率已经终止
found
=
false
;
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
==
255
)
{
//if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){
//判断可能并未终止,遂采用理论位置作为下一个元件位置
// std::cout << "xx" << std::endl;
trackCenter
=
trackCenterT
;
//}
///<更新追踪信息
//更新扫描半径
//更新扫描半径
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
//更新扫描角度
//更新扫描角度
...
@@ -4726,83 +4768,40 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
...
@@ -4726,83 +4768,40 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//更新元件间角度
//更新元件间角度
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//计算
实际
元件位置
//计算
理论
元件位置
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
#ifdef _DEBUG
//标记为已追踪过
cv
::
Point2f
ptsT
[
4
]
;
std
::
vector
<
cv
::
Point
>
ptPoly
=
{
cv
::
Point
(
pts
[
0
]),
cv
::
Point
(
pts
[
1
])
,
cv
::
Point
(
pts
[
2
])
,
cv
::
Point
(
pts
[
3
])
}
;
c
alcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
ptsT
);
c
v
::
fillConvexPoly
(
trackMat
,
ptPoly
,
cv
::
Scalar
(
255
)
);
if
(
!
trayEnd
)
//标记计数
{
lbMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
=
255
;
//画出元件区域
for
(
int
j
=
0
;
j
<
4
;
j
++
)
{
cv
::
line
(
cc
,
ptsT
[
j
],
ptsT
[(
j
+
1
)
%
4
],
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
}
}
#endif
//判断是否追踪终止
if
(
trayEnd
)
{
//不再判断,大概率已经终止
found
=
false
;
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenterT
.
y
))[
cvRound
(
trackCenterT
.
x
)]
==
255
)
{
//不再判断,大概率已经终止
found
=
false
;
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
==
255
)
{
//判断可能并未终止,遂采用理论位置作为下一个元件位置
trackCenter
=
trackCenterT
;
///<更新追踪信息
//更新扫描半径
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
//更新扫描角度
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
//更新偏移量
trackOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//更新元件间角度
partDist
=
(
2
*
asin
(
dChordL
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//计算理论元件位置
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
//标记为已追踪过
std
::
vector
<
cv
::
Point
>
ptPoly
=
{
cv
::
Point
(
pts
[
0
]),
cv
::
Point
(
pts
[
1
])
,
cv
::
Point
(
pts
[
2
])
,
cv
::
Point
(
pts
[
3
])
};
cv
::
fillConvexPoly
(
trackMat
,
ptPoly
,
cv
::
Scalar
(
255
));
//标记计数
lbMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
=
255
;
//标记当前位置
//标记当前位置
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);
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
}
else
else
{
{
//标记为已追踪过
//标记为已追踪过
std
::
vector
<
cv
::
Point
>
ptPoly
=
{
cv
::
Point
(
pts
[
0
]),
cv
::
Point
(
pts
[
1
])
,
cv
::
Point
(
pts
[
2
])
,
cv
::
Point
(
pts
[
3
])
};
std
::
vector
<
cv
::
Point
>
ptPoly
=
{
cv
::
Point
(
pts
[
0
]),
cv
::
Point
(
pts
[
1
])
,
cv
::
Point
(
pts
[
2
])
,
cv
::
Point
(
pts
[
3
])
};
cv
::
fillConvexPoly
(
trackMat
,
ptPoly
,
cv
::
Scalar
(
255
));
cv
::
fillConvexPoly
(
trackMat
,
ptPoly
,
cv
::
Scalar
(
255
));
//标记计数
lbMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
=
255
;
//标记当前位置
//标记计数
cv
::
drawMarker
(
cc
,
trackCenter
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
cv
::
MARKER_DIAMOND
,
5
);
lbMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
=
255
;
//cv::drawMarker(cc, trackCenter, cv::Scalar(0, 0, 255, 255), 0, 5);
}
trackEnd
=
(
!
found
);
//标记当前位置
}
while
(
!
trackEnd
);
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);
#pragma endregion
}
});
trackEnd
=
(
!
found
);
}
while
(
!
trackEnd
);
}
#if OPTIMAL_ON
);
#endif
}
}
//计数
//计数
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论