机器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#)相关推荐

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

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

  2. 利用相机SDK采相转换至HImage

    来源于http://blog.sina.com.cn/s/blog_d40acd530102xndm.html Halcon采相功能非常强大,基本支持各大品牌以及各个通信接口的相机,并且Halcon提 ...

  3. VisionMaster4.2.0 联合C#实现相机SDK取图

    VisionMaster4.2.0 联合C#实现相机SDK取图 一.相机取流 1.1 设备连接接口流程 1.2 主动取流 1.3 回调取流 二.VisionMaster 图像源SDK取图 一般情况下, ...

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

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

  5. Basler相机SDK开发

    作为集成商,本着万事从官方开始的原则,先来到basler官网Basler – 德国工业相机_工业镜头_工业光源_线材等视觉组件提供商 随便找一款相机,下载Basler pylon相机软件套装,下载py ...

  6. Basler相机SDK相关问题收集与知识汇总

    1.心跳时间导致报错 此心跳非彼心跳,相机心跳是指过通过设置一个时间用于监测相机和网卡的连接,如果超过这个时间,相机就会释放跟网卡的连接,进入一种允许相机被再次连接的状态. 但此方式会导致相机SDK报 ...

  7. 使用Basler相机SDK采集的显示图片

    采用Basler acg-2500相机完成这次测试 首先去Basler官网下载SDK,就是那个pylon程序,里面集成了相机调试工具及SDK,自行安装. 然后使用pylon IP Configurat ...

  8. basler 相机取图超时_一款Basler相机拍图问题(单次拍照时间过长,连续拍照正常)的处理经验...

    这款Basler相机1000W像素.GigE 接口,不用独立供电. 它的故障现象为:halcon连续采图,有10帧的速度,但是单次采图有580毫秒. 这种情况按经验一般怀疑下面的问题: (1)网卡驱动 ...

  9. Baumer(堡盟)相机SDK下载以及使用说明

    文章目录 前言 一.安装 Baumer BGAPI 2.9.1.21658 二.安装 Baumer Filter Driver(相机网卡驱动) 三.网卡的配置选项的设置 四.相机的 IP 地址设置 五 ...

最新文章

  1. html5标记汇总,HTML标记汇总(1)_HTML教程
  2. Android开发究竟该如何学习,成功入职字节跳动
  3. ACL 2019开源论文 | 句对匹配任务中的样本选择偏差与去偏方法
  4. svn 合并和树冲突
  5. Android之简单背景颜色渐变实现
  6. 判断作弊 牛客 编程_牛客企业服务产品-新功能速递-第5期
  7. 仅30分钟,在同一台设备安装discourse和wordpress
  8. 自动驾驶中的滞后碰撞检测(lazy-collision-checking)
  9. oracle电梯案例,Oracle技术嘉年华的一个案例,redo的那些事,连载一
  10. 大数据学习笔记14:MR案例——招聘数据分析
  11. 上传txt生成字典 java_文件上传漏洞fuzz字典生成脚本小工具分享
  12. 激活函数总结——2020.2.10
  13. eclipse运行java总显示上一个程序的运行结果(解决方案)
  14. 创业者的心得:心有菩提手有刀,欲成舍利却成妖(转)
  15. 华为新员工入职培训计划曝光!你留不住员工的原因就在这! zz
  16. linux 文件添加标签,SELinux——有趣的标签
  17. 【PMP】PMP考试易错点总结和答题技巧总结
  18. python 读取地震道头数据_使用python获取(宜宾市地震信息)地震信息
  19. js 判断视频编码格式是不是avc格式的
  20. 树莓派35/100 - 用graphviz画逻辑电路图

热门文章

  1. python读取txt文本出现中文乱码已解决。
  2. IntelliJ idea——》JSON字符串,自动转义双引号
  3. linux原子过程,linux系统编程:IO读写过程的原子性操作实验
  4. hive 任务查询报错 Reduce operator initialization failed
  5. GPS接收机(三)低噪放设计和版图仿真优化
  6. Maven系列之使用阿里云仓库
  7. 必备知识---TCP三次握手和四次挥手以及SSL四次握手
  8. 51单片机频率计c语言程序,基于51单片机的频率计程序
  9. AMD皓龙系列服务器CPU,霄龙PK皓龙!AMD CPU 10年历史对比:一步登天
  10. Java8新特性-Optional,狂神说docker笔记百度云