Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
张士柳
/
eyemLib
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
图表
网络
创建新的问题
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit ee8a6917
由
张士柳
编写于
2021-04-20 10:51:18 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
无
1 个父辈
c34cb244
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
182 行增加
和
87 行删除
eyemLib-Sharp/EyemLib.cs
eyemLib-Sharp/Program.cs
eyemLib/eyemMisc.cpp
eyemLib-Sharp/EyemLib.cs
查看文件 @
ee8a691
...
@@ -2,7 +2,6 @@
...
@@ -2,7 +2,6 @@
using
System
;
using
System
;
using
System.Runtime.InteropServices
;
using
System.Runtime.InteropServices
;
using
System.Diagnostics
;
using
System.Diagnostics
;
using
System.Linq
;
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.Drawing
;
using
System.Drawing
;
using
System.Drawing.Imaging
;
using
System.Drawing.Imaging
;
...
@@ -1007,18 +1006,18 @@ namespace eyemLib_Sharp
...
@@ -1007,18 +1006,18 @@ namespace eyemLib_Sharp
EyemRect
tpRoi
=
new
EyemRect
();
EyemRect
tpRoi
=
new
EyemRect
();
tpRoi
.
iXs
=
200
;
tpRoi
.
iYs
=
20
0
;
tpRoi
.
iXs
=
50
;
tpRoi
.
iYs
=
5
0
;
tpRoi
.
iWidth
=
image
.
iWidth
-
4
00
;
tpRoi
.
iWidth
=
image
.
iWidth
-
1
00
;
tpRoi
.
iHeight
=
image
.
iHeight
-
4
00
;
tpRoi
.
iHeight
=
image
.
iHeight
-
1
00
;
//
//
string
pNumObj
=
""
;
string
pNumObj
=
""
;
string
file
=
fileName
.
Split
(
new
string
[]
{
"\\"
},
StringSplitOptions
.
RemoveEmptyEntries
)[
2
];
string
file
=
fileName
.
Split
(
new
string
[]
{
"\\"
},
StringSplitOptions
.
RemoveEmptyEntries
)[
2
];
//获取用于制作模板的图像
//获取用于制作模板的图像
flag
=
eyemAchvTemplateImage
(
image
,
tpRoi
,
out
tpDstImg
);
//
flag = eyemAchvTemplateImage(image, tpRoi, out tpDstImg);
Bitmap
bitmap
=
eyemCvtToBitmap
(
tpDstImg
);
//
Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
//if (bitmap != null)
//if (bitmap != null)
//{
//{
...
@@ -1034,28 +1033,28 @@ namespace eyemLib_Sharp
...
@@ -1034,28 +1033,28 @@ namespace eyemLib_Sharp
//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;
flag
=
eyemInitModel
(
"D:\\模板文件"
,
out
hModelID
);
//
flag = eyemInitModel("D:\\模板文件", out hModelID);
string
selectModel
=
""
;
//
string selectModel = "";
flag
=
eyemMatchTemplateModel
(
tpDstImg
,
hModelID
,
ref
selectModel
);
//
flag = eyemMatchTemplateModel(tpDstImg, hModelID, ref selectModel);
//插入模板
//
//
插入模板
flag
=
eyemInsertModel
(
hModelID
,
"D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl"
);
//
flag = eyemInsertModel(hModelID, "D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl");
string
[]
tpModels
=
selectModel
.
Split
(
new
char
[]
{
','
},
StringSplitOptions
.
RemoveEmptyEntries
);
//
string[] tpModels = selectModel.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if
(
tpModels
.
Length
<=
0
)
//
if (tpModels.Length <= 0)
{
//
{
logcpp
.
WriteLog
(
"选择模板少于0"
);
//
logcpp.WriteLog("选择模板少于0");
return
;
//
return;
}
//
}
//根据名称获取模板
//
//
根据名称获取模板
EyemModelID
tpModelID
=
new
EyemModelID
();
//
EyemModelID tpModelID = new EyemModelID();
eyemAchvModelByName
(
tpModels
[
0
],
hModelID
,
ref
tpModelID
);
//
eyemAchvModelByName(tpModels[0], hModelID, ref tpModelID);
//EyemImage tpModeImg = new EyemImage();
//EyemImage tpModeImg = new EyemImage();
//tpModeImg.iChannels = 1; tpModeImg.iDepth = 0;
//tpModeImg.iChannels = 1; tpModeImg.iDepth = 0;
...
@@ -1069,24 +1068,24 @@ namespace eyemLib_Sharp
...
@@ -1069,24 +1068,24 @@ namespace eyemLib_Sharp
//}
//}
//最好释放掉,如果对象供其他接口使用要先释放
//最好释放掉,如果对象供其他接口使用要先释放
eyemImageFree
(
ref
tpDstImg
);
//
eyemImageFree(ref tpDstImg);
//"IP_SMALL_PARTS","IP_LARGE_PARTS","IP_LONG_PARTS",""
//"IP_SMALL_PARTS","IP_LARGE_PARTS","IP_LONG_PARTS",""
//eyemCountObject(image, tpRoi, file.Replace(".png", ""), 35, 0, 100, 5, ref pNumObj, out tpDstImg);
//eyemCountObject(image, tpRoi, file.Replace(".png", ""), 35, 0, 100, 5, ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularParts(image, tpRoi, file.Replace(".png", ""), 0.1, "
IP_LARGE_PARTS
", 100, 7, ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularParts(image, tpRoi, file.Replace(".png", ""), 0.1, "", 100, 7, ref pNumObj, out tpDstImg);
//
eyemCountObjectE(image, tpRoi, fileName, ref pNumObj, out tpDstImg);
eyemCountObjectE
(
image
,
tpRoi
,
fileName
,
ref
pNumObj
,
out
tpDstImg
);
eyemCountObjectIrregularPartsE
(
image
,
tpRoi
,
file
.
Replace
(
".png"
,
""
),
tpModels
[
0
],
hModelID
,
ref
pNumObj
,
out
tpDstImg
);
//
eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), tpModels[0], hModelID, ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), "D:\\模板文件\\" + /*file.Replace(".png", ".tpl")*/"74d571ed-9fd4-4959-85dd-3195261e4b48.tpl", ref pNumObj, out tpDstImg);
//eyemCountObjectIrregularPartsE(image, tpRoi, file.Replace(".png", ""), "D:\\模板文件\\" + /*file.Replace(".png", ".tpl")*/"74d571ed-9fd4-4959-85dd-3195261e4b48.tpl", ref pNumObj, out tpDstImg);
//移除模板
//移除模板
flag
=
eyemRemoveModelByName
(
hModelID
,
"D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl"
);
//
flag = eyemRemoveModelByName(hModelID, "D:\\模板文件及图像\\df871193-6632-48f9-abfe-540c3fc49c3f.tpl");
//
Bitmap bitmap = eyemCvtToBitmap(tpDstImg);
Bitmap
bitmap
=
eyemCvtToBitmap
(
tpDstImg
);
//
if (bitmap != null)
if
(
bitmap
!=
null
)
//
{
{
//
bitmap.Save(System.Windows.Forms.Application.StartupPath + "\\ResOut\\" + file);
bitmap
.
Save
(
System
.
Windows
.
Forms
.
Application
.
StartupPath
+
"\\ResOut\\"
+
file
);
//
}
}
////<解码测试
////<解码测试
//int ipNum; EyemBarCode* tpResults;
//int ipNum; EyemBarCode* tpResults;
...
@@ -1100,10 +1099,10 @@ namespace eyemLib_Sharp
...
@@ -1100,10 +1099,10 @@ namespace eyemLib_Sharp
//hObject.Dispose();
//hObject.Dispose();
sw
.
Stop
();
sw
.
Stop
();
Console
.
WriteLine
(
"耗时:"
+
sw
.
ElapsedMilliseconds
.
ToString
()
+
",结果:"
+
pNumObj
);
Console
.
WriteLine
(
file
+
"--->"
+
"耗时:"
+
sw
.
ElapsedMilliseconds
.
ToString
()
+
",结果:"
+
pNumObj
);
//在关闭程序时释放
//在关闭程序时释放
eyemReleaseModel
(
ref
hModelID
);
//
eyemReleaseModel(ref hModelID);
//free image
//free image
eyemImageFree
(
ref
tpDstImg
);
eyemImageFree
(
ref
tpDstImg
);
eyemImageFree
(
ref
image
);
eyemImageFree
(
ref
image
);
...
...
eyemLib-Sharp/Program.cs
查看文件 @
ee8a691
...
@@ -17,10 +17,10 @@ namespace eyemLib_Sharp
...
@@ -17,10 +17,10 @@ namespace eyemLib_Sharp
}
}
//初始化
//初始化
EyemLib
.
Init
();
//
EyemLib.Init();
string
[]
fileNames
=
Directory
.
GetFiles
(
@"D:\批量测试图像\", "
*.*
", SearchOption.AllDirectories);
string
[]
fileNames
=
Directory
.
GetFiles
(
@"D:\批量测试图像\", "
*.*
", SearchOption.AllDirectories);
for
(
int
j
=
0
;
j
<
1
250
;
j
++)
for
(
int
j
=
0
;
j
<
1
;
j
++)
{
{
ParallelOptions
po
=
new
ParallelOptions
();
ParallelOptions
po
=
new
ParallelOptions
();
po
.
MaxDegreeOfParallelism
=
1
;
po
.
MaxDegreeOfParallelism
=
1
;
...
@@ -69,7 +69,7 @@ namespace eyemLib_Sharp
...
@@ -69,7 +69,7 @@ namespace eyemLib_Sharp
//EyemLib.eyemReleaseModelE(ref hModelID);
//EyemLib.eyemReleaseModelE(ref hModelID);
EyemLib
.
Free
();
//
EyemLib.Free();
Console
.
Write
(
"请按任意键继续。。。"
);
Console
.
Write
(
"请按任意键继续。。。"
);
Console
.
ReadKey
();
Console
.
ReadKey
();
...
...
eyemLib/eyemMisc.cpp
查看文件 @
ee8a691
...
@@ -3166,44 +3166,133 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
...
@@ -3166,44 +3166,133 @@ int eyemCountObjectIrregularParts(EyemImage tpImage, EyemRect tpRoi, const char
//普通算法不做其他处理
//普通算法不做其他处理
else
else
{
{
//二值化
//先用自动算法点,如果不行判断为散料
cv
::
threshold
(
srcPrev
,
binary
,
0
,
255
,
cv
::
THRESH_BINARY
|
cv
::
THRESH_OTSU
);
LPSTR
trayNum
=
""
;
cv
::
morphologyEx
(
binary
,
binary
,
cv
::
MORPH_CLOSE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
75
,
75
)));
int
iRet
=
eyemCountObjectE
(
tpImage
,
tpRoi
,
""
,
&
trayNum
,
tpDstImg
);
//计算直方图
int
hist
[
256
];
if
(
iRet
==
FUNC_OK
)
{
for
(
int
y
=
0
;
y
<
256
;
y
++
)
hist
[
y
]
=
0
;
for
(
int
y
=
0
;
y
<
Y
;
y
++
)
cv
::
Mat
showCC
=
cv
::
Mat
(
tpDstImg
->
iHeight
,
tpDstImg
->
iWidth
,
MAKETYPE
(
tpDstImg
->
iDepth
,
tpDstImg
->
iChannels
),
tpDstImg
->
vpImage
);
{
uchar
*
uPtr
=
srcPrev
.
data
+
y
*
X
;
std
::
vector
<
std
::
string
>
trayNums
;
for
(
int
x
=
0
;
x
<
srcPrev
.
cols
;
x
++
,
uPtr
++
)
split
(
trayNum
,
","
,
trayNums
);
//输出结果
std
::
string
tTrayNum
=
""
;
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
{
if
(
(
binary
.
data
)[(
x
)
+
(
y
)
*
X
]
==
255
)
if
(
trayNums
[
i
]
!=
"0"
)
{
{
hist
[
*
uPtr
]
++
;
//输出结果
tTrayNum
=
trayNums
[
i
];
break
;
}
}
}
}
*
lpszNumObj
=
(
char
*
)
CoTaskMemAlloc
(
tTrayNum
.
size
()
+
1
);
if
(
NULL
!=
lpszNumObj
)
{
strcpy
(
*
lpszNumObj
,
tTrayNum
.
c_str
());
}
//获取当前运行目录
char
buf
[
128
];
_getcwd
(
buf
,
sizeof
(
buf
));
////不存在则创建
std
::
string
filePath
(
buf
);
filePath
+=
"
\\
ResOut"
;
if
(
_access
(
filePath
.
c_str
(),
0
)
==
-
1
)
_mkdir
(
filePath
.
c_str
());
//格式化文件名
char
file
[
256
];
sprintf_s
(
file
,
"%s
\\
%s-Mark.png"
,
filePath
.
c_str
(),
fileName
);
cv
::
imwrite
(
file
,
showCC
);
return
FUNC_OK
;
}
}
cv
::
threshold
(
srcPrev
,
binary
,
Otsu
(
hist
),
255
,
cv
::
THRESH_BINARY
);
else
{
//粗略计数
cv
::
Mat
labels
,
stats
,
centroids
;
//行判断为散料
int
numObj
=
cv
::
connectedComponentsWithStats
(
binary
,
labels
,
stats
,
centroids
);
cv
::
threshold
(
srcPrev
,
binary
,
0
,
255
,
cv
::
THRESH_BINARY
|
cv
::
THRESH_OTSU
);
//坐标图
cv
::
morphologyEx
(
binary
,
binary
,
cv
::
MORPH_DILATE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
75
,
75
)));
binary
=
cv
::
Scalar
(
0
);
//计算直方图
//画图
int
hist
[
256
];
double
*
dpCent
=
(
double
*
)
centroids
.
data
;
for
(
int
y
=
0
;
y
<
256
;
y
++
)
hist
[
y
]
=
0
;
for
(
int
j
=
1
;
j
<
numObj
;
j
++
)
for
(
int
y
=
0
;
y
<
Y
;
y
++
)
{
{
binary
.
at
<
uchar
>
(
cv
::
Point
(
cvRound
((
float
)
dpCent
[(
0
)
+
(
j
)
*
2
]),
cvRound
((
float
)
dpCent
[(
1
)
+
(
j
)
*
2
])))
=
255
;
uchar
*
uPtr
=
srcPrev
.
data
+
y
*
X
;
for
(
int
x
=
0
;
x
<
srcPrev
.
cols
;
x
++
,
uPtr
++
)
{
if
((
binary
.
data
)[(
x
)
+
(
y
)
*
X
]
==
255
)
{
hist
[
*
uPtr
]
++
;
}
}
}
cv
::
threshold
(
srcPrev
,
binary
,
Otsu
(
hist
),
255
,
cv
::
THRESH_BINARY
);
std
::
vector
<
std
::
vector
<
cv
::
Point
>>
contours
,
contourFilter
;
//连接在一起(散料用)
cv
::
Mat
binaryEx
;
cv
::
morphologyEx
(
binary
,
binaryEx
,
cv
::
MORPH_DILATE
,
cv
::
getStructuringElement
(
cv
::
MORPH_RECT
,
cv
::
Size
(
75
,
75
)));
//掩膜
cv
::
Mat
mask
(
Y
,
X
,
CV_8UC1
,
cv
::
Scalar
(
0
));
cv
::
findContours
(
binaryEx
,
contours
,
cv
::
RETR_EXTERNAL
,
cv
::
CHAIN_APPROX_NONE
);
for
(
int
i
=
0
;
i
<
contours
.
size
();
i
++
)
{
double
contourArea
=
cv
::
contourArea
(
contours
[
i
]);
if
(
contourArea
>
15000
)
{
////去掉中间部分
//cv::Moments mu = cv::moments(contours[i]);
//cv::Point2f reelCenter(float(mu.m10 / mu.m00), float(mu.m01 / mu.m00));
////标记当前位置
//cv::drawMarker(cc, reelCenter, cv::Scalar(0, 255, 0, 255), cv::MARKER_DIAMOND, 15);
//绘制掩膜
cv
::
drawContours
(
mask
,
contours
,
i
,
cv
::
Scalar
(
255
),
-
1
);
}
}
//粗略计数
cv
::
Mat
labels
,
stats
,
centroids
;
int
numObj
=
cv
::
connectedComponentsWithStats
(
binary
&
mask
,
labels
,
stats
,
centroids
);
//坐标图
binary
=
cv
::
Scalar
(
0
);
//画图
double
*
dpCent
=
(
double
*
)
centroids
.
data
;
for
(
int
j
=
1
;
j
<
numObj
;
j
++
)
{
//面积过滤
if
(
stats
.
ptr
<
int
>
(
j
)[
cv
::
CC_STAT_AREA
]
>
2
)
{
binary
.
at
<
uchar
>
(
cv
::
Point
(
cvRound
((
float
)
dpCent
[(
0
)
+
(
j
)
*
2
]),
cvRound
((
float
)
dpCent
[(
1
)
+
(
j
)
*
2
])))
=
255
;
}
}
}
}
}
}
//计数
//计数
std
::
vector
<
cv
::
Point
>
vLocations
;
std
::
vector
<
cv
::
Point
>
vLocations
;
cv
::
findNonZero
(
binary
,
vLocations
);
cv
::
findNonZero
(
binary
,
vLocations
);
for
(
int
c
=
0
;
c
<
vLocations
.
size
();
c
++
)
//画图
if
((
strcmp
(
ccSubType
,
""
)
==
0
)
|
(
strcmp
(
ccSubType
,
"IP_SMALL_PARTS"
)
==
0
))
{
{
cv
::
circle
(
cc
,
vLocations
[
c
],
1
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
1
);
for
(
int
c
=
0
;
c
<
vLocations
.
size
();
c
++
)
{
cv
::
circle
(
cc
,
vLocations
[
c
],
1
,
cv
::
Scalar
(
0
,
255
,
0
,
255
),
1
);
}
}
}
std
::
string
trayNum
=
std
::
to_string
(
vLocations
.
size
());
std
::
string
trayNum
=
std
::
to_string
(
vLocations
.
size
());
//画图显示
std
::
string
text
=
"Reel Number = "
+
trayNum
;
cv
::
putText
(
cc
,
text
,
cv
::
Point
(
35
,
35
),
0
,
1.0
,
cv
::
Scalar
(
0
,
140
,
255
,
255
),
2
);
//输出结果
//输出结果
*
lpszNumObj
=
(
char
*
)
CoTaskMemAlloc
(
trayNum
.
size
());
*
lpszNumObj
=
(
char
*
)
CoTaskMemAlloc
(
trayNum
.
size
());
if
(
NULL
!=
lpszNumObj
)
if
(
NULL
!=
lpszNumObj
)
...
@@ -3756,6 +3845,7 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
...
@@ -3756,6 +3845,7 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
return
dMatchDeg
>
te
.
dMatchDeg
;
return
dMatchDeg
>
te
.
dMatchDeg
;
}
}
};
};
//扫描步长
//扫描步长
const
double
dMinorStep
=
0.1
;
const
double
dMinorStep
=
0.1
;
//追踪长宽
//追踪长宽
...
@@ -3767,35 +3857,39 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
...
@@ -3767,35 +3857,39 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
//偏移角度(元件尺寸)
//偏移角度(元件尺寸)
const
double
dOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
startRadius
)))
*
180
/
PI
;
const
double
dOffset
=
(
2
*
asin
(
2
*
trackLength
/
(
2
*
startRadius
)))
*
180
/
PI
;
//偏移角度(元件间距)
//偏移角度(元件间距)
const
double
dScanRange
=
15
;
const
double
dScanRange
=
15
;
//默认15°范围内一定有第二个料
//追踪元件间距(弦长,可以尽量避免因个别器件偏离导致的追踪中断)
//追踪元件间距(弦长,可以尽量避免因个别器件偏离导致的追踪中断
,只需要计算一次?
)
double
dChordL
=
.0
;
double
dChordL
=
.0
;
for
(
double
t
=
startAngle
+
dOffset
/
1.5
;
t
<
startAngle
+
dOffset
/
1.5
+
dScanRange
;
t
+=
dMinorStep
)
if
(
true
)
{
{
for
(
double
t
=
startAngle
+
dOffset
/
1.5
;
t
<
startAngle
+
dOffset
/
1.5
+
dScanRange
;
t
+=
dMinorStep
)
float
x
=
float
(
reelCenter
.
x
+
startRadius
*
cos
(
t
*
c
));
{
float
y
=
float
(
reelCenter
.
y
+
startRadius
*
sin
(
t
*
c
));
float
x
=
float
(
reelCenter
.
x
+
startRadius
*
cos
(
t
*
c
));
//初次确定元件间距
float
y
=
float
(
reelCenter
.
y
+
startRadius
*
sin
(
t
*
c
));
const
double
angle
=
atan2
((
double
)
reelCenter
.
y
-
y
,
(
double
)
reelCenter
.
x
-
x
);
//初次确定元件间距
const
double
angle
=
atan2
((
double
)
reelCenter
.
y
-
y
,
(
double
)
reelCenter
.
x
-
x
);
cv
::
Point
p1
=
cv
::
Point
(
cvRound
(
x
+
trackWidth
*
cos
(
angle
)),
cv
::
Point
p1
=
cv
::
Point
(
cvRound
(
x
+
trackWidth
*
cos
(
angle
)),
cvRound
(
y
+
trackWidth
*
sin
(
angle
)));
cvRound
(
y
+
trackWidth
*
sin
(
angle
)));
cv
::
Point
p2
=
cv
::
Point
(
cvRound
(
x
+
trackWidth
*
cos
(
angle
+
CV_PI
)),
cv
::
Point
p2
=
cv
::
Point
(
cvRound
(
x
+
trackWidth
*
cos
(
angle
+
CV_PI
)),
cvRound
(
y
+
trackWidth
*
sin
(
angle
+
CV_PI
)));
cvRound
(
y
+
trackWidth
*
sin
(
angle
+
CV_PI
)));
cv
::
LineIterator
it
(
sinParts
,
p1
,
p2
,
4
);
cv
::
LineIterator
it
(
sinParts
,
p1
,
p2
,
4
);
for
(
int
n
=
0
;
n
<
it
.
count
;
n
++
,
++
it
)
for
(
int
n
=
0
;
n
<
it
.
count
;
n
++
,
++
it
)
{
if
((
sinParts
.
data
)[(
it
.
pos
().
x
)
+
(
it
.
pos
().
y
)
*
X
]
==
255
)
{
{
//计算元件间距(弦长)
if
((
sinParts
.
data
)[(
it
.
pos
().
x
)
+
(
it
.
pos
().
y
)
*
X
]
==
255
)
dChordL
=
2.0
*
startRadius
*
sin
(((
2.0
*
asin
((
cv
::
norm
(
startCenter
-
cv
::
Point2f
(
x
,
y
)))
/
(
2.0
*
startRadius
)))
*
180.0
/
PI
-
dOffset
/
2.0
)
*
PI
/
180.0
/
2.0
);
{
break
;
//cv::drawMarker(cc, cv::Point(x, y), cv::Scalar(0, 0, 255, 255), 0, 10);
//计算元件间距(弦长)
dChordL
=
2.0
*
startRadius
*
sin
(((
2.0
*
asin
((
cv
::
norm
(
startCenter
-
cv
::
Point2f
(
x
,
y
)))
/
(
2.0
*
startRadius
)))
*
180.0
/
PI
-
dOffset
/
2.0
)
*
PI
/
180.0
/
2.0
);
break
;
}
}
}
if
(
dChordL
>
0
)
break
;
}
}
if
(
dChordL
>
0
)
break
;
}
}
//并行处理
//并行处理
//#pragma omp parallel sections
//#pragma omp parallel sections
{
{
...
@@ -3859,8 +3953,9 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
...
@@ -3859,8 +3953,9 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
trackEndPos
=
vParts
[
vParts
.
size
()
/
2
];
trackEndPos
=
vParts
[
vParts
.
size
()
/
2
];
//灰度极值认为是元件
//灰度极值认为是元件
std
::
sort
(
vParts
.
begin
(),
vParts
.
end
(),
std
::
greater
<
Track
>
());
std
::
sort
(
vParts
.
begin
(),
vParts
.
end
(),
std
::
greater
<
Track
>
());
//更新位置
//更新位置
---修改为理论中点-20210416
trackCenter
=
cv
::
Point
(
vParts
[
0
].
Pos
.
x
,
vParts
[
0
].
Pos
.
y
);
trackCenter
=
cv
::
Point
(
vParts
[
0
].
Pos
.
x
,
vParts
[
0
].
Pos
.
y
);
//trackCenter = cv::Point(trackEndPos.Pos.x, trackEndPos.Pos.y);
//更新扫描角度
//更新扫描角度
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
;
//纵向扫描
//纵向扫描
...
@@ -4037,8 +4132,9 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
...
@@ -4037,8 +4132,9 @@ int eyemCountObjectE(EyemImage tpImage, EyemRect tpRoi, const char *fileName, LP
trackEndPos
=
vParts
[
vParts
.
size
()
/
2
];
trackEndPos
=
vParts
[
vParts
.
size
()
/
2
];
//灰度极值认为是元件
//灰度极值认为是元件
std
::
sort
(
vParts
.
begin
(),
vParts
.
end
(),
std
::
greater
<
Track
>
());
std
::
sort
(
vParts
.
begin
(),
vParts
.
end
(),
std
::
greater
<
Track
>
());
//更新位置
//更新位置
---修改为理论中点-20210416
trackCenter
=
cv
::
Point
(
vParts
[
0
].
Pos
.
x
,
vParts
[
0
].
Pos
.
y
);
trackCenter
=
cv
::
Point
(
vParts
[
0
].
Pos
.
x
,
vParts
[
0
].
Pos
.
y
);
//trackCenter = cv::Point(trackEndPos.Pos.x, trackEndPos.Pos.y);
//更新扫描角度
//更新扫描角度
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
;
//纵向扫描
//纵向扫描
...
@@ -4890,7 +4986,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
...
@@ -4890,7 +4986,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
#endif
#endif
//判断是否追踪终止(增加匹配分数小于0.18被判定不是元件)
//判断是否追踪终止(增加匹配分数小于0.18被判定不是元件)
if
(
trayEnd
||
maxyyu
<
0.15
)
{
if
(
trayEnd
)
{
//不再判断,大概率已经终止
//不再判断,大概率已经终止
found
=
false
;
found
=
false
;
}
}
...
@@ -5056,7 +5152,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
...
@@ -5056,7 +5152,7 @@ int eyemCountObjectIrregularPartsE(EyemImage tpImage, EyemRect tpRoi, const char
#endif
#endif
//判断是否追踪终止(增加匹配分数小于0.18被判定不是元件)
//判断是否追踪终止(增加匹配分数小于0.18被判定不是元件)
if
(
trayEnd
||
maxyyu
<
0.15
)
{
if
(
trayEnd
)
{
//不再判断,大概率已经终止
//不再判断,大概率已经终止
found
=
false
;
found
=
false
;
}
}
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论