C# 连接大华工业相机

3 篇文章 2 订阅

 需要导入这两个动态链接库

/// <summary>
    /// 大华相机SDK
    /// </summary>
    public class SDK_DaHua : SDK_Camera
    {
        /// <summary>
        /// 相机实例
        /// </summary>
        private IDevice device;
        /// <summary>
        /// 是否为彩色
        /// </summary>
        private bool IsColor = false;
        /// <summary>
        /// 相机名称
        /// </summary>
        private string Cam_Name;
        /// <summary>
        /// 
        /// </summary>
        public override bool IsOpen {
            get {
                if (device!=null)
                {
                    return device.IsOpen;
                }
                return false;
            }   
        }

        /// <summary>
        /// 图像事件 相机名称图源
        /// </summary>
        public override event ImageDelegate Image_Delegate;
    
        /// <summary>
        /// 
        /// </summary>
        ~SDK_DaHua(){ }
        /// <summary>
        /// 关闭相机
        /// </summary>
        /// <returns></returns>
        public override void Close_Camera()
        {
            if (device == null) return;
            try
            {

                device.ShutdownGrab();
                device.StreamGrabber.ImageGrabbed -= OnImageGrabbed;
                device.Close();
            }
            catch 
            {
            }
        }
        #region 曝光
        /// <summary>
        ///  设置曝光
        /// </summary>
        public override double SetExposureTime(double Value)
        {
            if (device == null) return 0; 
            using (IFloatParameter p = device.ParameterCollection[new FloatName("ExposureTime")])
            {
                if (Value <= p.GetMaximum() && Value >= p.GetMinimum())
                {
                    p.SetValue(Value);
                }
                return p.GetValue();
            }
        }
        /// <summary>
        /// 获取曝光
        /// </summary>
        public override double GetExposureTime()
        {
            if (device == null) return 0;
            using (IFloatParameter p = device.ParameterCollection[new FloatName("ExposureTime")])
            {
                return p.GetValue();
            }
        }
        #endregion

        /// <summary>
        /// 打开相机
        /// </summary>
        /// <param name="Cam_Name"></param>
        /// <returns></returns>
        public override bool Open_Camera(string Cam_Name)
        {
            List<IDeviceInfo> li = Enumerator.EnumerateDevices();
            for (int i = 0; i < li.Count; i++)
            {
                if (li[i].Name == Cam_Name.Trim())
                {
                    //通过设备名称打开相机
                    device = Enumerator.GetDeviceByUserID(Cam_Name);
                    this.Cam_Name = Cam_Name;                    
                    if (!device.Open())
                    {
                       
                        //相机打开失败
                        return false;
                    }
                    //设置 图像帧格式
                    IStringParameter pa = device.ParameterCollection[new StringName("DeviceModelName")];
                    if (pa.GetValue().Contains("C"))
                    {
                        using (IEnumParameter p = device.ParameterCollection[ParametrizeNameSet.ImagePixelFormat])
                        {
                            p.SetValue("BayerRG8");
                            IsColor = true;
                        }
                    }
                    else
                    {
                        using (IEnumParameter p = device.ParameterCollection[ParametrizeNameSet.ImagePixelFormat])
                        {
                            p.SetValue("Mono8");
                            IsColor = false;
                        }
                    }
                    // 设置缓存个数为8(默认值为16) 
                    device.StreamGrabber.SetBufferCount(8);
                    // 注册码流回调事件  使用内部线程捕获帧数据
                    device.StreamGrabber.ImageGrabbed += OnImageGrabbed;
                    //相机掉线回调
                    device.ConnectionLost += OnConnectLoss;
                    //设置默认的模式
                   device.TriggerSet.Open(TriggerSourceEnum.Software);
                    if (!device.GrabUsingGrabLoopThread())
                    {
                        //开始抓取失败
                        return false;
                    }
                    return true;
                }
            }
            return false;
        }      
        /// <summary>
        /// 相机丢失回调      
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnConnectLoss(object sender, EventArgs e)
        {
            device.ShutdownGrab();
            device.Dispose();
            device = null;
        }
        /// <summary>
        /// 码流数据回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnImageGrabbed(Object sender, GrabbedEventArgs e)
        {
            if (IsColor)
            {
                int nRGB = RGBFactory.EncodeLen(e.GrabResult.Width, e.GrabResult.Height, true);
                IntPtr pData = System.Runtime.InteropServices.Marshal.AllocHGlobal(nRGB);
                RGBFactory.ToRGB(e.GrabResult.Image, e.GrabResult.Width, e.GrabResult.Height, true, e.GrabResult.PixelFmt, pData, nRGB);
                HOperatorSet.GenImageInterleaved(out HObject ho_image, (HTuple)pData, "bgr", e.GrabResult.Width, e.GrabResult.Height, 0, "byte",
                e.GrabResult.Width, e.GrabResult.Height, 0, 0, 8, 0);
                Image_Delegate?.Invoke(Cam_Name, ho_image?.Clone());
                System.Runtime.InteropServices.Marshal.FreeHGlobal(pData);
                ho_image?.Dispose();
                GC.Collect();

            }
            else
            {
                int nRGB = RGBFactory.EncodeLen(e.GrabResult.Width, e.GrabResult.Height, false);
                IntPtr pData = System.Runtime.InteropServices.Marshal.AllocHGlobal(nRGB);
                System.Runtime.InteropServices.Marshal.Copy(e.GrabResult.Image, 0, pData, e.GrabResult.ImageSize);
                HOperatorSet.GenEmptyObj(out HObject ho_image);
                ho_image.Dispose();
                HOperatorSet.GenImage1Extern(out ho_image, "byte", e.GrabResult.Width, e.GrabResult.Height, pData, 0);
                Image_Delegate?.Invoke(Cam_Name, ho_image?.Clone());
                System.Runtime.InteropServices.Marshal.FreeHGlobal(pData);
                ho_image?.Dispose();
                GC.Collect();
            }
        }
        #region 软触发模式
        /// <summary>
        /// 软触发模式,开启/关闭 软触发
        /// </summary>
        public override TriggerMode GetTriggerMode()
        {
            if (device == null) return TriggerMode.On;
            using (IEnumParameter p = device.ParameterCollection[ParametrizeNameSet.TriggerMode])
            {
                return (TriggerMode)Enum.Parse(typeof(TriggerMode), p.GetValue());
            }
        }
        /// <summary>
        /// 设置触发模式
        /// </summary>
        /// <param name="mode"></param>
        public override void SetTriggerMode(TriggerMode mode)
        {
            if (device == null) return;
            using (IEnumParameter p = device.ParameterCollection[ParametrizeNameSet.TriggerMode])
            {
                p.SetValue(mode.ToString());
                if (mode==TriggerMode.On)
                {
                    SetTriggerSource(TriggerSource.Software);
                    device.TriggerSet.Open(TriggerSourceEnum.Software);
                }
            }
        }
        #endregion
        #region 软触发触发源
        /// <summary>
        /// 获取软触发触发源
        /// </summary>
        /// <returns></returns>
        public override TriggerSource GetTriggerSource()
        {
            if (device!=null) return TriggerSource.Software;
            using (IEnumParameter p = device.ParameterCollection[ParametrizeNameSet.TriggerSource])
            {
                return (TriggerSource)Enum.Parse(typeof(TriggerSource), p.GetValue());
            }
            

        }
        /// <summary>
        /// 设置软触发触发源
        /// </summary>
        /// <param name="source"></param>
        public override void SetTriggerSource(TriggerSource source)
        {
            if (device == null) return;
            using (IEnumParameter p = device.ParameterCollection[ParametrizeNameSet.TriggerSource])
            {
                p.SetValue(source.ToString());
            }
        }
        #endregion
        #region 增益
        /// <summary>
        /// 设置增益
        /// </summary>
        /// <param name="Value"></param>
        /// <returns></returns>
        public override double SetGainRaw(double Value)
        {
            if (device == null) return 0;
            // 设置增益            
            using (IFloatParameter p = device.ParameterCollection[ParametrizeNameSet.GainRaw])
            {
                if (Value <= p.GetMaximum() && Value >= p.GetMinimum())
                {
                    p.SetValue(Value);
                }
                return p.GetValue();
            }
        }
        /// <summary>
        /// 获取增益
        /// </summary>
        /// <returns></returns>
        public override double GetGainRaw()
        {
            if (device == null) return 0;
            using (IFloatParameter p = device.ParameterCollection[ParametrizeNameSet.GainRaw])
            {
                return p.GetValue();
            }
        }
        #endregion
        /// <summary>
        /// 执行软触发,单帧触发
        /// </summary>
        public override bool TriggerSoftware()
        {
            if (device==null)
            {
                return false;
            }
            TriggerMode p= GetTriggerMode();
            if (device.IsGrabbing==false)
            {
                device.GrabUsingGrabLoopThread();
            }
            if (device.IsTriggerOn==true&& TriggerMode.Off== GetTriggerMode())
            {
                SetTriggerMode(TriggerMode.On);
                SetTriggerSource(TriggerSource.Software);
                device.TriggerSet.Open(TriggerSourceEnum.Software);
            }
            return device.ExecuteSoftwareTrigger();
        }
        /// <summary>
        ///关闭流通道
        /// </summary>
        public override void CloseConsecutive()
        {
            if (device == null) return;           
            if (device.IsGrabbing)
            {
                device.StreamGrabber.Stop();
            }
        }
        /// <summary>
        /// 实时采集
        /// </summary>
        public override void Acquisition()
        {
            if (device == null) return;
            if (!device.IsGrabbing)
            {
                device.GrabUsingGrabLoopThread();
            }
            //获取采集模式
            using (IEnumParameter p = device.ParameterCollection[ParametrizeNameSet.AcquisitionMode])
            {
                //不等于连续模式
                if (p.GetValue() != AcquisitionModeEnum.Continuous)
                {
                    //先停止流
                    CloseConsecutive();
                    //设置连续模式
                    p.SetValue(AcquisitionModeEnum.Continuous);
                }
            }
            if (GetTriggerMode() == TriggerMode.On)
            {
                SetTriggerMode(TriggerMode.Off);
            }
            //开启流
            device.GrabUsingGrabLoopThread();
        }
    }

  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值