/// <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;
}
}
}
}
C# 连接basler相机
于 2019-10-07 20:50:52 首次发布