大华SDK

.大华相机SDK调用——主动采图、外触发、参数_昨夜雨疏风骤z的博客-CSDN博客

引入

 

代码

   /// <summary>
    /// 大华相机
    /// </summary>
    public class DHCamera : ICamera
    {



        /// <summary>
        /// 相机数量
        /// </summary>
        private int CameraNum = -1;
        /// <summary>
        /// 相机设备
        /// </summary>
        private IDevice[] Cameras;
        /// <summary>
        /// 图像帧集合
        /// </summary>
        private List<IGrabbedRawData> rawDatas = new List<IGrabbedRawData>();  

        /// <summary>
        /// 互斥锁
        /// </summary>
        private Mutex mutex = new Mutex();

        /// <summary>
        /// 相机数量
        /// </summary>
        public int CamNumber
        {

            get { return CameraNum; } //返回当前相机查找到的数量

        }

        /// <summary>
        /// 关闭相机
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public bool CloseCamera(int index)
        {

            try
            {
                if (Cameras[index] == null)
                {
                    return false;
                }

                Cameras[index].StreamGrabber.ImageGrabbed -= OnImageGrabbed;         /* 反注册回调 */
                Cameras[index].ShutdownGrab();                                       /* 停止码流 */
                Cameras[index].Close();                                              /* 关闭相机 */
            }
            catch 
            {
                return false;
            }
            return true;

        }


        /// <summary>
        /// 查找设备
        /// </summary>
        /// <returns></returns>
        public bool EnumCamera()
        {
            List<IDeviceInfo> number;
            try
            {
                /* 设备搜索 */
                number = Enumerator.EnumerateDevices();
                if (number.Count > 0)
                {
                    CameraNum = number.Count-1;
                    Cameras = new IDevice[CameraNum];
        
                    return true;
                }
                else 
                {
                    return false;
                }
            }
            catch (Exception)
            {

                return false;           
            }
        }

        /// <summary>
        /// 获取曝光时间
        /// </summary>
        /// <param name="index"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool GetExposureTime(int index, ref double value)
        {
            using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.ExposureTime])
            {
                value=p.GetValue();
                return true;
            }
        }

        /// <summary>
        /// 获取增益
        /// </summary>
        /// <param name="index"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool GetGian(int index, ref double value)
        {
  
            using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.GainRaw])
            {
                value=p.GetValue();
                return true;
            }
        }

        /// <summary>
        /// 采集图像
        /// </summary>
        /// <param name="index"></param>
        /// <param name="image"></param>
        /// <returns></returns>
        public bool GrabCamera(int index, out HObject image)
        {
            mutex.WaitOne(); //等待获取互斥锁
            image = new HObject();
            try
            {
                IGrabbedRawData frame = rawDatas.ElementAt(rawDatas.Count - 1); //取图像帧集合中的最后一帧(最新的一帧)
                rawDatas.Clear(); //清除图像队列
                mutex.ReleaseMutex(); //释放互斥锁
                int nRGB = RGBFactory.EncodeLen(frame.Width, frame.Height, false);
                IntPtr pData = Marshal.AllocHGlobal(nRGB);
                Marshal.Copy(frame.Image, 0, pData, frame.ImageSize);
                Marshal.FreeHGlobal(pData);
                return true;
            }
            catch 
            {
                return false;
                
            }

         

        }

        /// <summary>
        /// 打开相机
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public bool OpenCamera(int index)
        {
            #region 验证
            //判断相机数量
            if(CameraNum<0)
            {
                return false;

            }
            //判断输入的相机索引是否大于相机的数量
            if (index > CameraNum)
            {
                return false;
            }
            #endregion

            //获取当前索引相机信息
            try
            {
                Cameras[index] = Enumerator.GetDeviceByIndex(index);
                if (!Cameras[index].Open())
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
            /* 设置图像格式 */
            using (IEnumParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.ImagePixelFormat])
            {
                p.SetValue("Mono8");
            }

            /* 设置曝光 */
            using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.ExposureTime])
            {
                p.SetValue(1000);
            }

            /* 设置增益 */
            using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.GainRaw])
            {
                p.SetValue(1.0);
            }

            /* 设置缓存个数为8(默认值为16) */
            Cameras[index].StreamGrabber.SetBufferCount(8);

            /* 开启码流 */
            if (!Cameras[index].GrabUsingGrabLoopThread())
            {
                return false;
            }
            //关闭触发模式   设置为内触发采集
            if (Cameras[index].TriggerSet.Close())
            {
                return false;         
            }
            return true;
        }

        public bool SetExposureTime(int index, double value)
        {

            /* 设置曝光 */
            using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.ExposureTime])
            {
                if (p.SetValue(value)) return false;
            }
            return true;
        }

        public bool SetGain(int index, double value)
        {
            /* 设置增益 */
            using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.GainRaw])
            {
                if (p.SetValue(1.0)) return false;
                return true;
            }

        }



        /* 码流数据回调 */
        private void OnImageGrabbed(Object sender, GrabbedEventArgs e)
        {
            mutex.WaitOne();  //等待获取互斥锁
            if (rawDatas.Count >= 50)  //判断当前队列中的图像超过50张 则清除队列
            {
                rawDatas.Clear();
            }
            rawDatas.Add(e.GrabResult.Clone());//获取一帧图像数据到帧集合中
            mutex.ReleaseMutex();


        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值