HIKCManager.cs 7.6 KB
using MvCamCtrl.NET;
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
{
    public class HIKCManager
    {  /// <summary>
       /// 当前相机
       /// </summary>
        //  private Camera cameraCur = null;
        private static Dictionary<string, HIKCameraBean> cameraMap = new Dictionary<string, HIKCameraBean>();
        /// <summary>
        /// 当前相机
        /// </summary>
      //  private MyCamera cameraCurr;
        /// <summary>
        /// 所有相机列表
        /// </summary>
        private static MyCamera.MV_CC_DEVICE_INFO_LIST cameraAll;
        /// <summary>
        /// 所有相机的名称
        /// </summary>
        private static List<string> cameraName = new List<string>();

        /// <summary>
        /// 海康相机
        /// </summary>
        public HIKCManager()
        {
            cameraAll = new MyCamera.MV_CC_DEVICE_INFO_LIST();
            Load();
        }
        public static HIKCameraBean GetCamera(string cName)
        {
            if (cameraMap.ContainsKey(cName))
            {
                return cameraMap[cName];
            }
            return null;
        }
        public static void AddCamera(string name, HIKCameraBean bean)
        {
            if (cameraMap.ContainsKey(name))
            {
                cameraMap.Remove(name);
            }
            cameraMap.Add(name, bean);
        }
        /// <summary>
        /// 错误信息
        /// </summary>
        public static string ErrInfo { set; get; }

        /// <summary>
        /// 相机总数
        /// </summary>
        public static int Count
        {
            get { return (int)cameraAll.nDeviceNum; }
        }

        /// <summary>
        /// 相机名称,ModelName,SerialNumber
        /// </summary>
        public static string[] CameraName
        {
            get
            {
                if (cameraName == null)
                {
                    cameraName = new List<string>();
                }
                return cameraName.ToArray();
            }
        }

        /// <summary>
        /// 当前相机是否打开
        /// </summary>
        public static bool IsOpen(string cName)
        {

            HIKCameraBean bean = GetCamera(cName);
            if (bean == null || bean.cameraCur == null)
            {
                return false;
            }
            else
            {
                return true;
            }
        }


        /// <summary>
        /// 加载相机
        /// </summary>
        public static void Load()
        {
            try
            {
                int rtn = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref cameraAll);
                if (rtn != MyCamera.MV_OK) return;
                cameraName.Clear();
                string s = "";

                for (int i = 0; i < cameraAll.nDeviceNum; i++)
                {
                    MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(cameraAll.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));
                    if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
                    {
                        IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stGigEInfo, 0);
                        MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
                        s = "GigE:" + gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")";
                    }
                    else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
                    {
                        IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stUsb3VInfo, 0);
                        MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_USB3_DEVICE_INFO));
                        s = "USB:" + usbInfo.chModelName + " (" + usbInfo.chSerialNumber + ")";
                    }
                    cameraName.Add(s);
                }
            }
            catch (Exception ex)
            {
                HDLogUtil.error("HIK Load Error:" + ex.StackTrace);
            }
        }

        /// <summary>
        /// 打开指定相机
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static  bool Open(string name)
        {
            int n = cameraName.FindIndex(s => s == name);
            if (n == -1)
                return false;
            else

            {
                if (cameraMap.ContainsKey(name))
                {
                    if (cameraMap[name].cameraCur != null)
                    {
                        cameraMap[name].Close();
                    }
                    cameraMap.Remove(name);
                }

                if (n < 0 || n >= cameraAll.pDeviceInfo.Length) { return false; }
                try
                {
                    MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(cameraAll.pDeviceInfo[n], typeof(MyCamera.MV_CC_DEVICE_INFO));
                    MyCamera cameraCur = new MyCamera();
                    HIKCameraBean bean = new HIKCameraBean(cameraCur);
                    bean.Open(device);
                    AddCamera(name, bean);
                }
                catch (Exception ex)
                {
                    ErrInfo = ex.Message;
                    return false;
                }
                return true;
            }
        }




        /// <summary>
        /// 关闭当前相机
        /// </summary>
        public static void Close(string cName)
        {
            HIKCameraBean bean = GetCamera(cName);
            if (bean != null && bean.cameraCur != null)
            {
                bean.cameraCur.MV_CC_CloseDevice_NET();
                bean.cameraCur.MV_CC_DestroyDevice_NET();
                bean.cameraCur = null;
            }
        }
        public static void CloseAll()
        {
            foreach (string key in cameraMap.Keys)
            {
                Close(key);
            }
        }
        /// <summary>
        /// 停止抓取数据
        /// </summary>
        public static void Stop(string cName)
        {
            HIKCameraBean bean = GetCamera(cName);
            if (bean == null || bean.cameraCur != null)
            { return; }
            if (bean.cameraCur == null) return;
            int rtn = bean.cameraCur.MV_CC_StopGrabbing_NET();
            if (rtn != MyCamera.MV_OK) return;

        }

        /// <summary>
        /// 抓取一张图像
        /// </summary>
        public static  Bitmap GrabOne(string cName)
        {
            HIKCameraBean bean = GetCamera(cName);
            if (bean == null || bean.cameraCur != null)
            { return null; }
            return bean.GrabOne();
        }

        /// <summary>
        /// 抓取连续图像,触发GrabImage事件
        /// </summary>
        /// <param name="hWnd"></param>
        public static  void GrabContinuous(string cName, IntPtr hWnd)
        {
            HIKCameraBean bean = GetCamera(cName);
            if (bean == null || bean.cameraCur != null)
            { return  ; }
            int rtn = bean.cameraCur.MV_CC_StartGrabbing_NET();
            if (rtn != MyCamera.MV_OK) return;
            rtn = bean.cameraCur.MV_CC_Display_NET(hWnd);
            if (rtn != MyCamera.MV_OK) return;
        }

    }
}