HDevelopExport.cs 12.4 KB

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms; 

namespace TSA_V.DeviceLibrary
{
    public class HDevelopExport
    { 
        /// <summary>
        /// 摄像机类别,只保存已经打开的摄像机
        /// </summary>
        public static Dictionary<string, HTuple> cameraHtuple = new Dictionary<string, HTuple>();
        public static List<string> cameraNameList = new List<string>();
        public static List<string> codeTypeList = new List<string>();

        private static char spiltChar = '#';
        /// <summary>
        /// 初始化摄像机名称和条码类型
        /// </summary>
        /// <param name="nameStr">摄像机名称,多个用#分割</param>
        /// <param name="codeStr">条码类型,多个用#分割</param>
        public static void LoadConfig(string nameStr,string codeStr)
        {
            cameraNameList = new List<string>();
            codeTypeList = new List<string>();
            try
            { 
                string[] nameArray = nameStr.Split(spiltChar);
                foreach (string str in nameArray)
                {
                    LogUtil.info("加载到摄像机名称:" + str.Trim());
                    cameraNameList.Add(str.Trim());
                }
                string[] codeArray = codeStr.Split(spiltChar);
                foreach (string str in codeArray)
                {
                    LogUtil.info("加载到条码类型:" + str.Trim());
                    codeTypeList.Add(str.Trim());
                }

            }
            catch (Exception ex)
            {
                LogUtil.error("解析摄像机配置出错:" + ex.ToString());
            }
        }
        /// <summary>
        /// 扫取条码,会打开摄像机,正常情况下不关闭摄像机
        /// </summary>
        /// <returns></returns>
        public static  List<string> CameraScan()
        {
            List<string> allCodeList = new List<string>();
             
            try
            {
                //HDevelopExport.CloseAllCamera();
                //打开所有摄像机
                HDevelopExport.OpenAllCamera();

                foreach (string cameraName in HDevelopExport.cameraNameList)
                {
                    HObject ho_Image = HDevelopExport.GrabImage(cameraName);
                    List<string> codeList = HDevelopExport.GetCode(ho_Image); 
                    allCodeList.AddRange(codeList);
                } 
            }
            catch (Exception ex)
            {
                LogUtil.error("从摄像机获取条码出错:" + ex.ToString());
                LogUtil.error("关闭摄像机");
                HDevelopExport.CloseAllCamera();
            }
            return allCodeList;
        }

      
        public static List<string> GetCode(HObject ho_Image, string symbolType )
        {
            List<string> list = new List<string>();
            string[] array = GetQrCode(ho_Image, symbolType );
            if (array != null)
            {
                list.AddRange(array);
            }
            return list;
        }
    
        public static List<string> GetCode(HObject ho_Image )
        {
            List<string> list = new List<string>();

            foreach (string codeType in codeTypeList)
            {
                string[] array = GetQrCode(ho_Image, codeType );
                if (array != null)
                {
                    list.AddRange(array);
                }
            }
            return list;
        }

        public static string GetCodeParamFilePath(string codePath)
        {
            string appPath = Application.StartupPath;
            string path = appPath+ ConfigAppSettings.GetValue(Setting_Init.CodeParamPath);
            string filePath=   path  + codePath + ".dcm";
            if (File.Exists(filePath))
            {
                return filePath;
            }
            else
            {
                return "";
            }
        }
        // Procedures 
        //private static HTuple hv_DataCodeHandle = null;
        private static string[] GetQrCode(HObject ho_Image, string symbolType )
        {
            try
            {
                DateTime date = DateTime.Now;
                // Local iconic variables  
                HObject ho_SymbolXLDs;

                // Local control variables  
                HTuple hv_ResultHandles = null;
                //HTuple hv_DataCodeHandle = null, hv_ResultHandles = null;
                HTuple hv_DecodedDataStrings = null;
                HTuple hv_Area = null;
                HTuple hv_Row1 = null;
                HTuple hv_Column = null;
                HTuple hv_PointOrder = null;
                HTuple hv_DataCodeHandle = null;
                // Initialize local and output iconic variables 
                HOperatorSet.GenEmptyObj(out ho_SymbolXLDs);
                //LogUtil.info("GetQrCode:结束HOperatorSet.GenEmptyObj,已耗时:" + (DateTime.Now - date).ToString());
                HOperatorSet.CreateDataCode2dModel(symbolType, "default_parameters", "maximum_recognition",
                    out hv_DataCodeHandle);

                string hv_model_path = GetCodeParamFilePath(symbolType);
                if (!hv_model_path.Equals(""))
                {
                    HOperatorSet.ReadDataCode2dModel(hv_model_path, out hv_DataCodeHandle);
                }
                else
                {
                    if (symbolType.Equals("Data Matrix ECC 200"))
                    {
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "timeout", 500);
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "mirrored", "no");
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "contrast_min", 50);
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "symbol_cols_min", 40);
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "symbol_rows_min", 40);
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "symbol_cols_max", 40);
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "symbol_rows_max", 40);
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "symbol_shape", "square");
                    }
                    else
                    {
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "timeout", 300);
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "mirrored", "no");
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "model_type", 2);
                        HOperatorSet.SetDataCode2dParam(hv_DataCodeHandle, "module_gap_max", "no");
                    }
                }
                //LogUtil.info("GetQrCode:结束HOperatorSet.CreateDataCode2dModel,已耗时:" + (DateTime.Now - date).ToString());
                ho_SymbolXLDs.Dispose();
                LogUtil.debug("GetQrCode:结束ho_SymbolXLDs.Dispose,已耗时:" + (DateTime.Now - date).ToString());
                HOperatorSet.FindDataCode2d(ho_Image, out ho_SymbolXLDs, hv_DataCodeHandle, "stop_after_result_num",
                    3, out hv_ResultHandles, out hv_DecodedDataStrings);

                LogUtil.debug("GetQrCode:结束HOperatorSet.FindDataCode2d,已耗时:" + (DateTime.Now - date).ToString());
                HOperatorSet.AreaCenterXld(ho_SymbolXLDs, out hv_Area, out hv_Row1, out hv_Column,
                    out hv_PointOrder);

                //LogUtil.info("GetQrCode:结束HOperatorSet.AreaCenterXld,已耗时:" + (DateTime.Now - date).ToString());
                HOperatorSet.ClearDataCode2dModel(hv_DataCodeHandle);
                //LogUtil.info("GetQrCode:结束HOperatorSet.ClearDataCode2dModel,已耗时:" + (DateTime.Now - date).ToString());
                string[] resultList = hv_DecodedDataStrings.SArr;
                if (resultList.Length > 0)
                {
                    for (int i = 0; i < hv_DecodedDataStrings.SArr.Length; i++)
                    {
                        try
                        {
                            int x = (int)Math.Round(hv_Column.DArr[i]);
                            int y = (int)Math.Round(hv_Row1.DArr[i]);
                            string str = "=" +   x + "x" + y + "=" + hv_DecodedDataStrings.SArr[i];
                            hv_DecodedDataStrings[i] = str;
                        }
                        catch (Exception ex)
                        {
                            LogUtil.error("处理条码出错:索引=" + i + "," + resultList.ToString());
                        }
                    }
                }
                LogUtil.debug("GetQrCode:结束处理条码,已耗时:" + (DateTime.Now - date).ToString());
                return resultList;
            }
            catch (Exception ex)
            {
                return new string[] { };
            }
        } 

        public static void OpenAllCamera()
        {
            foreach (string camera in cameraNameList)
            {
                OpenCamera(camera);
            }
        }
        public static void CloseAllCamera()
        {
            foreach (string camera in cameraNameList)
            {
                CloseCamera(camera);
            }
        }
        /// <summary>
        /// 截取条码,不需要位置
        /// </summary> 
        public static string SubStrCode(string str)
        {
            string[] array = str.Split('=');
            if (array.Length >= 3)
            {
                return array[2];
            }
            return "";
        }

        public static void OpenCamera(string cameraAddr)
        {
            try
            {
                //Local iconic variables 
                HTuple hv_AcqHandle = null;
                if (cameraHtuple.ContainsKey(cameraAddr))
                {
                    return;
                    //CloseCamera(cameraAddr);
                }
                if (cameraAddr.Contains("USB"))
                {
                    HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
                -1, "false", "default", cameraAddr, 0, -1, out hv_AcqHandle);
                }
                else
                {
                    HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "default", -1,
                        "default", -1, "false", "default", cameraAddr, 0,
                       -1, out hv_AcqHandle);
                } 
                cameraHtuple.Add(cameraAddr, hv_AcqHandle);
                // IsOpen = true;
            }
            catch (Exception ex)
            {
                LogUtil.error("打开摄像机失败:" + ex.ToString()+",调用关闭摄像头");
                CloseCamera(cameraAddr);

            }
        }

        public static void CloseCamera(string cameraStr)
        {
            try
            {
                if (cameraHtuple.ContainsKey(cameraStr))
                {
                    HTuple hv_AcqHandle = cameraHtuple[cameraStr];
                    if (hv_AcqHandle != null)
                    {
                        HOperatorSet.CloseFramegrabber(hv_AcqHandle);
                        hv_AcqHandle = null;
                    }

                    cameraHtuple.Remove(cameraStr);
                    //IsOpen = false;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("关闭摄像机失败:" + ex.ToString());
            }
        }

        public static HObject GrabImage(string cameraStr)
        {
            HObject ho_Image = null;
            try
            {
                if (cameraHtuple.ContainsKey(cameraStr))
                {
                    HTuple hv_AcqHandle = cameraHtuple[cameraStr];
                    HOperatorSet.GenEmptyObj(out ho_Image);
                    ho_Image.Dispose();
                    //    HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle,-1); 
                    HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle);
                }
            }catch(Exception ex)
            {
                LogUtil.error("获取摄像机【"+cameraStr+"】的图片出错:"+ex.ToString());
            }
            return ho_Image;
        }

        public static bool IsOpen(string cameraStr)
        {
            return cameraHtuple.ContainsKey(cameraStr);
        }

    }
}