Asa_Halcon.cs 6.1 KB
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];
        }
    }

}