C# 连接basler相机

3 篇文章 2 订阅

 /// <summary>
    /// 巴斯勒SDK
    /// </summary>
    public class SDK_Basler : SDK_Camera
    {

       // private Stopwatch stopWatch = new Stopwatch();
        /// <summary>
        /// 相机图像事件
        /// </summary>
        public override event ImageDelegate Image_Delegate;
      
        /// <summary>
        /// 相机实例
        /// </summary>
        private Camera camera = null;
        /// <summary>
        /// 相机名称
        /// </summary>
        private string Cam_name;

        ///<summary>
        /// if >= Sfnc2_0_0,说明是USB3的相机
        ///</summary>
        private static readonly Version Sfnc2_0_0 = new Version(2, 0, 0);

        private PixelDataConverter converter = new PixelDataConverter();
        private IntPtr latestFrameAddress = IntPtr.Zero;
        /// <summary>
        /// 是否已连接相机
        /// </summary>
        public override bool IsOpen
        {
            get {
                if (camera!=null)
                {
                    return camera.IsOpen;
                }
                return false;
            }        
        }
        /// <summary>
        /// 实时采集
        /// </summary>
        public override void Acquisition()
        {
            if (camera != null)
            {
                if ("On"==camera.Parameters[PLCamera.TriggerMode].GetValue())
                {
                    SetTriggerMode(TriggerMode.Off);
                }
                //在抓取中返回true
                if (camera.StreamGrabber.IsGrabbing)
                {
                    // camera.StreamGrabber.Stop();
                    return;
                }
                camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
                camera.StreamGrabber.Start(GrabStrategy.LatestImages, GrabLoop.ProvidedByStreamGrabber);
                // stopWatch.Restart();
            }
        }
        /// <summary>
        /// 关闭实时采集
        /// </summary>
        public override void CloseConsecutive()
        {
            if (camera != null)
            {
                if (camera.StreamGrabber.IsGrabbing)
                {
                    camera.StreamGrabber.Stop();                   
                }               
            }
        }
        /// <summary>
        /// 关闭相机
        /// </summary>
        public override void Close_Camera()
        {
            if (camera != null)
            {
                CloseConsecutive();
                //抓取图像时发生               
                camera.Close();
                camera.Dispose();
                if (latestFrameAddress != null)
                {
                    Marshal.FreeHGlobal(latestFrameAddress);
                    latestFrameAddress = IntPtr.Zero;
                }
            }
        }
        /// <summary>
        /// 设置曝光
        /// </summary>
        /// <returns></returns>
        public override double GetExposureTime()
        {
            if (camera != null)
            {                
                if (camera.Parameters.Contains(PLCamera.ExposureTimeAbs))
                {
                    return camera.Parameters[PLCamera.ExposureTimeRaw].GetValue();
                }
                else
                {
                    return camera.Parameters[PLCamera.ExposureTime].GetValue();
                }
            }
            return 0;
        }
        /// <summary>
        /// 获取增益
        /// </summary>
        /// <returns></returns>
        public override double GetGainRaw()
        {
            if (camera != null)
            {
                if (camera.Parameters.Contains(PLCamera.GainRaw))
                {
                    return camera.Parameters[PLCamera.GainRaw].GetValue();
                }
                else
                {
                    return camera.Parameters[PLCamera.Gain].GetValue();
                }
            }
            return 0;
        }
        /// <summary>
        /// 获取触发模式
        /// </summary>
        /// <returns></returns>
        public override TriggerMode GetTriggerMode()
        {
            if (camera != null)
            {
                return (TriggerMode)Enum.Parse(typeof(TriggerMode), camera.Parameters[PLCamera.TriggerMode].GetValue());
            }
            return TriggerMode.Off;
        }
        /// <summary>
        /// 获取触发源
        /// </summary>
        /// <returns></returns>
        public override TriggerSource GetTriggerSource()
        {
            if (camera != null)
            {              
                return (TriggerSource)Enum.Parse(typeof(TriggerSource), camera.Parameters[PLCamera.TriggerSource].GetValue());
            }
            return TriggerSource.Software;
        }
        /// <summary>
        /// 打开相机
        /// </summary>
        /// <param name="Cam_Name"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public override bool Open_Camera(string Cam_Name)
        {
            this.Cam_name = Cam_Name;
            List<ICameraInfo> allCameras = CameraFinder.Enumerate();
            foreach (ICameraInfo item in allCameras)
            {
                //通过用户自定名称开启相机
                if (Cam_Name == item[CameraInfoKey.UserDefinedName])
                {
                    camera = new Camera(item);
                   
                   // camera.CameraOpened += Configuration.SoftwareTrigger;
                    //相机意外丢失时发生
                    camera.ConnectionLost += OnConnectionLost;
                    //连接打开时发生
                   // camera.CameraOpened += OnCameraOpened;
                    //关闭与相机的连接后发生
                    //camera.CameraClosed += OnCameraClosed;
                    //抓取会话启动后发生
                   // camera.StreamGrabber.GrabStarted += OnGrabStarted;
                    //抓取图像时发生
                    camera.StreamGrabber.ImageGrabbed += OnImageGrabbed;
                    //捕获会话停止后发生
                    camera.StreamGrabber.GrabStopped += OnGrabStopped;
                    //打开设备
                    camera.Open();
                    //开始抓取图像
                   //  camera.StreamGrabber.Start();
                    //相机是否已打开
                    if (camera.IsOpen)
                    {                      
                        return true;
                    }
                }
            }
            return false;
        }
        /// <summary>
        /// 相机意外丢失时发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnConnectionLost(Object sender, EventArgs e)
        {
            if (camera != null)
            {
                camera.Close();
                for (int i = 1; i <= 10; i++)
                {
                    camera.Open();
                    if (camera.IsOpen)
                    {
                        //camera.ConnectionLost += OnConnectionLost;
                        camera.StreamGrabber.ImageGrabbed += OnImageGrabbed;
                        //camera.StreamGrabber.GrabStopped += OnGrabStopped;
                        return;
                    }
                    Thread.Sleep(100);
                }
            }

        }
        /// <summary>
        /// 连接打开时发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnCameraOpened(Object sender, EventArgs e)
        {

        }
        /// <summary>
        /// 连接关闭时发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnCameraClosed(Object sender, EventArgs e)
        {

        }
        /// <summary>
        /// 当相机开始抓取时发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnGrabStarted(Object sender, EventArgs e)
        {

        }
        
        /// <summary>
        /// 获取图像并准备进行处理时发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnImageGrabbed(Object sender, ImageGrabbedEventArgs e)
        {
            HObject Hobj;
            HOperatorSet.GenEmptyObj(out Hobj);
            //获取抓取结果
            IGrabResult grabResult = e.GrabResult;
            if (grabResult.IsValid)
            {
                //检查图像是否可以显示
                if (grabResult.GrabSucceeded)
                {
                    if (IsMonoPixelFormat(grabResult.PixelTypeValue))
                    {
                        if (latestFrameAddress == IntPtr.Zero)
                        {
                            latestFrameAddress = Marshal.AllocHGlobal((Int32)grabResult.PayloadSize);
                        }
                        converter.OutputPixelFormat = PixelType.Mono8;
                        converter.Convert(latestFrameAddress, grabResult.PayloadSize, grabResult);
                        Hobj.Dispose();
                        // 转换为Halcon图像显示
                        HOperatorSet.GenImage1(out Hobj, "byte", (HTuple)grabResult.Width, (HTuple)grabResult.Height, (HTuple)latestFrameAddress);
                    }
                    else if (grabResult.PixelTypeValue == PixelType.BayerBG8 || grabResult.PixelTypeValue == PixelType.BayerGB8
                                || grabResult.PixelTypeValue == PixelType.BayerRG8 || grabResult.PixelTypeValue == PixelType.BayerGR8)
                    {
                        int imageWidth = grabResult.Width - 1;
                        int imageHeight = grabResult.Height - 1;
                        int payloadSize = imageWidth * imageHeight;
                        if (latestFrameAddress == IntPtr.Zero)
                        {
                            latestFrameAddress = Marshal.AllocHGlobal((Int32)(3 * payloadSize));
                        }
                        converter.OutputPixelFormat = PixelType.BGR8packed;
                        // 根据bayer格式不同切换以下代码
                        converter.Parameters[PLPixelDataConverter.InconvertibleEdgeHandling].SetValue("Clip");
                        converter.Convert(latestFrameAddress, 3 * payloadSize, grabResult);
                        Hobj?.Dispose();
                        HOperatorSet.GenImageInterleaved(out  Hobj, latestFrameAddress, "bgr",(HTuple)imageWidth, (HTuple)imageHeight, -1, "byte", (HTuple)imageWidth, (HTuple)imageHeight, 0, 0, -1, 0);             
                    }
                    if (Hobj.CountObj() > 0)
                    {
                        Image_Delegate?.Invoke(Cam_name, Hobj?.Clone());
                    }
                }
            }
            Hobj?.Dispose();
            e.DisposeGrabResultIfClone();
           GC.Collect();
        }
        /// <summary>
        /// 相机停止抓取时发生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnGrabStopped(Object sender, GrabStopEventArgs e)
        {

        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="enType"></param>
        /// <returns></returns>
        private bool IsMonoPixelFormat(PixelType enType)
        {
            switch (enType)
            {
                case PixelType.Mono1packed:
                case PixelType.Mono2packed:
                case PixelType.Mono4packed:
                case PixelType.Mono8:
                case PixelType.Mono8signed:
                case PixelType.Mono10:
                case PixelType.Mono10p:
                case PixelType.Mono10packed:
                case PixelType.Mono12:
                case PixelType.Mono12p:
                case PixelType.Mono12packed:
                case PixelType.Mono16:
                    return true;
                default:
                    return false;
            }
        }
        /// <summary>
        /// 设置曝光
        /// </summary>
        /// <param name="Value"></param>
        /// <returns></returns>
        public override double SetExposureTime(double Value)
        {
            if (camera != null)
            {
                try
                {
                    camera.Parameters[PLCamera.ExposureAuto].TrySetValue(PLCamera.ExposureAuto.Off);
                    camera.Parameters[PLCamera.ExposureMode].TrySetValue(PLCamera.ExposureMode.Timed);
                    if (camera.GetSfncVersion() < Sfnc2_0_0)
                    {
                        long value;
                        long min = camera.Parameters[PLCamera.ExposureTimeRaw].GetMinimum();
                        long max = camera.Parameters[PLCamera.ExposureTimeRaw].GetMaximum();
                        long incr = camera.Parameters[PLCamera.ExposureTimeRaw].GetIncrement();
                        if (Value < min)
                        {
                            value = min;
                        }
                        else if (Value > max)
                        {
                            value = max;
                        }
                        else
                        {
                            value = min + ((((long)Value - min) / incr) * incr);
                        }
                        camera.Parameters[PLCamera.ExposureTimeRaw].SetValue(value);
                        return camera.Parameters[PLCamera.ExposureTimeRaw].GetValue();
                    }
                    else
                    {
                        if (Value <= camera.Parameters[PLUsbCamera.ExposureTime].GetMaximum() && Value >= camera.Parameters[PLUsbCamera.ExposureTime].GetMinimum())
                        {
                            camera.Parameters[PLUsbCamera.ExposureTime].SetValue((long)Value);                           
                        }
                        return camera.Parameters[PLUsbCamera.ExposureTime].GetValue();
                    }
                }
                catch (Exception)
                {
                    if (camera.GetSfncVersion() < Sfnc2_0_0)
                    {
                        return camera.Parameters[PLCamera.ExposureTimeRaw].GetValue();
                    }
                    return camera.Parameters[PLUsbCamera.ExposureTime].GetValue();
                }
               
            }

            return 0;
        }
        /// <summary>
        /// 设置增益
        /// </summary>
        /// <param name="Value"></param>
        /// <returns></returns>
        public override double SetGainRaw(double Value)
        {
            if (camera != null)
            {
                try
                {
                    camera.Parameters[PLCamera.GainAuto].TrySetValue(PLCamera.GainAuto.Off);
                    if (camera.GetSfncVersion() < Sfnc2_0_0)
                    {
                        long value;
                        long min = camera.Parameters[PLCamera.GainRaw].GetMinimum();
                        long max = camera.Parameters[PLCamera.GainRaw].GetMaximum();
                        long incr = camera.Parameters[PLCamera.GainRaw].GetIncrement();
                        if (Value < min)
                        {
                            value = min;
                        }
                        else if (Value > max)
                        {
                            value = max;
                        }
                        else
                        {
                            value = min + ((((long)Value - min) / incr) * incr);
                        }
                        camera.Parameters[PLCamera.GainRaw].SetValue(value);
                        return camera.Parameters[PLCamera.GainRaw].GetValue();
                    }
                    else
                    {
                        if (Value <= camera.Parameters[PLUsbCamera.Gain].GetMaximum() && Value >= camera.Parameters[PLUsbCamera.Gain].GetMinimum())
                        {
                            camera.Parameters[PLUsbCamera.Gain].SetValue((long)Value);
                        }
                        return camera.Parameters[PLUsbCamera.Gain].GetValue();
                    }
                }
                catch (Exception)
                {
                    if (camera.GetSfncVersion() < Sfnc2_0_0)
                    {
                        return camera.Parameters[PLCamera.GainRaw].GetValue();
                    }
                    return camera.Parameters[PLUsbCamera.Gain].GetValue();
                }
               
            }
            return 0;
        }
        /// <summary>
        /// 设置触发模式
        /// </summary>
        /// <param name="mode"></param>
        public override void SetTriggerMode(TriggerMode mode)
        {
            if (camera != null)
            {
                if (mode==TriggerMode.On)
                {
                    if (camera.GetSfncVersion() < Sfnc2_0_0)
                    {
                        camera.Parameters[PLCamera.AcquisitionMode].SetValue("SingleFrame");
                        camera.Parameters[PLCamera.TriggerSelector].SetValue(PLCamera.TriggerSelector.FrameStart);
                        camera.Parameters[PLCamera.TriggerMode].SetValue(PLCamera.TriggerMode.On);
                    }
                    else
                    {
                        camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameBurstStart);
                        camera.Parameters[PLCamera.TriggerMode].TrySetValue(PLCamera.TriggerMode.On);
                    }
                   
                }
                else
                {  
                    if (camera.GetSfncVersion() < Sfnc2_0_0)
                    {
                        if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.AcquisitionStart))
                        {
                            if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameStart))
                            {
                                camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.AcquisitionStart);
                                camera.Parameters[PLCamera.TriggerMode].TrySetValue(PLCamera.TriggerMode.Off);

                                camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameStart);
                                camera.Parameters[PLCamera.TriggerMode].TrySetValue(PLCamera.TriggerMode.Off);
                            }
                            else
                            {
                                camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.AcquisitionStart);
                                camera.Parameters[PLCamera.TriggerMode].TrySetValue(PLCamera.TriggerMode.Off);
                            }
                        }
                    }
                    else
                    {
                        if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameBurstStart))
                        {
                            if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameStart))
                            {
                                camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameBurstStart);
                                camera.Parameters[PLCamera.TriggerMode].TrySetValue(PLCamera.TriggerMode.Off);

                                camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameStart);
                                camera.Parameters[PLCamera.TriggerMode].TrySetValue(PLCamera.TriggerMode.Off);
                            }
                            else
                            {
                                camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameBurstStart);
                                camera.Parameters[PLCamera.TriggerMode].TrySetValue(PLCamera.TriggerMode.Off);
                            }
                        }
                    }
                   
                }
                //stopWatch.Restart();
            }
        }
        /// <summary>
        /// 设置触发源
        /// </summary>
        /// <param name="source"></param>
        public override void SetTriggerSource(TriggerSource source)
        {
            if (camera != null)
            {
                if (source==TriggerSource.Software)
                {
                    if (camera.GetSfncVersion() < Sfnc2_0_0)
                    {
                        if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.AcquisitionStart))
                        {
                            if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameStart))
                            {
                                camera.Parameters[PLCamera.TriggerSource].TrySetValue(PLCamera.TriggerSource.Software);
                            }
                            else
                            {                               
                                camera.Parameters[PLCamera.TriggerSource].TrySetValue(PLCamera.TriggerSource.Software);
                            }
                        }
                    }
                    else 
                    {
                        if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameBurstStart))
                        {
                            if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameStart))
                            {
                                camera.Parameters[PLCamera.TriggerSource].TrySetValue(PLCamera.TriggerSource.Software);
                            }
                            else
                            {                               
                                camera.Parameters[PLCamera.TriggerSource].TrySetValue(PLCamera.TriggerSource.Software);
                            }
                        }
                    }
                }
                else
                {
                    if (camera.GetSfncVersion() < Sfnc2_0_0)
                    {
                        if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.AcquisitionStart))
                        {
                            if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameStart))
                            {
                                camera.Parameters[PLCamera.TriggerSource].TrySetValue(PLCamera.TriggerSource.Line1);
                            }
                            else
                            {
                                camera.Parameters[PLCamera.TriggerSource].TrySetValue(PLCamera.TriggerSource.Line1);
                            }
                        }
                        camera.Parameters[PLCamera.TriggerDelayAbs].SetValue(5);        // 设置触发延时
                        camera.Parameters[PLCamera.LineSelector].TrySetValue(PLCamera.LineSelector.Line1);
                        camera.Parameters[PLCamera.LineMode].TrySetValue(PLCamera.LineMode.Input);
                        camera.Parameters[PLCamera.LineDebouncerTimeAbs].SetValue(5);       // 设置去抖延时,过滤触发信号干扰

                    }
                    else 
                    {
                        if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameBurstStart))
                        {
                            if (camera.Parameters[PLCamera.TriggerSelector].TrySetValue(PLCamera.TriggerSelector.FrameStart))
                            {
                                camera.Parameters[PLCamera.TriggerSource].TrySetValue(PLCamera.TriggerSource.Line1);
                            }
                            else
                            {
                                camera.Parameters[PLCamera.TriggerSource].TrySetValue(PLCamera.TriggerSource.Line1);
                            }
                        }
                        camera.Parameters[PLCamera.TriggerDelay].SetValue(5);// 设置触发延时
                        camera.Parameters[PLCamera.LineSelector].TrySetValue(PLCamera.LineSelector.Line1);
                        camera.Parameters[PLCamera.LineMode].TrySetValue(PLCamera.LineMode.Input);
                        camera.Parameters[PLCamera.LineDebouncerTime].SetValue(5);// 设置去抖延时,过滤触发信号干扰

                    }
                }
                //stopWatch.Restart();
            }
        }
        /// <summary>
        /// 软触发一帧
        /// </summary>
        /// <exception cref="NotImplementedException"></exception>
        public override bool TriggerSoftware()
        {
            if (camera != null)
            {
                try
                {
                    if (!camera.StreamGrabber.IsGrabbing)
                    {
                        //相机正在采集中
                        camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
                        camera.StreamGrabber.Start(GrabStrategy.LatestImages, GrabLoop.ProvidedByStreamGrabber);                      
                    }
                    if ("Off"== camera.Parameters[PLCamera.TriggerMode].GetValue())
                    {
                        SetTriggerMode(TriggerMode.On);
                        SetTriggerSource(TriggerSource.Software);
                    }
                    if (camera.WaitForFrameTriggerReady(1000, TimeoutHandling.ThrowException))
                    {
                        camera.ExecuteSoftwareTrigger();
                        return true;
                    }
                }
                catch
                {
                    return false;
                }
            }
            return false;
        }
        /// <summary>
        /// 设置Gige相机心跳时间
        /// </summary>
        /// <param name="value"></param>
        public void SetHeartBeatTime(long value)
        {
            if (camera != null)
            {
                if (camera.GetSfncVersion() < Sfnc2_0_0)
                {
                    camera.Parameters[PLGigECamera.GevHeartbeatTimeout].SetValue(value);
                }
            }
        }
        /// <summary>
        /// 单张采集
        /// </summary>
        public void Single_Collection() {
            if (camera.StreamGrabber.IsGrabbing)
            {
                return;
            }
            else
            {
                camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame); 
                camera.StreamGrabber.Start(1, GrabStrategy.LatestImages, GrabLoop.ProvidedByStreamGrabber);
               // stopWatch.Restart();
            }
        }
        //清除图像处理委托事件绑定的方法
        public void Clear_EventProcessImage_Event()
        {
            if (Image_Delegate != null)
            {
                Delegate[] dels = Image_Delegate.GetInvocationList();
                foreach (Delegate d in dels)
                {
                    //得到方法名
                    object delObj = d.GetType().GetProperty("Method").GetValue(d, null);
                    string funcName = (string)delObj.GetType().GetProperty("Name").GetValue(delObj, null);
                    Image_Delegate -= d as ImageDelegate;
                }
            }
        }
    }

  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值