C#+Halcon调用Basler相机
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相机相关推荐
- VS(C#)调用Basler相机SDK采集图像及基本功能设定
注意一定要安装那个 巴斯勒的程序后在运行代码 ,要不然就报什么组建错误 注:博主看着另外一个博主的博客才有下面的一些总结,有兴趣可以看一下:https://blog.csdn.net/qq_39930 ...
- android相机采集sdk,C#用basler相机sdk采集图像并用halcon显示的小程序
C#用basler相机sdk采集图像并用halcon显示的小程序 C#用basler相机sdk采集图像并用halcon显示的小程序 本人在用halcon做图像处理做视觉项目时,通常都是用c#写程序的主 ...
- Basler相机外部触发设置(Halcon)
Basler相机外部触发设置(Halcon) 一.相机硬件接线图 2号引脚接传感器的触发信号引脚,5号与传感器共地连接. 二.pylon软件设置 三.halcon软触发相机拍照 Halcon采集助手设 ...
- **c#下halcon调用相机发生错误,不知道什么原因**
c#下halcon调用相机发生错误,不知道什么原因 "HalconDotNet.HOperatorException"类型的未经处理的异常在 halcondotnet.dll 中发 ...
- 项目总结之Basler相机的调用
需求 项目要求一个后台服务,通过交换机连接并监控多个Basler相机,项目的细节点就在于实时监控配置列表中所有的相机(相机未在线等待事件,相机断连事件,相机参数初始化,相机拍照结果返回获取等) 连接相 ...
- [视觉实战案例]Qt调用Basler网口工业相机SDK实现采图和相机参数设置
文章目录 1.采图UI显示 2.硬件连接和IP配置 2.1 外触发硬件接线 2.2 IP配置 3.代码实现 4.源码下载 1.采图UI显示 2.硬件连接和IP配置 2.1 外触发硬件接线 根据相机接线 ...
- basler相机pylon安装及API调用
1.官网下载basler相机的pylon 2.安装pylon 2.1选择pylon的模式,二次开发选择development模式 2.2选择接口,看相机的接口类型,选择相机的接口类型一般为GitE和U ...
- Basler相机Sdk采图的演示例程(C#)
机器ppm不达标的情况下,往往对视觉的处理速度有变态的要求,为了争取处理时间最短,几十毫秒也要争取. halcon的接口是通用接口,其速度是比不上相机厂商自己相机配套的SDK的采图速度的. 下面程序运 ...
- basler相机的调试与配置以及多相机同时运行(完整版)
之前在实验室做过一段时间basler相机的调试与配置工作,现将当时的工作整理汇总,以方便日后再用.注:本博客引用的所有视频链接,皆为自己实验室之前的师兄所录制,当做了我当时这部分工作入门的教学视频. ...
- ubuntu basler相机opencv
一.下载安装balser SDK https://www.baslerweb.com/cn/downloads/software-downloads/#type=pylonsoftware 选择5.2 ...
最新文章
- Leetcode 215.数组中第k个最大元素 (每日一题 20210713)
- Serverless 实战 —— Funcraft + OSS + ROS 进行 CI/CD
- Activity动态增加Fragment
- Android开发之Git提交Template模板配置
- qt 获取本机的wifi密码_还在记密码?这款开源免费的账号密码管理神器赶紧收了...
- [转]基于Storm的实时数据处理方案
- SpringBoot 添加junit单元测试+Spring Boot 的测试类库
- mac Lion 10.7系统使用笔记
- js高级学习笔记(b站尚硅谷)-2-数据、变量、内存三者的关系
- 台式计算机读取不了移动硬盘,电脑识别不了硬盘的原因
- lenovo微型计算机如何拆t410,拆解 ThinkPad T410
- sql server数据库《音乐网站》项目歌曲管理模块
- 1273-宣传墙(第九届河南省ICPC省赛 --状压DP)
- vue2.x使用Relation Graph 人物关系图谱
- 雷电模拟器一直android正在启动,雷电安卓模拟器启动后没反应、无法启动、闪退的3种解决办法-针对2020年4月4号出现的...
- 华为云视频会议系统介绍,云南昆明企业智能云视频会议系统解决方案
- UVM中的factory机制
- UE5笔记【四】UE5主材质Master Materials和材质实例MI
- Android系统无限重启,安卓手机无限重启如何解决
- Android 构建简单app 步骤