Basler相机Sdk采图的演示例程(C#)
机器ppm不达标的情况下,往往对视觉的处理速度有变态的要求,为了争取处理时间最短,几十毫秒也要争取。
halcon的接口是通用接口,其速度是比不上相机厂商自己相机配套的SDK的采图速度的。
下面程序运行后,500w的CCD拍图的时间(不算显示时间)达到惊人的32毫秒,如果用halcon接口,最快的我见过是180毫秒。
using Basler.Pylon;
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApplication1
{public partial class Form1 : Form{private PixelDataConverter converter = new PixelDataConverter();/// <summary>/// 相机ID/// </summary>public string UserID { get { return userID; } }private string userID = string.Empty;private Stopwatch sw = new Stopwatch();private bool isOkGrab = false;private IntPtr latestFrameAddress = IntPtr.Zero;public HObject Image { get { return image; } }private HObject image = null;static Version Sfnc2_0_0 = new Version(2, 0, 0);private Camera camera = null;HTuple handle;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){var f1=BaslerCameraInit();if(f1){MessageBox.Show( Open().ToString());}}/// <summary>/// 实例化第一个找到的相机/// </summary>public bool BaslerCameraInit(){try{camera = new Camera();camera.StreamGrabber.ImageGrabbed -= StreamGrabber_ImageGrabbed;camera.StreamGrabber.ImageGrabbed+=StreamGrabber_ImageGrabbed;return true;}catch (Exception ex){return false;//NotifyG.Error(ex.ToString());}}/// <summary>/// 根据相机UserID实例化相机/// </summary>/// <param name="UserID"></param>public bool BaslerCameraInit(string userID){try{// 枚举相机列表List<ICameraInfo> allCameraInfos = CameraFinder.Enumerate();foreach (ICameraInfo cameraInfo in allCameraInfos){if (userID == cameraInfo[CameraInfoKey.UserDefinedName]){this.userID = userID;camera = new Camera(cameraInfo);camera.StreamGrabber.ImageGrabbed -= StreamGrabber_ImageGrabbed;camera.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed;}}if (camera == null){//NotifyG.Error("未识别到UserID为“" + UserID + "”的相机!");return false;}return true;}catch (Exception ex){return false;//NotifyG.Error(ex.ToString());}}void StreamGrabber_ImageGrabbed(object sender, ImageGrabbedEventArgs e){try{// Acquire the image from the camera. Only show the latest image. The camera may acquire images faster than the images can be displayed.// Get the grab result.IGrabResult grabResult = e.GrabResult;// Check if the image can be displayed.if (grabResult.IsValid){//grabTime = sw.ElapsedMilliseconds;//if (eventComputeGrabTime != null) eventComputeGrabTime(grabTime);//Reduce the number of displayed images to a reasonable amount if the camera is acquiring images very fast.// **** 降低显示帧率,减少CPU占用率 **** ////if (!stopWatch.IsRunning || stopWatch.ElapsedMilliseconds > 33){//stopWatch.Restart();// 判断是否是黑白图片格式if (grabResult.PixelTypeValue == PixelType.Mono8){//allocate the m_stream_size amount of bytes in non-managed environment if (latestFrameAddress == IntPtr.Zero){latestFrameAddress = Marshal.AllocHGlobal((Int32)grabResult.PayloadSize);}converter.OutputPixelFormat = PixelType.Mono8;converter.Convert(latestFrameAddress, grabResult.PayloadSize, grabResult);HOperatorSet.GenEmptyObj(out image);image.Dispose();// 转换为Halcon图像显示HOperatorSet.GenImage1(out image, "byte", grabResult.Width, grabResult.Height, latestFrameAddress);HOperatorSet.SetPart(handle, 0, 0, grabResult.Height - 1, grabResult.Width - 1);}else if (grabResult.PixelTypeValue == PixelType.BayerBG8 || grabResult.PixelTypeValue == PixelType.BayerGB8|| grabResult.PixelTypeValue == PixelType.BayerRG8 || grabResult.PixelTypeValue == PixelType.YUV422packed){int imageWidth = grabResult.Width - 1;int imageHeight = grabResult.Height - 1;HOperatorSet.SetPart(handle, 0, 0, imageHeight, imageWidth);int payloadSize = imageWidth * imageHeight;//allocate the m_stream_size amount of bytes in non-managed environment if (latestFrameAddress == IntPtr.Zero){latestFrameAddress = Marshal.AllocHGlobal((Int32)(3 * payloadSize));}converter.OutputPixelFormat = PixelType.RGB8packed; // 根据下面halcon转换的色彩格式bgrconverter.Parameters[PLPixelDataConverter.InconvertibleEdgeHandling].SetValue("Clip");converter.Convert(latestFrameAddress, 3 * payloadSize, grabResult);HOperatorSet.GenImageInterleaved(out image, latestFrameAddress, "bgr",(HTuple)imageWidth, (HTuple)imageHeight, -1, "byte", (HTuple)imageWidth, (HTuple)imageHeight, 0, 0, -1, 0);}else{//NotifyG.Error(DeviceName + "拍照失败,相机图像格式设置");return;}isOkGrab = true;//MessageBox.Show(isOkGrab.ToString());// 抛出图像处理事件//if (EventGrab != null) EventGrab(this, new CameraGrabEventArgs(image));}}}catch (Exception ex){//MessageBox.Show(ex.ToString());return;}finally{// Dispose the grab result if needed for returning it to the grab loop.e.DisposeGrabResultIfClone();}}/// <summary>/// 打开相机/// </summary>public bool Open(){try{if (camera.IsOpen) camera.Close();Thread.Sleep(200);camera.Open();var imageWidth = camera.Parameters[PLCamera.Width].GetValue(); // 获取图像宽 var imageHeight = camera.Parameters[PLCamera.Height].GetValue(); // 获取图像高GetMinMaxExposureTime();GetMinMaxGain();camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);//NotifyG.Debug(DeviceName + "打开相机成功:" + userID);}catch (Exception ex){MessageBox.Show(ex.ToString());return false;}return true;}/// <summary>/// 关闭相机,释放相关资源/// </summary>public new bool Close(){try{camera.Close();camera.Dispose();if (Image != null){Image.Dispose();}if (latestFrameAddress != null){Marshal.FreeHGlobal(latestFrameAddress);latestFrameAddress = IntPtr.Zero;}//NotifyG.Debug(DeviceName + "关闭相机成功:" + userID);}catch (Exception ex){MessageBox.Show(ex.ToString());return false;}return true;}/// <summary>/// 单张采集/// </summary>public bool GrabImage(){try{isOkGrab = false;sw.Restart();if (camera.StreamGrabber.IsGrabbing){//NotifyG.Error("相机当前正处于采集状态!");return false;}else{camera.StreamGrabber.Start(1, GrabStrategy.LatestImages, GrabLoop.ProvidedByStreamGrabber);//while (!isOkGrab)//{// if (sw.ElapsedMilliseconds > 2000) { isOkGrab = false; return false; }// Thread.Sleep(1);//}//NotifyG.Debug(DeviceName + "拍照成功:" + sw.ElapsedMilliseconds);return true;}}catch (Exception ex){MessageBox.Show(ex.ToString());return false;}return true;}/// <summary>/// 开始连续采集/// </summary>public bool StartGrabbing(){try{if (camera.StreamGrabber.IsGrabbing){//NotifyG.Error("相机当前正处于采集状态!");return false;}else{camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);camera.StreamGrabber.Start(GrabStrategy.LatestImages, GrabLoop.ProvidedByStreamGrabber);return true;}}catch (Exception ex){//NotifyG.Error(DeviceName + ex.ToString());return false;}}/// <summary>/// 停止连续采集/// </summary>public bool StopGrabbing(){try{if (camera.StreamGrabber.IsGrabbing){camera.StreamGrabber.Stop();}}catch (Exception ex){//NotifyG.Error(DeviceName + ex.ToString());}return true;}/// <summary>/// 获取最小最大曝光时间/// </summary>public void GetMinMaxExposureTime(){try{if (camera.GetSfncVersion() < Sfnc2_0_0){var minExposureTime = camera.Parameters[PLCamera.ExposureTimeRaw].GetMinimum();var maxExposureTime = camera.Parameters[PLCamera.ExposureTimeRaw].GetMaximum();}else{var minExposureTime = (long)camera.Parameters[PLUsbCamera.ExposureTime].GetMinimum();var maxExposureTime = (long)camera.Parameters[PLUsbCamera.ExposureTime].GetMaximum();}}catch (Exception ex){}}/// <summary>/// 获取最小最大增益/// </summary>public void GetMinMaxGain(){try{if (camera.GetSfncVersion() < Sfnc2_0_0){var minGain = camera.Parameters[PLCamera.GainRaw].GetMinimum();var maxGain = camera.Parameters[PLCamera.GainRaw].GetMaximum();}else{var minGain = (long)camera.Parameters[PLUsbCamera.Gain].GetMinimum();var maxGain = (long)camera.Parameters[PLUsbCamera.Gain].GetMaximum();}}catch (Exception ex){//NotifyG.Error(DeviceName + ex.ToString());}}private void button2_Click(object sender, EventArgs e){Stopwatch sw1 = new Stopwatch();sw1.Start();var f1 = GrabImage();sw1.Stop();MessageBox.Show(string.Format("grab time:{0}",sw1.ElapsedMilliseconds));//if(f1)//{// if (null != Image)// HOperatorSet.DispObj(Image, hWindowControl1.Handle);//}}private void Form1_FormClosing(object sender, FormClosingEventArgs e){if (null != camera && camera.IsOpen)Close();}private void button6_Click(object sender, EventArgs e){try{if (null != Image && Image.IsInitialized()){//HOperatorSet.WriteImage(Image, "bmp", 0, "d:\\123.bmp");HOperatorSet.DispObj(Image, handle);}}catch (Exception ex){MessageBox.Show(ex.Message);}}private void Form1_Load(object sender, EventArgs e){handle = hWindowControl1.HalconWindow;}private void button3_Click(object sender, EventArgs e){timer1.Start();StartGrabbing();}private void button4_Click(object sender, EventArgs e){timer1.Stop();StopGrabbing();}private void timer1_Tick(object sender, EventArgs e){button6_Click(null, null);}}
}
当这个程序被强行在进程中关闭后,你会发现再启动程序就初始化相机失败。
这是因为相机的句柄没有被关闭。上面的演示例程中,关闭句柄被放在了form窗口正常关闭的时候。
你重启电脑可以解决这个问题,或者你也可以等个几分钟,再启动程序也可以连上相机。
下面附上常见工业相机的SDK开发资料网址:
Basler相机
Basler pylon相机软件套装是一款包含易于使用的SDK、驱动程序和工具的软件套装,您可通过Windows、Linux PC或Mac来操作任何一款Basler相机。pylon采用最新GenICam技术,可无限制访问最新型号的相机并使用相关功能。
Basler – 德国工业相机_工业镜头_工业光源_线材等视觉组件提供商
机器视觉软件及工业相机软件下载 - pylon, ToF 等 | Basler
MvCameraControl海康相机
海康机器人Hikrobot-官方网站
海康机器人Hikrobot-官方网站
机器视觉工业相机客户端MVS V3.1.0
软件版本:MVS3.1.0 build20181229
TIS映美精工业相机,映美精IC Imageing Control.net
Machine vision software and drivers for Microsoft Windows
https://www.theimagingsource.com/support/downloads-for-windows/software-development-kits-sdks/icimagingcontrol/
Software Development Kits (SDKs)
IC Imaging Control .NET Component for C#, VB.NET, C++ Class Library for C++ projects
ic_setup_3.4.0.2744.exe
Teledyne DALSA
Sapera LT SDK是一款图像采集与控制软件的开发工具包(SDK),用于Teledyne DALSA相机与采集卡。Sapera LT支持从相机与采集卡中采集图像,依据的标准包括GigE Vision;CameraLink与CameraLink HS。GigE Vision是一种基于千兆以太网通信协议开发的相机接口标准。
Sapera LT | Teledyne DALSA
www.lustervision.com/dalsa-linea/
Sapera LT SDK - 软件 - 志强视觉科技
大恒相机
大恒图像-专业的机器视觉核心部件及解决方案供应商
Point Grey相机
FlyCapture SDK是加拿大Point Grey(灰点)公司开发的功能丰富,最稳定的软件套件。
FlyCapture SDK | Teledyne FLIR
Machine Vision – Area Scan Cameras | Teledyne FLIR
Basler相机Sdk采图的演示例程(C#)相关推荐
- android相机采集sdk,C#用basler相机sdk采集图像并用halcon显示的小程序
C#用basler相机sdk采集图像并用halcon显示的小程序 C#用basler相机sdk采集图像并用halcon显示的小程序 本人在用halcon做图像处理做视觉项目时,通常都是用c#写程序的主 ...
- 利用相机SDK采相转换至HImage
来源于http://blog.sina.com.cn/s/blog_d40acd530102xndm.html Halcon采相功能非常强大,基本支持各大品牌以及各个通信接口的相机,并且Halcon提 ...
- VisionMaster4.2.0 联合C#实现相机SDK取图
VisionMaster4.2.0 联合C#实现相机SDK取图 一.相机取流 1.1 设备连接接口流程 1.2 主动取流 1.3 回调取流 二.VisionMaster 图像源SDK取图 一般情况下, ...
- VS(C#)调用Basler相机SDK采集图像及基本功能设定
注意一定要安装那个 巴斯勒的程序后在运行代码 ,要不然就报什么组建错误 注:博主看着另外一个博主的博客才有下面的一些总结,有兴趣可以看一下:https://blog.csdn.net/qq_39930 ...
- Basler相机SDK开发
作为集成商,本着万事从官方开始的原则,先来到basler官网Basler – 德国工业相机_工业镜头_工业光源_线材等视觉组件提供商 随便找一款相机,下载Basler pylon相机软件套装,下载py ...
- Basler相机SDK相关问题收集与知识汇总
1.心跳时间导致报错 此心跳非彼心跳,相机心跳是指过通过设置一个时间用于监测相机和网卡的连接,如果超过这个时间,相机就会释放跟网卡的连接,进入一种允许相机被再次连接的状态. 但此方式会导致相机SDK报 ...
- 使用Basler相机SDK采集的显示图片
采用Basler acg-2500相机完成这次测试 首先去Basler官网下载SDK,就是那个pylon程序,里面集成了相机调试工具及SDK,自行安装. 然后使用pylon IP Configurat ...
- basler 相机取图超时_一款Basler相机拍图问题(单次拍照时间过长,连续拍照正常)的处理经验...
这款Basler相机1000W像素.GigE 接口,不用独立供电. 它的故障现象为:halcon连续采图,有10帧的速度,但是单次采图有580毫秒. 这种情况按经验一般怀疑下面的问题: (1)网卡驱动 ...
- Baumer(堡盟)相机SDK下载以及使用说明
文章目录 前言 一.安装 Baumer BGAPI 2.9.1.21658 二.安装 Baumer Filter Driver(相机网卡驱动) 三.网卡的配置选项的设置 四.相机的 IP 地址设置 五 ...
最新文章
- html5标记汇总,HTML标记汇总(1)_HTML教程
- Android开发究竟该如何学习,成功入职字节跳动
- ACL 2019开源论文 | 句对匹配任务中的样本选择偏差与去偏方法
- svn 合并和树冲突
- Android之简单背景颜色渐变实现
- 判断作弊 牛客 编程_牛客企业服务产品-新功能速递-第5期
- 仅30分钟,在同一台设备安装discourse和wordpress
- 自动驾驶中的滞后碰撞检测(lazy-collision-checking)
- oracle电梯案例,Oracle技术嘉年华的一个案例,redo的那些事,连载一
- 大数据学习笔记14:MR案例——招聘数据分析
- 上传txt生成字典 java_文件上传漏洞fuzz字典生成脚本小工具分享
- 激活函数总结——2020.2.10
- eclipse运行java总显示上一个程序的运行结果(解决方案)
- 创业者的心得:心有菩提手有刀,欲成舍利却成妖(转)
- 华为新员工入职培训计划曝光!你留不住员工的原因就在这! zz
- linux 文件添加标签,SELinux——有趣的标签
- 【PMP】PMP考试易错点总结和答题技巧总结
- python 读取地震道头数据_使用python获取(宜宾市地震信息)地震信息
- js 判断视频编码格式是不是avc格式的
- 树莓派35/100 - 用graphviz画逻辑电路图
热门文章
- python读取txt文本出现中文乱码已解决。
- IntelliJ idea——》JSON字符串,自动转义双引号
- linux原子过程,linux系统编程:IO读写过程的原子性操作实验
- hive 任务查询报错 Reduce operator initialization failed
- GPS接收机(三)低噪放设计和版图仿真优化
- Maven系列之使用阿里云仓库
- 必备知识---TCP三次握手和四次挥手以及SSL四次握手
- 51单片机频率计c语言程序,基于51单片机的频率计程序
- AMD皓龙系列服务器CPU,霄龙PK皓龙!AMD CPU 10年历史对比:一步登天
- Java8新特性-Optional,狂神说docker笔记百度云