using HalconDotNet; using Microsoft.CodeAnalysis.CSharp.Syntax; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Threading; namespace LB_VisionProcesses.Cameras { public abstract class BaseCamera : ICamera { protected BaseCamera() { } #region Parm /// /// 相机SN号 /// public string SN { get; set; } = string.Empty; /// /// 相机名称 /// public string CameraName { get; set; } = string.Empty; public CameraBrand Brand { get; set; } = CameraBrand.UNSUPPORTED; public bool isGrabbing = false; //public EventHandler ImageGrabbed = delegate { }; private EventHandler _imageGrabbed; public EventHandler ImageGrabbed { get => _imageGrabbed; set { Debug.WriteLine($"ImageGrabbed 被设置,新值: {value?.Method}"); Debug.WriteLine($"调用堆栈: {Environment.StackTrace}"); _imageGrabbed = value; } } protected static Bitmap CallBackImg { get; set; } private Dictionary> _collectedImages; public Dictionary> CollectedImages { get => _collectedImages; set { _collectedImages = value; } } public Bitmap Bitmap; #endregion #region operate public virtual void Dispose() { try { CloseDevice(); } catch { } } public abstract bool CloseDevice(); public abstract List GetListEnum(); public abstract bool InitDevice(string SN, object Handle = null); public abstract bool StartWith_SoftTriggerModel(); public abstract bool StartWith_HardTriggerModel(TriggerSource hardtriggeritem = TriggerSource.Line0); /// /// 等待软/硬触发获取图像 /// /// /// /// public abstract bool GetImage(out Bitmap bitmap, int outtime = 3000); /// /// 软触发获取图像 /// /// /// /// public abstract bool GetImageWithSoftTrigger(out Bitmap bitmap, int outtime = 3000); /// /// 软触发 /// /// public abstract bool SoftTrigger(); public void Bitmap2HObject(Bitmap bmp, out HObject image) { try { if (bmp == null) { image = null; return; } BitmapData srcBmpData; switch (bmp.PixelFormat) { case PixelFormat.Format24bppRgb: srcBmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); HOperatorSet.GenImageInterleaved(out image, srcBmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0); bmp.UnlockBits(srcBmpData); break; default: srcBmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); HOperatorSet.GenImage1(out image, "byte", bmp.Width, bmp.Height, srcBmpData.Scan0); bmp.UnlockBits(srcBmpData); break; } } catch (Exception ex) { image = null; } } #endregion #region SettingConfig public abstract void SetCamConfig(CameraConfig config); public abstract void GetCamConfig(out CameraConfig config); /// /// 设置触发模式及触发源 /// /// /// /// public abstract bool SetTriggerMode(TriggerMode mode, TriggerSource triggerEnum = TriggerSource.Line0); public abstract bool GetTriggerMode(out TriggerMode mode, out TriggerSource source); public abstract bool SetExpouseTime(double value); public abstract bool GetExpouseTime(out double value); public abstract bool SetTriggerPolarity(TriggerPolarity polarity); public abstract bool GetTriggerPolarity(out TriggerPolarity polarity); /// /// 设置触发滤波时间 (us) /// /// /// public abstract bool SetTriggerFliter(double flitertime); /// /// 获取触发参数时间 (us) /// /// /// public abstract bool GetTriggerFliter(out double flitertime); public abstract bool SetTriggerDelay(double delay); public abstract bool GetTriggerDelay(out double delay); public abstract bool SetGain(double gain); public abstract bool GetGain(out double gain); public abstract bool SetLineMode(IOLines line, LineMode mode); public abstract bool SetLineStatus(IOLines line, LineStatus linestatus); public abstract bool GetLineStatus(IOLines line, out LineStatus lineStatus); public abstract bool AutoBalanceWhite(); #endregion #region protected abstract /// /// 开始采图(默认单次采集) /// /// public abstract bool StartGrabbing(); /// /// 单次采集模式(适用于线扫相机) /// /// public virtual bool StartSingleGrab() { // 默认实现:普通相机不支持单次采集,直接返回false // 线扫相机需要重写此方法 return false; } /// /// 连续采集模式 /// /// public abstract bool StartContinuousGrab(); /// /// 停止采图 /// /// public abstract bool StopGrabbing(); #endregion } }