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
}
}