Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
GeneralClassLibrary
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 39196f16
由
LN
编写于
2022-05-27 17:22:45 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
取图片修改
1 个父辈
77cdfaaf
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
237 行增加
和
2 行删除
CodeLibraryProject/CodeLibrary/CodeLibrary.csproj
CodeLibraryProject/CodeLibrary/camera/HIK.cs
CodeLibraryProject/CodeLibrary/eyemDecode_Partial.cs
CodeLibraryProject/dll/mask.png
CodeLibraryProject/CodeLibrary/CodeLibrary.csproj
查看文件 @
39196f1
...
@@ -45,9 +45,9 @@
...
@@ -45,9 +45,9 @@
<SpecificVersion>False</SpecificVersion>
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\增广夹爪\log4net.dll</HintPath>
<HintPath>..\..\..\增广夹爪\log4net.dll</HintPath>
</Reference>
</Reference>
<Reference Include="MvCameraControl.Net, Version=
2.4.1.2, Culture=neutral, processorArchitecture=MSIL
">
<Reference Include="MvCameraControl.Net, Version=
3.2.0.2, Culture=neutral, PublicKeyToken=52fddfb3f94be800, processorArchitecture=AMD64
">
<SpecificVersion>False</SpecificVersion>
<SpecificVersion>False</SpecificVersion>
<HintPath>..\
..\
dll\MvCameraControl.Net.dll</HintPath>
<HintPath>..\dll\MvCameraControl.Net.dll</HintPath>
</Reference>
</Reference>
<Reference Include="System" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Core" />
...
...
CodeLibraryProject/CodeLibrary/camera/HIK.cs
查看文件 @
39196f1
此文件的差异被折叠,
点击展开。
CodeLibraryProject/CodeLibrary/eyemDecode_Partial.cs
0 → 100644
查看文件 @
39196f1
using
System
;
using
System.Collections.Generic
;
using
System.Drawing
;
using
System.Drawing.Imaging
;
using
System.Linq
;
using
System.Runtime.InteropServices
;
using
System.Text
;
using
System.Threading.Tasks
;
namespace
CodeLibrary
{
unsafe
partial
class
EyemDecode
{
//结构体
[
StructLayout
(
LayoutKind
.
Sequential
)]
public
struct
EyemHSVModel
{
[
MarshalAs
(
UnmanagedType
.
ByValArray
,
SizeConst
=
3
)]
public
double
[]
dpRangeL
,
dpRangeU
;
// 提取下限,提取上限[H S V]
[
MarshalAs
(
UnmanagedType
.
ByValArray
,
SizeConst
=
3
)]
public
double
[]
dpRangeLExt
,
dpRangeUExt
;
// 额外提取下限,额外提取上限(针对处于跨模型颜色,比如红色)[H S V]
}
// 用于HSV颜色模型分割(H(0-180)、S(0-255)、V(0-255))
//接口
[
DllImport
(
"eyemLib.dll"
,
CharSet
=
CharSet
.
None
,
CallingConvention
=
CallingConvention
.
Cdecl
)]
private
static
extern
int
eyemTrackFeature
(
EyemImage
tpImage
,
EyemImage
tpMask
,
EyemRect
tpRoi
,
IntPtr
tpRois
,
int
ipRoiNum
,
EyemHSVModel
tpHSVModel
,
[
MarshalAs
(
UnmanagedType
.
LPArray
)]
int
[]
ipResults
,
out
EyemImage
tpDstImg
);
///////////////////使用///////////////////
public
static
int
[]
ReelCheck
(
string
deviceName
,
Bitmap
bitmap
)
{
EyemImage
image
=
eyemCvtToEyemImage
(
bitmap
);
//绿色分割模型
EyemHSVModel
tpHsvModel
=
new
EyemHSVModel
();
tpHsvModel
.
dpRangeL
=
new
double
[]
{
55
,
10
,
35
};
tpHsvModel
.
dpRangeU
=
new
double
[]
{
100
,
255
,
255
};
tpHsvModel
.
dpRangeLExt
=
new
double
[]
{
0
,
0
,
0
};
tpHsvModel
.
dpRangeUExt
=
new
double
[]
{
0
,
0
,
0
};
//裁剪区域
EyemRect
tpRoi
=
new
EyemRect
();
tpRoi
.
iXs
=
0
;
tpRoi
.
iYs
=
0
;
tpRoi
.
iWidth
=
image
.
iWidth
;
tpRoi
.
iHeight
=
image
.
iHeight
;
//添加需要监控的位置信息
List
<
EyemRect
>
tpRois
=
new
List
<
EyemRect
>();
EyemRect
roi1
=
new
EyemRect
();
roi1
.
iXs
=
533
;
roi1
.
iYs
=
187
;
roi1
.
iWidth
=
345
;
roi1
.
iHeight
=
310
;
EyemRect
roi2
=
new
EyemRect
();
roi2
.
iXs
=
900
;
roi2
.
iYs
=
137
;
roi2
.
iWidth
=
240
;
roi2
.
iHeight
=
197
;
tpRois
.
Add
(
roi1
);
tpRois
.
Add
(
roi2
);
//转指针
IntPtr
hGlobal
=
eyemStructArray2IntPtr
(
tpRois
.
ToArray
());
//加载mask
EyemImage
mask
;
eyemImageRead
(
"mask.png"
,
-
1
,
out
mask
);
//检测
int
[]
ipResults
=
new
int
[
tpRois
.
Count
];
eyemTrackFeature
(
image
,
mask
,
tpRoi
,
hGlobal
,
ipResults
.
Length
,
tpHsvModel
,
ipResults
,
out
EyemImage
tpDstImg
);
for
(
int
i
=
0
;
i
<
ipResults
.
Length
;
i
++)
{
if
(
ipResults
[
i
]
==
1
)
{
Console
.
WriteLine
(
"检测到{0}位置有料盘"
,
i
);
}
}
string
date
=
deviceName
.
Trim
().
Replace
(
'_'
,
'-'
)
+
"-"
+
DateTime
.
Now
.
ToString
(
"yyyyMMdd-HHmmss"
)
+
DateTime
.
Now
.
Millisecond
;
string
imageName
=
date
+
".bmp"
;
Bitmap
dstBitmap
=
eyemCvtToBitmap
(
tpDstImg
);
if
(
dstBitmap
!=
null
)
{
dstBitmap
.
Save
(
"D:\\ResOut\\"
+
imageName
);
}
//释放资源
Marshal
.
FreeHGlobal
(
hGlobal
);
//每运行检测一次释放一次
eyemImageFree
(
ref
tpDstImg
);
eyemImageFree
(
ref
image
);
//mask可以在程序启动与关闭时加载/释放
eyemImageFree
(
ref
mask
);
return
ipResults
;
}
public
static
EyemImage
eyemCvtToEyemImage
(
Bitmap
bitmap
)
{
EyemImage
tpImage
=
new
EyemImage
();
//锁定数据区
BitmapData
bd
=
bitmap
.
LockBits
(
new
Rectangle
(
0
,
0
,
bitmap
.
Width
,
bitmap
.
Height
),
ImageLockMode
.
ReadOnly
,
bitmap
.
PixelFormat
);
switch
(
bitmap
.
PixelFormat
)
{
case
PixelFormat
.
Format8bppIndexed
:
tpImage
.
iChannels
=
1
;
break
;
case
PixelFormat
.
Format24bppRgb
:
tpImage
.
iChannels
=
3
;
break
;
case
PixelFormat
.
Format32bppArgb
:
tpImage
.
iChannels
=
4
;
break
;
default
:
throw
new
Exception
(
"Image formats are not supported"
);
}
//仅支持8位
tpImage
.
iDepth
=
0
;
//图像尺寸
tpImage
.
iWidth
=
bitmap
.
Width
;
tpImage
.
iHeight
=
bitmap
.
Height
;
//分配内存(释放不是用eyemImageFree,用Marshal.FreeHGlobal(tpImage.vpImage))
tpImage
.
vpImage
=
Marshal
.
AllocHGlobal
(
bd
.
Stride
*
bd
.
Height
);
try
{
int
pd
=
((
tpImage
.
iWidth
*
tpImage
.
iChannels
)
+
3
)
/
4
*
4
;
long
bytesToCopy
=
tpImage
.
iWidth
*
tpImage
.
iChannels
;
for
(
int
y
=
0
;
y
<
tpImage
.
iHeight
;
y
++)
{
long
offsetSrc
=
y
*
pd
;
long
offsetDst
=
y
*
tpImage
.
iWidth
*
tpImage
.
iChannels
;
Buffer
.
MemoryCopy
((
byte
*)(
bd
.
Scan0
.
ToPointer
())
+
offsetSrc
,
(
byte
*)(
tpImage
.
vpImage
.
ToPointer
())
+
offsetDst
,
bytesToCopy
,
bytesToCopy
);
}
}
finally
{
bitmap
.
UnlockBits
(
bd
);
}
return
tpImage
;
}
//public static void eyemCvtToEyemImage(Bitmap bitmap, out EyemImage tpImage)
//{
// int channels = 0;
// switch (bitmap.PixelFormat)
// {
// case PixelFormat.Format8bppIndexed:
// channels = 1;
// break;
// case PixelFormat.Format24bppRgb:
// channels = 3;
// break;
// case PixelFormat.Format32bppArgb:
// channels = 4;
// break;
// default:
// break;
// }
// //锁定数据区
// BitmapData bd = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
// ImageLockMode.ReadOnly, bitmap.PixelFormat);
// try
// {
// eyemImageFromBitmap(bd.Scan0, bd.Width, bd.Height, 0, channels, out tpImage);
// }
// finally
// {
// bitmap.UnlockBits(bd);
// }
//}
public
static
IntPtr
eyemStructArray2IntPtr
<
T
>(
T
[]
tpArray
)
{
if
(
tpArray
==
null
)
throw
new
ArgumentNullException
(
typeof
(
T
).
Name
.
ToString
());
//分配结构体需要的内存,需要释放
IntPtr
hGlobal
=
Marshal
.
AllocHGlobal
(
checked
(
Marshal
.
SizeOf
(
typeof
(
T
))
*
tpArray
.
Length
));
for
(
int
index
=
0
;
index
<
tpArray
.
Length
;
index
++)
{
Marshal
.
StructureToPtr
(
tpArray
[
index
],
(
IntPtr
)(
checked
((
long
)
hGlobal
+
index
*
Marshal
.
SizeOf
(
typeof
(
T
)))),
false
);
}
return
hGlobal
;
}
public
static
Bitmap
eyemCvtToBitmap
(
EyemImage
tpImage
)
{
if
(
tpImage
.
vpImage
==
IntPtr
.
Zero
||
tpImage
.
iDepth
!=
0
)
return
null
;
PixelFormat
format
;
switch
(
tpImage
.
iChannels
)
{
case
1
:
format
=
PixelFormat
.
Format8bppIndexed
;
break
;
case
3
:
format
=
PixelFormat
.
Format24bppRgb
;
break
;
case
4
:
format
=
PixelFormat
.
Format32bppArgb
;
break
;
default
:
return
null
;
}
Bitmap
bitmap
=
new
Bitmap
(
tpImage
.
iWidth
,
tpImage
.
iHeight
,
format
);
//对于输出灰度图像
if
(
format
==
PixelFormat
.
Format8bppIndexed
)
{
ColorPalette
palette
=
bitmap
.
Palette
;
for
(
int
i
=
0
;
i
<
256
;
i
++)
{
palette
.
Entries
[
i
]
=
Color
.
FromArgb
(
i
,
i
,
i
);
}
bitmap
.
Palette
=
palette
;
}
//锁定数据区
BitmapData
bd
=
bitmap
.
LockBits
(
new
Rectangle
(
0
,
0
,
tpImage
.
iWidth
,
tpImage
.
iHeight
),
ImageLockMode
.
WriteOnly
,
format
);
try
{
int
pd
=
((
tpImage
.
iWidth
*
tpImage
.
iChannels
)
+
3
)
/
4
*
4
;
long
bytesToCopy
=
tpImage
.
iWidth
*
tpImage
.
iChannels
;
for
(
int
y
=
0
;
y
<
tpImage
.
iHeight
;
y
++)
{
long
offsetSrc
=
(
y
*
tpImage
.
iWidth
*
tpImage
.
iChannels
);
long
offsetDst
=
(
y
*
pd
);
Buffer
.
MemoryCopy
((
byte
*)(
tpImage
.
vpImage
.
ToPointer
())
+
offsetSrc
,
(
byte
*)(
bd
.
Scan0
.
ToPointer
())
+
offsetDst
,
bytesToCopy
,
bytesToCopy
);
}
}
finally
{
bitmap
.
UnlockBits
(
bd
);
}
return
bitmap
;
}
}
}
CodeLibraryProject/dll/mask.png
0 → 100644
查看文件 @
39196f1
11.0 KB
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论