需要导入这两个动态链接库
/// <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();
}
}