Basler调用类:

ps:这个类经我手删删减减精简出来的一个Basler相机调用的类。后边有它的简单演示,也不演示过多的东西

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;using HalconDotNet;
using Basler.Pylon;namespace Basler相机的调用
{class BaslerClass{private Camera camera = null;private PixelDataConverter converter = new PixelDataConverter();private string strUserID = null;public long imageWidth = 0;         // 图像宽public long imageHeight = 0;        // 图像高public long minExposureTime = 0;    // 最小曝光时间public long maxExposureTime = 0;    // 最大曝光时间public long minGain = 0;            // 最小增益public long maxGain = 0;            // 最大增益private long grabTime = 0;          // 采集图像时间private HObject hPylonImage = null;private IntPtr latestFrameAddress = IntPtr.Zero;private Stopwatch stopWatch = new Stopwatch();/// <summary>/// 计算采集图像时间自定义委托/// </summary>/// <param name="time">采集图像时间</param>public delegate void delegateComputeGrabTime(long time);/// <summary>/// 计算采集图像时间委托事件/// </summary>public event delegateComputeGrabTime eventComputeGrabTime;/// <summary>/// 图像处理自定义委托/// </summary>/// <param name="hImage">halcon图像变量</param>public delegate void delegateProcessHImage(HObject hImage);/// <summary>/// 图像处理委托事件/// </summary>public event delegateProcessHImage eventProcessImage;/// <summary>/// if >= Sfnc2_0_0,说明是USB3的相机/// </summary>static Version Sfnc2_0_0 = new Version(2, 0, 0);/******************    实例化相机    ******************//// <summary>/// 实例化第一个找到的相机/// </summary>public BaslerClass(){try{camera = new Camera();}catch (Exception e){ShowException(e);}}/// <summary>/// 根据相机UserID实例化相机/// </summary>/// <param name="UserID"></param>public BaslerClass(string UserID){try{strUserID = UserID;// 枚举相机列表List<ICameraInfo> allCameraInfos = CameraFinder.Enumerate();foreach (ICameraInfo cameraInfo in allCameraInfos){if (strUserID == cameraInfo[CameraInfoKey.UserDefinedName]){camera = new Camera(cameraInfo);}}if (camera == null){MessageBox.Show("未识别到UserID为“" + strUserID + "”的相机!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}}catch (Exception e){ShowException(e);}}//清除图像处理委托事件绑定的方法public void Clear_EventProcessImage_Event(){if (eventProcessImage != null){Delegate[] dels = eventProcessImage.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);Debug.Print(funcName);eventProcessImage -= d as delegateProcessHImage;}}}/*****************************************************//******************    相机操作     ******************//// <summary>/// 打开相机/// </summary>public bool OpenCam(){try{camera.Open();imageWidth = camera.Parameters[PLCamera.Width].GetValue();               // 获取图像宽 imageHeight = camera.Parameters[PLCamera.Height].GetValue();              // 获取图像高GetMinMaxExposureTime();GetMinMaxGain();camera.StreamGrabber.ImageGrabbed += OnImageGrabbed;                      // 注册采集回调函数camera.ConnectionLost += OnConnectionLost;}catch (Exception e){return false;}return true;}/// <summary>/// 关闭相机,释放相关资源/// </summary>public void CloseCam(){try{camera.Close();camera.Dispose();if (hPylonImage != null){hPylonImage.Dispose();}if (latestFrameAddress != null){Marshal.FreeHGlobal(latestFrameAddress);latestFrameAddress = IntPtr.Zero;}}catch (Exception e){ShowException(e);}}/// <summary>/// 相机是否忙碌中/// </summary>public bool isBusy(){return camera.StreamGrabber.IsGrabbing;}/// <summary>/// 单张采集/// </summary>public bool GrabOne(){try{if (camera.StreamGrabber.IsGrabbing){MessageBox.Show("Camera is now Continue Grabing Images!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);return false;}else{camera.Parameters[PLCamera.AcquisitionMode].SetValue("SingleFrame");camera.StreamGrabber.Start(1, GrabStrategy.LatestImages, GrabLoop.ProvidedByStreamGrabber);stopWatch.Restart();return true;}}catch (Exception e){ShowException(e);return false;}}/// <summary>/// 开始连续采集/// </summary>public bool StartGrabbing(){try{if (camera.StreamGrabber.IsGrabbing){MessageBox.Show("Camera is now Continue Grabing Images", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);return false;}else{camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);camera.StreamGrabber.Start(GrabStrategy.LatestImages, GrabLoop.ProvidedByStreamGrabber);stopWatch.Restart();return true;}}catch (Exception e){ShowException(e);return false;}}/// <summary>/// 停止连续采集/// </summary>public void StopGrabbing(){try{if (camera.StreamGrabber.IsGrabbing){camera.StreamGrabber.Stop();}}catch (Exception e){ShowException(e);}}/*********************************************************//******************    相机参数设置   ********************//// <summary>/// 设置Gige相机心跳时间/// </summary>/// <param name="value"></param>public void SetHeartBeatTime(long value){try{// 判断是否是网口相机if (camera.GetSfncVersion() < Sfnc2_0_0){camera.Parameters[PLGigECamera.GevHeartbeatTimeout].SetValue(value);}}catch (Exception e){ShowException(e);}}/// <summary>/// 设置相机曝光时间/// </summary>/// <param name="value"></param>public void SetExposureTime(long value){try{//要手动设置曝光时间 需要把自动曝光参数设置为false  把相机曝光模式设置为延时曝光模式camera.Parameters[PLCamera.ExposureAuto].TrySetValue(PLCamera.ExposureAuto.Off);camera.Parameters[PLCamera.ExposureMode].TrySetValue(PLCamera.ExposureMode.Timed);if (camera.GetSfncVersion() < Sfnc2_0_0){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 + (((value - min) / incr) * incr);}camera.Parameters[PLCamera.ExposureTimeRaw].SetValue(value);}else{camera.Parameters[PLUsbCamera.ExposureTime].SetValue((double)value);}}catch (Exception e){ShowException(e);}}/// <summary>/// 获取最小最大曝光时间/// </summary>public void GetMinMaxExposureTime(){try{if (camera.GetSfncVersion() < Sfnc2_0_0){minExposureTime = camera.Parameters[PLCamera.ExposureTimeRaw].GetMinimum();maxExposureTime = camera.Parameters[PLCamera.ExposureTimeRaw].GetMaximum();}else{minExposureTime = (long)camera.Parameters[PLUsbCamera.ExposureTime].GetMinimum();maxExposureTime = (long)camera.Parameters[PLUsbCamera.ExposureTime].GetMaximum();}}catch (Exception e){ShowException(e);}}/// <summary>/// 设置增益/// </summary>/// <param name="value"></param>public void SetGain(long value){try{camera.Parameters[PLCamera.GainAuto].TrySetValue(PLCamera.GainAuto.Off);if (camera.GetSfncVersion() < Sfnc2_0_0){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 + (((value - min) / incr) * incr);}camera.Parameters[PLCamera.GainRaw].SetValue(value);}else{camera.Parameters[PLUsbCamera.Gain].SetValue(value);}}catch (Exception e){ShowException(e);}}/// <summary>/// 获取最小最大增益/// </summary>public void GetMinMaxGain(){try{if (camera.GetSfncVersion() < Sfnc2_0_0){minGain = camera.Parameters[PLCamera.GainRaw].GetMinimum();maxGain = camera.Parameters[PLCamera.GainRaw].GetMaximum();}else{minGain = (long)camera.Parameters[PLUsbCamera.Gain].GetMinimum();maxGain = (long)camera.Parameters[PLUsbCamera.Gain].GetMaximum();}}catch (Exception e){ShowException(e);}}/****************************************************//****************  图像响应事件函数  ****************/// 相机取像回调函数.private void OnImageGrabbed(Object sender, ImageGrabbedEventArgs e){try{IGrabResult grabResult = e.GrabResult;if (grabResult.GrabSucceeded){grabTime = stopWatch.ElapsedMilliseconds;{if (latestFrameAddress == IntPtr.Zero){latestFrameAddress = Marshal.AllocHGlobal((Int32)grabResult.PayloadSize);}converter.OutputPixelFormat = PixelType.Mono8;converter.Convert(latestFrameAddress, grabResult.PayloadSize, grabResult);// 转换为Halcon图像显示HOperatorSet.GenImage1(out hPylonImage, "byte", (HTuple)grabResult.Width, (HTuple)grabResult.Height, (HTuple)latestFrameAddress);// 抛出图像处理事件eventProcessImage(hPylonImage);hPylonImage.Dispose();}}else{MessageBox.Show("Grab faild!\n" + grabResult.ErrorDescription, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}}catch (Exception exception){ShowException(exception);}finally{e.DisposeGrabResultIfClone();}}/****************************************************//// <summary>/// 掉线重连回调函数/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void OnConnectionLost(Object sender, EventArgs e){try{camera.Close();for (int i = 0; i < 100; i++){try{camera.Open();if (camera.IsOpen){MessageBox.Show("已重新连接上UserID为“" + strUserID + "”的相机!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);break;}Thread.Sleep(200);}catch{MessageBox.Show("请重新连接UserID为“" + strUserID + "”的相机!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);}}if (camera == null){MessageBox.Show("重连超时20s:未识别到UserID为“" + strUserID + "”的相机!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}SetHeartBeatTime(5000);imageWidth = camera.Parameters[PLCamera.Width].GetValue();               // 获取图像宽 imageHeight = camera.Parameters[PLCamera.Height].GetValue();              // 获取图像高GetMinMaxExposureTime();GetMinMaxGain();camera.StreamGrabber.ImageGrabbed += OnImageGrabbed;                      // 注册采集回调函数camera.ConnectionLost += OnConnectionLost;}catch (Exception exception){ShowException(exception);}}private void ShowException(Exception exception){MessageBox.Show("Exception caught:\n" + exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}}
}

演示:

环境准备:

项目目录:

引用文件:

Basler.Pylon.dll

halcondontnet.dll

Winform布局:

代码:

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Basler相机的调用
{public partial class Form1 : Form{//实例化相机private static BaslerClass basler;public Form1(){InitializeComponent();Loader_Form1();}private void Loader_Form1() {basler = new BaslerClass();if (basler.OpenCam()){//设置相机心跳时间basler.SetHeartBeatTime(10000);MessageBox.Show("相机连接成功!");//绑定图片显示的回调函数basler.eventProcessImage += show_Image;//初始化trackBar控件trackBar1.Minimum = 0;trackBar1.Maximum = 50;trackBar1.TickFrequency = 1;}else{MessageBox.Show("未连接到相机!");}}//单采集private void button1_Click(object sender, EventArgs e){basler.GrabOne();}//连续采集private void button2_Click(object sender, EventArgs e){basler.StartGrabbing();}//停止采集private void button3_Click(object sender, EventArgs e){basler.StopGrabbing();}//设置增益private void set_Gain(object sender, EventArgs e) {long value = trackBar1.Value;basler.SetGain(value);}//在halcon控件中显示图像private void show_Image(HObject ho_Image) {HTuple hv_Height = null, hv_Width = null, hv_WinHandle = this.hWindowControl1.HalconWindow;if (ho_Image != null){HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);HOperatorSet.SetPart(hv_WinHandle, 0, 0, hv_Height, hv_Width);HOperatorSet.DispObj(ho_Image, hv_WinHandle);}}}
}

效果:

注意:trackBar控件需要绑定ValueChanged事件

拔掉相机网线后:

C#+Halcon调用Basler相机相关推荐

  1. VS(C#)调用Basler相机SDK采集图像及基本功能设定

    注意一定要安装那个 巴斯勒的程序后在运行代码 ,要不然就报什么组建错误 注:博主看着另外一个博主的博客才有下面的一些总结,有兴趣可以看一下:https://blog.csdn.net/qq_39930 ...

  2. android相机采集sdk,C#用basler相机sdk采集图像并用halcon显示的小程序

    C#用basler相机sdk采集图像并用halcon显示的小程序 C#用basler相机sdk采集图像并用halcon显示的小程序 本人在用halcon做图像处理做视觉项目时,通常都是用c#写程序的主 ...

  3. Basler相机外部触发设置(Halcon)

    Basler相机外部触发设置(Halcon) 一.相机硬件接线图 2号引脚接传感器的触发信号引脚,5号与传感器共地连接. 二.pylon软件设置 三.halcon软触发相机拍照 Halcon采集助手设 ...

  4. **c#下halcon调用相机发生错误,不知道什么原因**

    c#下halcon调用相机发生错误,不知道什么原因 "HalconDotNet.HOperatorException"类型的未经处理的异常在 halcondotnet.dll 中发 ...

  5. 项目总结之Basler相机的调用

    需求 项目要求一个后台服务,通过交换机连接并监控多个Basler相机,项目的细节点就在于实时监控配置列表中所有的相机(相机未在线等待事件,相机断连事件,相机参数初始化,相机拍照结果返回获取等) 连接相 ...

  6. [视觉实战案例]Qt调用Basler网口工业相机SDK实现采图和相机参数设置

    文章目录 1.采图UI显示 2.硬件连接和IP配置 2.1 外触发硬件接线 2.2 IP配置 3.代码实现 4.源码下载 1.采图UI显示 2.硬件连接和IP配置 2.1 外触发硬件接线 根据相机接线 ...

  7. basler相机pylon安装及API调用

    1.官网下载basler相机的pylon 2.安装pylon 2.1选择pylon的模式,二次开发选择development模式 2.2选择接口,看相机的接口类型,选择相机的接口类型一般为GitE和U ...

  8. Basler相机Sdk采图的演示例程(C#)

    机器ppm不达标的情况下,往往对视觉的处理速度有变态的要求,为了争取处理时间最短,几十毫秒也要争取. halcon的接口是通用接口,其速度是比不上相机厂商自己相机配套的SDK的采图速度的. 下面程序运 ...

  9. basler相机的调试与配置以及多相机同时运行(完整版)

    之前在实验室做过一段时间basler相机的调试与配置工作,现将当时的工作整理汇总,以方便日后再用.注:本博客引用的所有视频链接,皆为自己实验室之前的师兄所录制,当做了我当时这部分工作入门的教学视频. ...

  10. ubuntu basler相机opencv

    一.下载安装balser SDK https://www.baslerweb.com/cn/downloads/software-downloads/#type=pylonsoftware 选择5.2 ...

最新文章

  1. Leetcode 215.数组中第k个最大元素 (每日一题 20210713)
  2. Serverless 实战 —— Funcraft + OSS + ROS 进行 CI/CD
  3. Activity动态增加Fragment
  4. Android开发之Git提交Template模板配置
  5. qt 获取本机的wifi密码_还在记密码?这款开源免费的账号密码管理神器赶紧收了...
  6. [转]基于Storm的实时数据处理方案
  7. SpringBoot 添加junit单元测试+Spring Boot 的测试类库
  8. mac Lion 10.7系统使用笔记
  9. js高级学习笔记(b站尚硅谷)-2-数据、变量、内存三者的关系
  10. 台式计算机读取不了移动硬盘,电脑识别不了硬盘的原因
  11. lenovo微型计算机如何拆t410,拆解 ThinkPad T410
  12. sql server数据库《音乐网站》项目歌曲管理模块
  13. 1273-宣传墙(第九届河南省ICPC省赛 --状压DP)
  14. vue2.x使用Relation Graph 人物关系图谱
  15. 雷电模拟器一直android正在启动,雷电安卓模拟器启动后没反应、无法启动、闪退的3种解决办法-针对2020年4月4号出现的...
  16. 华为云视频会议系统介绍,云南昆明企业智能云视频会议系统解决方案
  17. UVM中的factory机制
  18. UE5笔记【四】UE5主材质Master Materials和材质实例MI
  19. Android系统无限重启,安卓手机无限重启如何解决
  20. Android 构建简单app 步骤

热门文章

  1. 抓取网易云音乐歌曲热门评论生成词云
  2. 2017CS231n李飞飞深度视觉识别笔记(八)——深度学习 软件
  3. 五种百度云盘下载速度慢解决方法
  4. 详解ResNet残差网络
  5. 程序员做自媒体变现,可以选择的平台有哪些?各自的特点是什么?
  6. C++泛型编程——迭代器
  7. MarkDown下载以及入门语法(一)
  8. win10专业版激活时提示无法连接到internet怎么办?
  9. vs2019python使用教程_vs2019安装和使用详细图文教程
  10. onlyoffice 在线预览编辑office