Asa_Halcon.cs
6.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using HalconDotNet;
namespace Asa
{
public class Halcon
{
/// <summary>
/// 错误信息
/// </summary>
public string ErrInfo { set; get; }
/// <summary>
/// 解读条形码
/// </summary>
/// <param name="bmp"></param>
/// <param name="codeInfo"></param>
/// <returns></returns>
public bool DecodeBarCode(Bitmap bmp, out List<BarCodeInfo> codeInfo)
{
HObject hObj = null;
codeInfo = new List<BarCodeInfo>();
//图像转成halcon的类型
try
{
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
HOperatorSet.GenImageInterleaved(out hObj, bmpData.Scan0, "bgrx", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0);
bmp.UnlockBits(bmpData);
}
catch (Exception ex)
{
hObj = null;
ErrInfo = ex.Message;
return false;
}
try
{
HOperatorSet.Rgb1ToGray(hObj, out HObject grayImage);
HOperatorSet.CreateBarCodeModel(new HTuple(), new HTuple(), out HTuple hv_BarCode); //创建条码模型
HOperatorSet.SetBarCodeParam(hv_BarCode, "num_scanlines", 5); //扫描线的最大数量
HOperatorSet.SetBarCodeParam(hv_BarCode, "min_identical_scanlines", 3); //成功解码最少扫描线数量
HOperatorSet.SetBarCodeParam(hv_BarCode, "start_stop_tolerance", "high"); //扫描线的起点和终点的容许误差
HOperatorSet.SetBarCodeParam(hv_BarCode, "max_diff_orient", 5); //条码相邻两条竖条边缘扭曲的最大角度容差
HOperatorSet.FindBarCode(grayImage, out HObject symbolRegions, hv_BarCode, "auto", out HTuple hv_String); //寻找条码
HOperatorSet.GetBarCodeResult(hv_BarCode, "all", "decoded_types", out HTuple hv_Type); //获取条码类型
HOperatorSet.GetBarCodeResult(hv_BarCode, "all", "orientation", out HTuple hv_Orientation); //获取条码方向,x轴逆时针[0,180],顺时针[0,-180]
HOperatorSet.AreaCenter(symbolRegions, out HTuple hv_Area, out HTuple hv_Row, out HTuple hv_Column); //获取面积中心点
HOperatorSet.RegionFeatures(symbolRegions, "width", out HTuple hv_width); //条形码宽度
HOperatorSet.RegionFeatures(symbolRegions, "height", out HTuple hv_height); //条形码高度
HOperatorSet.ClearBarCodeModel(hv_BarCode); //清除条码模型
//支持‘Data Matrix ECC 200’、‘QR Code’和‘PDF417’共3种类型
//‘standard_recognition’、‘enhanced_recognition’、‘maximum_recognition’
//HOperatorSet.CreateDataCode2dModel("QR Code", "default_parameters", "maximum_recognition", out HTuple dataCodeHandle);
//HOperatorSet.SetDataCode2dParam(dataCodeHandle, "timeout", 200); //一个二维码的解码时间
//HOperatorSet.SetDataCode2dParam(dataCodeHandle, "symbol_size_min", 16); //码粒最小个数
//HOperatorSet.SetDataCode2dParam(dataCodeHandle, "symbol_size_max", 30); //码粒最大个数
//HOperatorSet.SetDataCode2dParam(dataCodeHandle, "module_size_min", 10); //码粒最小像素
//HOperatorSet.SetDataCode2dParam(dataCodeHandle, "module_size_max", 30); //码粒最大像素
//HOperatorSet.FindDataCode2d(grayImage, out HObject symbolXLDs, dataCodeHandle, new HTuple(), new HTuple(), out HTuple resultHandles, out HTuple decodedDataStrings);
//HOperatorSet.ClearDataCode2dModel(dataCodeHandle);
int n = hv_String.SArr.Length;
for (int i = 0; i < n; i++)
{
BarCodeInfo info = new BarCodeInfo();
info.centerX = Convert.ToSingle(hv_Column.DArr[i]);
info.centerY = Convert.ToSingle(hv_Row.DArr[i]);
info.text = hv_String.SArr[i];
info.angle = Convert.ToSingle(hv_Orientation.DArr[i]);
codeInfo.Add(info);
}
return true;
}
catch (Exception ex)
{
ErrInfo = ex.Message;
return false;
}
}
}
/// <summary>
/// 一维条码信息
/// </summary>
public struct BarCodeInfo
{
/// <summary>
/// 文本
/// </summary>
public string text;
/// <summary>
/// 中心点x
/// </summary>
public float centerX;
/// <summary>
/// 中心点y
/// </summary>
public float centerY;
/// <summary>
/// 角度,3点钟方向0°,逆时针为正,顺时针为负。
/// </summary>
public float angle;
/// <summary>
/// 条码矩形的4个顶点
/// </summary>
public PointF[] peak;
public BarCodeInfo(string s)
{
string[] ss = s.Split(',');
centerX = Convert.ToSingle(ss[0]);
centerY = Convert.ToSingle(ss[1]);
angle = Convert.ToSingle(ss[2]);
text = ss[3];
peak = new PointF[4];
}
public BarCodeInfo(string text, float centerX, float centerY, float angle)
{
this.text = text;
this.centerX = centerX;
this.centerY = centerY;
this.angle = angle;
peak = new PointF[4];
}
public string GetString()
{
return centerX + "," + centerY + "," + angle + "," + text;
}
public void SetString(string s)
{
string[] ss = s.Split(',');
centerX = Convert.ToSingle(ss[0]);
centerY = Convert.ToSingle(ss[1]);
angle = Convert.ToSingle(ss[2]);
text = ss[3];
}
}
}