Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张士柳
/
eyemLib
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
图表
网络
创建新的问题
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 7ca22226
由
张士柳
编写于
2021-04-02 16:28:36 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
更新日志记录接口
1 个父辈
53a9dc28
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
247 行增加
和
160 行删除
eyemLib-Sharp/EyemLib.cs
eyemLib-Sharp/Program.cs
eyemLib/eyemGeneric.h
eyemLib/eyemLib.cpp
eyemLib/eyemLib.h
eyemLib/eyemLib.rc
eyemLib/eyemMisc.cpp
eyemLib/eyemMisc.h
eyemLib-Sharp/EyemLib.cs
查看文件 @
7ca2222
...
@@ -12,6 +12,7 @@ namespace eyemLib_Sharp
...
@@ -12,6 +12,7 @@ namespace eyemLib_Sharp
{
{
public
unsafe
class
EyemLib
public
unsafe
class
EyemLib
{
{
#
region
枚举
#
region
枚举
//稳健估计方法
//稳健估计方法
...
@@ -648,6 +649,9 @@ namespace eyemLib_Sharp
...
@@ -648,6 +649,9 @@ namespace eyemLib_Sharp
//释放图像资源
//释放图像资源
[
DllImport
(
"eyemLib.dll"
,
CharSet
=
CharSet
.
None
,
CallingConvention
=
CallingConvention
.
Cdecl
)]
[
DllImport
(
"eyemLib.dll"
,
CharSet
=
CharSet
.
None
,
CallingConvention
=
CallingConvention
.
Cdecl
)]
private
static
extern
void
eyemImageFree
(
ref
EyemImage
tpImage
);
private
static
extern
void
eyemImageFree
(
ref
EyemImage
tpImage
);
// 设定日志回调
[
DllImport
(
"eyemLib.dll"
,
CharSet
=
CharSet
.
None
,
CallingConvention
=
CallingConvention
.
Cdecl
)]
private
static
extern
void
setLogCallback
(
TCallBack
cb
);
//测试用
//测试用
[
DllImport
(
"eyemLib.dll"
,
CharSet
=
CharSet
.
None
,
CallingConvention
=
CallingConvention
.
Cdecl
)]
[
DllImport
(
"eyemLib.dll"
,
CharSet
=
CharSet
.
None
,
CallingConvention
=
CallingConvention
.
Cdecl
)]
...
@@ -778,6 +782,33 @@ namespace eyemLib_Sharp
...
@@ -778,6 +782,33 @@ namespace eyemLib_Sharp
private
static
extern
int
eyemAOIForTSAV
(
EyemImage
tpRefImg
,
EyemImage
tpNextImg
,
IntPtr
tpArray
,
int
iArraySize
);
private
static
extern
int
eyemAOIForTSAV
(
EyemImage
tpRefImg
,
EyemImage
tpNextImg
,
IntPtr
tpArray
,
int
iArraySize
);
#
endregion
#
endregion
// 日志回调
public
delegate
void
TCallBack
(
string
msg
);
public
static
TCallBack
sld
=
new
TCallBack
(
TLogCallback
);
public
static
event
TCallBack
OnNewLogCallback
;
public
static
void
TLogCallback
(
string
msg
)
{
OnNewLogCallback
?.
Invoke
(
msg
);
}
public
static
void
Init
()
{
setLogCallback
(
sld
);
OnNewLogCallback
+=
new
TCallBack
(
EyemLib_OnNewLogCallback
);
}
private
static
void
EyemLib_OnNewLogCallback
(
string
msg
)
{
Console
.
WriteLine
(
msg
);
}
public
static
void
Free
()
{
setLogCallback
(
null
);
sld
=
null
;
}
public
static
void
eyemReadImageTool
(
string
fileName
)
public
static
void
eyemReadImageTool
(
string
fileName
)
{
{
...
@@ -975,8 +1006,8 @@ namespace eyemLib_Sharp
...
@@ -975,8 +1006,8 @@ namespace eyemLib_Sharp
tpRoi2
.
iWidth
=
28
;
tpRoi2
.
iWidth
=
28
;
tpRoi2
.
iHeight
=
9
;
tpRoi2
.
iHeight
=
9
;
double
matchDeg
=
0.80
;
//
double matchDeg = 0.80;
flag
=
eyemCreateTemplateModel
(
tpDstImg
,
tpRoi2
,
matchDeg
,
"D:\\模板文件\\"
+
file
.
Replace
(
".png"
,
".tpl"
));
//
flag = eyemCreateTemplateModel(tpDstImg, tpRoi2, matchDeg, "D:\\模板文件\\" + file.Replace(".png", ".tpl"));
//加载模板到内存
//加载模板到内存
IntPtr
hModelID
=
IntPtr
.
Zero
;
IntPtr
hModelID
=
IntPtr
.
Zero
;
...
...
eyemLib-Sharp/Program.cs
查看文件 @
7ca2222
...
@@ -10,11 +10,14 @@ namespace eyemLib_Sharp
...
@@ -10,11 +10,14 @@ namespace eyemLib_Sharp
{
{
static
void
Main
(
string
[]
args
)
static
void
Main
(
string
[]
args
)
{
{
//初始化
EyemLib
.
Init
();
string
[]
fileNames
=
Directory
.
GetFiles
(
@"D:\批量测试图像\", "
*.*
", SearchOption.AllDirectories);
string
[]
fileNames
=
Directory
.
GetFiles
(
@"D:\批量测试图像\", "
*.*
", SearchOption.AllDirectories);
//for (int j = 0; j < 250; j++)
//for (int j = 0; j < 250; j++)
//{
//{
// ParallelOptions po = new ParallelOptions();
// ParallelOptions po = new ParallelOptions();
// po.MaxDegreeOfParallelism =
3
;
// po.MaxDegreeOfParallelism =
2
;
// Parallel.ForEach(fileNames, po, fn =>
// Parallel.ForEach(fileNames, po, fn =>
// {
// {
// EyemLib.eyemReadImageTool(fn);
// EyemLib.eyemReadImageTool(fn);
...
@@ -23,16 +26,16 @@ namespace eyemLib_Sharp
...
@@ -23,16 +26,16 @@ namespace eyemLib_Sharp
//}
//}
//EyemLib.eyemTest2(fileNames);
//EyemLib.eyemTest2(fileNames);
//foreach (var item in fileNames)
foreach
(
var
item
in
fileNames
)
//{
// EyemLib.eyemReadImageTool(item);
//}
for
(
int
i
=
0
;
i
<
1
;
i
++)
{
{
EyemLib
.
eyem
TestVideoCapture
(
"D:\\插件完成检测\\视频\\cap5.mp4"
);
EyemLib
.
eyem
ReadImageTool
(
item
);
}
}
//for (int i = 0; i < 1; i++)
//{
// EyemLib.eyemTestVideoCapture("D:\\插件完成检测\\视频\\cap5.mp4");
//}
//IntPtr hModelID;
//IntPtr hModelID;
//EyemLib.eyemInitModelE(out hModelID);
//EyemLib.eyemInitModelE(out hModelID);
...
@@ -61,6 +64,8 @@ namespace eyemLib_Sharp
...
@@ -61,6 +64,8 @@ namespace eyemLib_Sharp
//EyemLib.eyemReleaseModelE(ref hModelID);
//EyemLib.eyemReleaseModelE(ref hModelID);
EyemLib
.
Free
();
Console
.
Write
(
"请按任意键继续。。。"
);
Console
.
Write
(
"请按任意键继续。。。"
);
Console
.
ReadKey
();
Console
.
ReadKey
();
}
}
...
...
eyemLib/eyemGeneric.h
查看文件 @
7ca2222
#pragma once
#pragma once
//
//
// eyem
Edge
ͷ
// eyem
Generic
ͷ
//
//
#ifndef __EYEM_GENERIC_H
#ifndef __EYEM_GENERIC_H
#define __EYEM_GENERIC_H
#define __EYEM_GENERIC_H
...
...
eyemLib/eyemLib.cpp
查看文件 @
7ca2222
#include "eyemLib.h"
#include "eyemLib.h"
int
main
()
TCallback
g_logger_cb
=
NULL
;
void
Logger
::
t
(
const
std
::
string
&
msg
)
{
std
::
string
message
(
prefix_
);
message
+=
msg
;
if
(
g_logger_cb
)
g_logger_cb
(
message
.
c_str
());
}
// 趨־
void
setLogCallback
(
TCallback
cb
)
{
if
(
!
g_logger_cb
)
{
g_logger_cb
=
cb
;
}
}
void
main
()
{
{
char
*
filename
=
"D:
\\
Matlabͼ
\\
circle_plate_04.png"
;
char
*
filename
=
"D:
\\
Matlabͼ
\\
circle_plate_04.png"
;
cv
::
Mat
src
=
cv
::
imread
(
filename
,
cv
::
IMREAD_UNCHANGED
);
cv
::
Mat
src
=
cv
::
imread
(
filename
,
cv
::
IMREAD_UNCHANGED
);
//EyemImage tpImage;
//tpImage.iHeight = src.rows;
//tpImage.iWidth = src.cols;
//tpImage.ucpImage = src.data;
//EyemRect tpRoi;
//tpRoi.iXs = 0;
//tpRoi.iYs = 0;
//tpRoi.iWidth = src.cols;
//tpRoi.iHeight = src.rows;
//int blobNum;
//IntPtr intptr;
//EyemBinBlob *blobs;
//eyemBinBlob(tpImage, tpRoi, 120, EYEM_BIN_WHITE, 1200, &intptr, &blobs, &blobNum);
////must be dispose
//eyemBinFree(intptr);
return
0
;
if
(
src
.
empty
())
{
return
;
}
return
;
}
}
\ No newline at end of file
\ No newline at end of file
eyemLib/eyemLib.h
查看文件 @
7ca2222
...
@@ -17,6 +17,7 @@
...
@@ -17,6 +17,7 @@
#define MAKETYPE CV_MAKETYPE
#define MAKETYPE CV_MAKETYPE
#endif
#endif
/********************************************************************************************/
/********************************************************************************************/
/* 通用标头 */
/* 通用标头 */
/********************************************************************************************/
/********************************************************************************************/
...
@@ -864,4 +865,20 @@ extern "C" {
...
@@ -864,4 +865,20 @@ extern "C" {
#endif
#endif
// 日志回调定义
typedef
void
(
__stdcall
*
TCallback
)(
const
char
*
msg
);
class
Logger
{
public
:
Logger
(
const
std
::
string
prefix
=
""
)
:
prefix_
(
prefix
)
{}
public
:
void
t
(
const
std
::
string
&
msg
);
private
:
std
::
string
prefix_
;
};
extern
"C"
__declspec
(
dllexport
)
void
setLogCallback
(
TCallback
cb
);
#endif
/* __EYEM_LIB_H */
#endif
/* __EYEM_LIB_H */
eyemLib/eyemLib.rc
查看文件 @
7ca2222
此文件类型无法预览
eyemLib/eyemMisc.cpp
查看文件 @
7ca2222
...
@@ -271,14 +271,19 @@ trackMat 输入文件名
...
@@ -271,14 +271,19 @@ trackMat 输入文件名
*/
*/
static
void
loadTrackModel
(
const
char
*
fileName
,
cv
::
OutputArray
tplMat
,
cv
::
Point
&
pt
,
double
&
dMatchDeg
)
static
void
loadTrackModel
(
const
char
*
fileName
,
cv
::
OutputArray
tplMat
,
cv
::
Point
&
pt
,
double
&
dMatchDeg
)
{
{
std
::
string
logModule
=
""
;
logModule
+=
__func__
;
struct
stat
_Stat
;
struct
stat
_Stat
;
if
(
stat
(
fileName
,
&
_Stat
)
!=
0
)
if
(
stat
(
fileName
,
&
_Stat
)
!=
0
)
return
;
return
;
//上锁
//上锁
logger
.
t
(
"["
+
logModule
+
"]"
+
"上锁..."
);
mtx_misc
.
lock
();
mtx_misc
.
lock
();
logger
.
t
(
"["
+
logModule
+
"]"
+
"打开文件..."
);
FILE
*
fps
=
NULL
;
FILE
*
fps
=
NULL
;
fopen_s
(
&
fps
,
fileName
,
"r"
);
fopen_s
(
&
fps
,
fileName
,
"r"
);
...
@@ -299,15 +304,19 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
...
@@ -299,15 +304,19 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
memset
(
_Data
,
0
,
_Size
);
memset
(
_Data
,
0
,
_Size
);
//读取数据
//读取数据
logger
.
t
(
"["
+
logModule
+
"]"
+
"读取数据..."
);
fread
(
_Data
,
sizeof
(
uint8_t
),
_Size
,
fps
);
fread
(
_Data
,
sizeof
(
uint8_t
),
_Size
,
fps
);
//关闭文件
//关闭文件
logger
.
t
(
"["
+
logModule
+
"]"
+
"关闭文件..."
);
fclose
(
fps
);
fclose
(
fps
);
//解锁
//解锁
logger
.
t
(
"["
+
logModule
+
"]"
+
"解锁..."
);
mtx_misc
.
unlock
();
mtx_misc
.
unlock
();
//获取图像数据大小
//获取图像数据大小
logger
.
t
(
"["
+
logModule
+
"]"
+
"拷贝头数据..."
);
unsigned
char
_SizeData
[
8
];
unsigned
char
_SizeData
[
8
];
memcpy
(
_SizeData
,
_Data
,
8
);
memcpy
(
_SizeData
,
_Data
,
8
);
...
@@ -318,27 +327,33 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
...
@@ -318,27 +327,33 @@ static void loadTrackModel(const char *fileName, cv::OutputArray tplMat, cv::Poi
const
int
tplSize
=
_Size
-
valSize
-
8
;
const
int
tplSize
=
_Size
-
valSize
-
8
;
//拷贝文件信息
//拷贝文件信息
logger
.
t
(
"["
+
logModule
+
"]"
+
"拷贝文件信息..."
);
char
*
tplInfo
=
new
char
[
tplSize
];
char
*
tplInfo
=
new
char
[
tplSize
];
memcpy
(
tplInfo
,
_Data
+
valSize
+
8
,
tplSize
);
memcpy
(
tplInfo
,
_Data
+
valSize
+
8
,
tplSize
);
//获取文件信息
//获取文件信息
logger
.
t
(
"["
+
logModule
+
"]"
+
"分割字符串..."
);
std
::
string
line
(
tplInfo
);
std
::
string
line
(
tplInfo
);
std
::
vector
<
std
::
string
>
hints
;
std
::
vector
<
std
::
string
>
hints
;
split
(
line
,
","
,
hints
);
split
(
line
,
","
,
hints
);
//宽,高,坐标,匹配度
//宽,高,坐标,匹配度
logger
.
t
(
"["
+
logModule
+
"]"
+
"类型转换..."
);
int
X
=
std
::
atoi
(
hints
[
2
].
c_str
()),
Y
=
std
::
atoi
(
hints
[
3
].
c_str
());
int
X
=
std
::
atoi
(
hints
[
2
].
c_str
()),
Y
=
std
::
atoi
(
hints
[
3
].
c_str
());
dMatchDeg
=
std
::
atof
(
hints
[
4
].
substr
(
0
,
4
).
c_str
());
pt
=
cv
::
Point
(
std
::
atoi
(
hints
[
0
].
c_str
()),
std
::
atoi
(
hints
[
1
].
c_str
()));
dMatchDeg
=
std
::
atof
(
hints
[
4
].
substr
(
0
,
4
).
c_str
());
pt
=
cv
::
Point
(
std
::
atoi
(
hints
[
0
].
c_str
()),
std
::
atoi
(
hints
[
1
].
c_str
()));
//创建图像文件
//创建图像文件
logger
.
t
(
"["
+
logModule
+
"]"
+
"创建图像..."
);
tplMat
.
create
(
Y
,
X
,
CV_8UC1
,
-
1
,
true
);
tplMat
.
create
(
Y
,
X
,
CV_8UC1
,
-
1
,
true
);
//拷贝数据
//拷贝数据
logger
.
t
(
"["
+
logModule
+
"]"
+
"拷贝图像数据..."
);
cv
::
Mat
_tplMat
=
tplMat
.
getMat
();
cv
::
Mat
_tplMat
=
tplMat
.
getMat
();
memcpy
(
_tplMat
.
data
,
_Data
+
8
,
valSize
);
memcpy
(
_tplMat
.
data
,
_Data
+
8
,
valSize
);
//释放内存
//释放内存
logger
.
t
(
"["
+
logModule
+
"]"
+
"释放内存..."
);
delete
[]
tplInfo
;
delete
[]
tplInfo
;
tplInfo
=
NULL
;
tplInfo
=
NULL
;
...
@@ -450,7 +465,7 @@ static double getThreshVal_Otsu_8u(const cv::Mat& _src)
...
@@ -450,7 +465,7 @@ static double getThreshVal_Otsu_8u(const cv::Mat& _src)
size
.
width
*=
size
.
height
;
size
.
width
*=
size
.
height
;
size
.
height
=
1
;
size
.
height
=
1
;
step
=
size
.
width
;
step
=
size
.
width
;
}
}
#ifdef HAVE_IPP
#ifdef HAVE_IPP
unsigned
char
thresh
=
0
;
unsigned
char
thresh
=
0
;
...
@@ -4690,7 +4705,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
...
@@ -4690,7 +4705,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
{
{
cv
::
line
(
cc
,
ptsT
[
j
],
ptsT
[(
j
+
1
)
%
4
],
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
cv
::
line
(
cc
,
ptsT
[
j
],
ptsT
[(
j
+
1
)
%
4
],
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
}
}
}
}
#endif
#endif
...
@@ -4749,170 +4764,170 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
...
@@ -4749,170 +4764,170 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
//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;
trackEnd
=
(
!
found
);
trackEnd
=
(
!
found
);
}
while
(
!
trackEnd
);
}
while
(
!
trackEnd
);
}
}
#if OPTIMIZE_ON
#if OPTIMIZE_ON
,
,
[
&
]
[
&
]
#endif
#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
;
cv
::
Point2f
trackCenter
(
startCenter
.
x
,
startCenter
.
y
);
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
)
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
;
trackCenter
.
x
=
float
(
reelCenter
.
x
+
trackRadius
*
cos
(
t
*
c
));
std
::
vector
<
Track
>
vParts
;
trackCenter
.
y
=
float
(
reelCenter
.
y
+
trackRadius
*
sin
(
t
*
c
));
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
);
//模板匹配
//计算旋转矩形
double
maxyyu
;
cv
::
Point2f
maxyyuloc
;
calcRotateRect
(
trackCenter
,
(
float
)
t
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
t
+
180.0
),
trackWidth
,
pts
,
(
255
-
backT
),
false
,
maxyyu
,
maxyyuloc
,
cv
::
noArray
());
//最小匹配结果
//模板匹配
if
(
maxyyu
>
0.15
)
{
double
maxyyu
;
cv
::
Point2f
maxyyuloc
;
//存放结果
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
t
+
180.0
),
trackWidth
,
pts
,
(
255
-
backT
),
false
,
maxyyu
,
maxyyuloc
,
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);
if
(
maxyyu
>
0.15
)
{
//存放结果
vParts
.
push_back
(
Track
(
0
,
0
,
maxyyu
,
cv
::
Point
(
cvRound
(
trackCenter
.
x
),
cvRound
(
trackCenter
.
y
)),
std
::
vector
<
cv
::
Point2f
>
()));
}
}
if
(
vParts
.
size
()
==
0
)
break
;
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
//测试标记
trackCenter
=
cv
::
Point2f
((
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
x
,
(
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
y
);
//cv::drawMarker(cc, cv::Point(cvRound(trackCenter.x), cvRound(trackCenter.y)), cv::Scalar(0, 165, 255, 255), 0, 5);
}
if
(
vParts
.
size
()
==
0
)
break
;
//理论元件区域
//更新切线方向位置,由于这个方向是元件间隙不会有太大偏差
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
);
trackCenter
=
cv
::
Point2f
((
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
x
,
(
float
)
vParts
[
vParts
.
size
()
/
2
].
Pos
.
y
);
//更新扫描角度
//理论元件区域
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
cv
::
Point2f
trackCenterT
(
trackCenter
.
x
,
trackCenter
.
y
)
;
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
//更新扫描角度
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
///<开始离心/向心扫描(横向由于间隔固定所以一般不会出现偏离的情况,除非料盘本身严重变形或者中心定位出问题)
//模板匹配/更新元件精确位置+判断
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
pts
);
double
maxyyu
;
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backT), false, maxyyu, trackCenter, cv::noArray());
//
//模板匹配/更新元件精确位置+判断
bool
trayEnd
=
false
;
double
maxyyu
;
if
(
true
)
{
//findTrackModel(srcPrev, tplMat, 90.0 - (trackAngle + 180.0), trackWidth, pts, (255 - backT), false, maxyyu, trackCenter, cv::noArray());
//考虑增加[-2,2]角度范围以应对料盘变形
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backT
),
true
,
maxyyu
,
trackCenter
,
binary
);
}
//if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){
//
// std::cout << "xx" << std::endl;
bool
trayEnd
=
false
;
//}
if
(
true
)
{
//考虑增加[-2,2]角度范围以应对料盘变形
trayEnd
=
findTrackModel
(
srcPrev
,
tplMat
,
90.0
-
(
trackAngle
+
180.0
),
trackWidth
,
pts
,
(
255
-
backT
),
true
,
maxyyu
,
trackCenter
,
binary
);
}
//更新扫描半径
//if (cvRound(trackCenter.x) == 1356 && cvRound(trackCenter.y) == 1812){
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
// std::cout << "xx" << std::endl;
//更新扫描角度
//}
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
);
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
#ifdef _DEBUG
cv
::
Point2f
ptsT
[
4
];
cv
::
Point2f
ptsT
[
4
];
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
ptsT
);
calcRotateRect
(
trackCenter
,
(
float
)
trackAngle
,
(
float
)
trackLength
,
(
float
)
trackWidth
,
ptsT
);
if
(
!
trayEnd
)
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
);
for
(
int
j
=
0
;
j
<
4
;
j
++
)
{
cv
::
line
(
cc
,
ptsT
[
j
],
ptsT
[(
j
+
1
)
%
4
],
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
}
}
}
}
#endif
#endif
//判断是否追踪终止
//判断是否追踪终止
if
(
trayEnd
)
if
(
trayEnd
)
{
{
//不再判断,大概率已经终止
//不再判断,大概率已经终止
found
=
false
;
found
=
false
;
}
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenterT
.
y
))[
cvRound
(
trackCenterT
.
x
)]
==
255
)
{
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenterT
.
y
))[
cvRound
(
trackCenterT
.
x
)]
==
255
)
{
//不再判断,大概率已经终止
//不再判断,大概率已经终止
found
=
false
;
found
=
false
;
}
}
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
==
255
)
{
else
if
(
trackMat
.
ptr
<
uint8_t
>
(
cvRound
(
trackCenter
.
y
))[
cvRound
(
trackCenter
.
x
)]
==
255
)
{
//判断可能并未终止,遂采用理论位置作为下一个元件位置
//判断可能并未终止,遂采用理论位置作为下一个元件位置
trackCenter
=
trackCenterT
;
trackCenter
=
trackCenterT
;
///<更新追踪信息
///<更新追踪信息
//更新扫描半径
//更新扫描半径
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
trackRadius
=
cv
::
norm
(
trackCenter
-
reelCenter
);
//更新扫描角度
//更新扫描角度
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
trackAngle
=
atan2
((
double
)
trackCenter
.
y
-
reelCenter
.
y
,
(
double
)
trackCenter
.
x
-
reelCenter
.
x
)
*
180
/
PI
;
//更新偏移量
//更新偏移量
trackOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
trackRadius
)))
*
180
/
PI
;
trackOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
trackRadius
)))
*
180
/
PI
;
//更新元件间角度
//更新元件间角度
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
);
//标记为已追踪过
//标记为已追踪过
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
;
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
;
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);
}
}
trackEnd
=
(
!
found
);
trackEnd
=
(
!
found
);
}
while
(
!
trackEnd
);
}
while
(
!
trackEnd
);
}
}
#if OPTIMIZE_ON
#if OPTIMIZE_ON
);
);
#endif
#endif
}
}
...
@@ -5095,10 +5110,14 @@ int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, double dMinScore,
...
@@ -5095,10 +5110,14 @@ int eyemCreateTemplateModel(EyemImage tpImage, EyemRect tpRoi, double dMinScore,
int
eyemInitModel
(
const
char
*
ccTplName
,
IntPtr
*
hModelID
)
int
eyemInitModel
(
const
char
*
ccTplName
,
IntPtr
*
hModelID
)
{
{
std
::
string
logModule
=
""
;
logModule
+=
__func__
;
logger
.
t
(
"["
+
logModule
+
"]"
+
"初始化模板..."
);
//获取文件路径
//获取文件路径
std
::
vector
<
std
::
string
>
fileNames
;
std
::
vector
<
std
::
string
>
fileNames
;
cv
::
glob
(
ccTplName
,
fileNames
);
cv
::
glob
(
ccTplName
,
fileNames
);
logger
.
t
(
"["
+
logModule
+
"]"
+
"获取文件名..."
);
//判断文件
//判断文件
if
(
fileNames
.
size
()
<=
0
)
if
(
fileNames
.
size
()
<=
0
)
return
FUNC_CANNOT_CALC
;
return
FUNC_CANNOT_CALC
;
...
@@ -5112,10 +5131,11 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
...
@@ -5112,10 +5131,11 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
cv
::
Mat
tplMat
;
double
matchDeg
;
cv
::
Mat
tplMat
;
double
matchDeg
;
try
try
{
{
logger
.
t
(
"["
+
logModule
+
"]"
+
"根据文件名加载模板..."
);
loadTrackModel
(
fileName
.
c_str
(),
tplMat
,
cv
::
Point
(),
matchDeg
);
loadTrackModel
(
fileName
.
c_str
(),
tplMat
,
cv
::
Point
(),
matchDeg
);
}
}
catch
(...)
{
catch
(...)
{
logger
.
t
(
"["
+
logModule
+
"]"
+
"加载模板异常..."
);
return
FUNC_CANNOT_CALC
;
return
FUNC_CANNOT_CALC
;
}
}
...
@@ -5130,12 +5150,14 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
...
@@ -5130,12 +5150,14 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
int
_Size
=
tplMat
.
cols
*
tplMat
.
rows
*
sizeof
(
unsigned
char
);
int
_Size
=
tplMat
.
cols
*
tplMat
.
rows
*
sizeof
(
unsigned
char
);
//数据
//数据
logger
.
t
(
"["
+
logModule
+
"]"
+
"分配模板图像内存..."
);
modelID
.
vpImage
=
(
unsigned
char
*
)
malloc
(
_Size
);
modelID
.
vpImage
=
(
unsigned
char
*
)
malloc
(
_Size
);
if
(
NULL
==
modelID
.
vpImage
)
if
(
NULL
==
modelID
.
vpImage
)
return
FUNC_NOT_ENOUGH_MEM
;
return
FUNC_NOT_ENOUGH_MEM
;
//拷贝数据
//拷贝数据
logger
.
t
(
"["
+
logModule
+
"]"
+
"拷贝模板数据..."
);
memcpy
(
modelID
.
vpImage
,
_tplMat
.
data
,
_Size
);
memcpy
(
modelID
.
vpImage
,
_tplMat
.
data
,
_Size
);
//位置
//位置
...
@@ -5148,6 +5170,7 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
...
@@ -5148,6 +5170,7 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
modelID
.
dMatchDeg
=
matchDeg
;
modelID
.
dMatchDeg
=
matchDeg
;
//名称?会导致内存泄露吗
//名称?会导致内存泄露吗
logger
.
t
(
"["
+
logModule
+
"]"
+
"分配模板文件名内存..."
);
modelID
.
lpszName
=
(
char
*
)
CoTaskMemAlloc
(
128
);
modelID
.
lpszName
=
(
char
*
)
CoTaskMemAlloc
(
128
);
if
(
NULL
!=
modelID
.
lpszName
)
if
(
NULL
!=
modelID
.
lpszName
)
{
{
...
@@ -5157,7 +5180,8 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
...
@@ -5157,7 +5180,8 @@ int eyemInitModel(const char *ccTplName, IntPtr *hModelID)
}
}
else
return
FUNC_NOT_ENOUGH_MEM
;
else
return
FUNC_NOT_ENOUGH_MEM
;
//压入堆栈
//压入容器
logger
.
t
(
"["
+
logModule
+
"]"
+
"将模板压入容器..."
);
tpModelID
->
push_back
(
modelID
);
tpModelID
->
push_back
(
modelID
);
}
}
}
}
...
@@ -5578,9 +5602,9 @@ int eyemTrackFeature(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois,
...
@@ -5578,9 +5602,9 @@ int eyemTrackFeature(EyemImage tpRefImg, EyemImage tpNextImg, EyemRect3 *tpRois,
}
}
}
}
cv
::
imshow
(
"eyemLib"
,
showMat
);
//
cv::imshow("eyemLib", showMat);
cv
::
waitKey
(
1
);
//
cv::waitKey(1);
///<输出结果图像
///<输出结果图像
{
{
...
...
eyemLib/eyemMisc.h
查看文件 @
7ca2222
...
@@ -16,5 +16,7 @@ constexpr double c = PI / 180.;
...
@@ -16,5 +16,7 @@ constexpr double c = PI / 180.;
std
::
mutex
mtx_misc
;
std
::
mutex
mtx_misc
;
Logger
logger
;
#endif
/* __EYEM_MISC_H */
#endif
/* __EYEM_MISC_H */
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论