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

【basler】Chapter5:basler相机C#代码实现与详解 1、简介 最近使用basler相机,摸索了一段时间,找过一些其他的代码,有的不管用,有的只能拍照,无法处理相片流。其中有一个博客代码简洁明了,可以做入门学习,但是只能拍照不能录像: https://blog.csdn.net/gy0124/article/details/103469354 以下将介绍可以实现拍照、录像功能的代码。 2、basler C# demo using System; us... 阅读详情

这个话题的起因是追求极速的拍图速度。

机器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转换的色彩格式bgr
                            converter.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);
        }


    }
}
巴斯勒相机基于SDK 二次开发C++程序 巴斯勒相机在VS中如何进行连接调用呢(软触发调用)2.调用巴斯勒相机提供的接口,连接巴斯勒相机;其他引用第三方库以及对应头文件。1.查找巴斯勒相机网口;(安装巴斯勒相机软件) 阅读详情

相关推荐

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

使用到了Basler的相机,利用C#编写的SDK,下面进行简单的整理记录。 首先引用basler的动态库文件,具体引用位置如下: 安装目录\Basler\pylon 5\Development\Assemblies\Basler.Pylon\x64\Basler.Pylon.dll 引用命名空间 using Basler.Pylon; using System; using System.Col...

大樱桃的博客 2万+

BaslerCamera_20191203_基于C#的Basler相机SDK开发示例_读取相机_BaslerCamera_

实现功能:相机连接、采集图像(单帧采集、连续采集),软触发,曝光&增益设置、读取,图像缩放功能

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

本人在用halcon做图像处理做视觉项目时,通常都是用c#写程序的主体架构,然后将halcon的图像处理过程嵌套进去。所以做了一个basler相机采图并用halcon显示的demo,写这篇文章用于记录过程中的一些心得和遇到的问题,这里分享给大家,希望有大佬帮忙斧正。程序界面如上图。首先是一些先期的设置。开发环境是win7 64位,用的软件是VS2013和HALCON13,还用到了basler相机的

千年小妖的博客 2万+

C# 获取baser工业相机

C#开发获取并设置baser相机

john_and_jane的博客 1638

使用C#调用Basler相机进行图像识别

可以在Basler官方网站上下载并安装最新的 Basler Pylon SDK,然后在Visual Studio中添加对应的引用。通过以上步骤,我们可以使用C#语言调用Basler相机进行图像识别。当然,这只是一个简单的示例,你可以根据实际需求对代码进行扩展和优化,实现更复杂的图像处理和识别功能。通过上述代码,我们可以初始化相机库,获取第一个连接的相机,并进行相机的打开、设置连续采集模式、开始采集图像等操作。首先,我们需要准备一台Basler相机,并通过USB或GigE接口将其连接到计算机上。

学习使你进步。 949

多品牌工业相机 SDK 性能实测:海康、大恒、Basler 采图效率与 CPU 负载对比

在工业自动化、机器视觉和质量检测等领域,工业相机的性能直接影响到整个系统的效率。不同品牌的相机SDK在采图效率、CPU负载、图像传输和处理等方面表现不同。对于需要实时图像采集和处理的应用,如何选择合适的相机SDK成为开发者在集成时需要考虑的重要问题。本文将对三个主流品牌的工业相机 SDK 进行性能实测,从和两个维度进行对比分析,为开发者提供参考。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1304

Basler相机SDK开发

作为集成商,本着万事从官方开始的原则,先来到basler官网https://www.baslerweb.com/cn/ 随便找一款相机,下载Basler pylon相机软件套装,下载pylon6.0.1相机软件套装(windows版本) 我这里用的是pylon5,一样的,安装的时候注意development装上,gige√上,usb√上 这里安装完软件,把手上的相机接到电脑上,首先要做......

苏林同学的博客 1万+

高速采图场景下的 SDK 性能极限测试:Basler Pylon vs 大恒 GenICam vs 海康 PlayM4

海康 PlayM4在最高帧率CPU 占用率图像传输延迟和内存使用四个指标上都表现优异,尤其是在高速采图场景下,能够提供60 FPS的高帧率,并保持较低的 CPU 占用和图像传输延迟。的40 FPS稳定性和中等的 CPU 占用率表现不错,尤其适用于中高帧率场景。大恒 GenICam在高帧率采集时的性能相对较弱,尤其在 CPU 占用和内存使用上较高,适合对性能要求不那么苛刻的应用场景。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 940

C#、打开basler相机

使用到了Basler的相机,利用C#编写的SDK,下面进行简单的整理记录。 首先引用basler的动态库文件,具体引用位置如下: 安装目录\Basler\pylon 5\Development\Assemblies\Basler.Pylon\x64\Basler.Pylon.dll ———————————————— 版权声明:本文为CSDN博主「大_樱_桃」的原创文章,遵循 CC 4.0 BY-S...

星河队长 7262

Basler相机SDK开发实例详解

巴斯勒(Basler)自1988年成立以来,专注于工业相机的研发与创新,逐步成为全球工业视觉领域的领先品牌。其产品线涵盖面阵相机、线阵相机、3D相机及嵌入式视觉解决方案,广泛应用于智能制造、医疗成像、交通监控等领域。巴斯勒相机以高性能、高稳定性及丰富的SDK支持著称,尤其在图像质量、传输速度和兼容性方面具有显著优势。Basler SDK附带了详尽的文档资源,位于目录下,主要包括::详细描述每个类、方法、参数的作用和使用方式。:记录每个版本的更新内容、已知问题和兼容性信息。

weixin_30674431的博客 1855

Basler相机的Pylon SDK采集与处理实践指南

Pylon SDK 是 Basler 公司开发的一套软件开发工具包,用于与 Basler 相机进行交互,获取图像数据。其功能覆盖了相机的初始化、配置、图像采集、显示和保存等多个方面。Pylon SDK 的优势在于其跨平台兼容性,支持多种操作系统,包括 Windows、Linux 和 macOS,并且提供了丰富的编程语言接口,如 C++, .NET, 和 Python。Pylon SDK 的优势还可以体现在其性能上。

weixin_42388898的博客 2164

Basler GigEvsion 相机SDK (与Basler公司工程师一起编程确认过)C#案例

已测试版本:Pylon SDK 3x 、Pylon 4x. 实现功能: 相机连接、采集图像(单张采集、连续采集),内外触发、录像功能(录像时可以选择是否压缩及图像压缩方式)。 其中CameraParameters类可以扩展 相机所有属性(目前只添加图像宽高、IO属性、曝光时间) 软件环境: 操作系统:win 7、XP 平发环境:vs 2008 .Net版本:.Net Framework 3.5 驱动版本:Pylon 4.1 硬件环境: 相机:Basler Gige相机 板卡:Intel千兆网卡 //新添加 曝光时间 设置、读取功能

C#Basler相机开发包

这是一个Basler相机开发包,用户可以根据案例进行操作,很详细!

Basler相机SDK介绍与参数设置

本文介绍了Basler相机SDK的使用方法及参数设置。SDK位于安装目录的Development文件夹中,提供C、C#和C++示例代码,建议使用面向对象的Basler.Pylon接口。主要参数包括图像尺寸、格式、增益、曝光等,通过Camera.Parameters类进行设置。示例代码展示了参数的读取、写入及验证方法,并提供了配置文件导入导出功能,可将相机参数保存为pfs文件。开发时需选择Developer模式安装驱动以获取完整开发资源。

weixin_46846685的博客 7766

basler相机的C#封装_

basler相机使用C#封装: C#封装basler,获取bitmap及hobject图像,内触发、外触发、获取单帧

C#基于Halcon实现Basler相机采图SDK

使用Basler相机软件自带动态库,相机软件版本Basler_pylon_5.0.12.11830,为了Demo可以正常运行,建议安装推荐版本的相机软件。

Basler_Gige面阵相机C基于Halcon显示的SDK采图工具:快速开发相机图像采集应用

Basler_Gige面阵相机C#基于Halcon显示的SDK采图工具:快速开发相机图像采集应用 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 Basler_Gige面阵相机C#基于Halcon显示的SDK采图工具是一款高效的图像采集工具,它专门为Basler Gige面阵相机设计。此工具集成了Basler官方SDK,并利用Halcon图像处理库进行图像显示,使得开发...

gitblog_06786的博客 750

Visual Studio Git 使用指南

Visual Studio 2022深度集成了Git功能,提供了直观的图形界面管理源代码。本文详细介绍了VS中Git的使用方法:从环境准备、克隆/创建仓库开始,重点讲解了"Git更改"窗口的日常操作,包括查看修改、暂存文件、提交推送等。同时涵盖了分支管理、查看历史、解决冲突等核心功能,以及储藏、重置等高级操作。文章还提供了实用技巧,如提交规范、频繁提交等最佳实践。VS的Git集成覆盖了日常开发需求,图形界面与命令行可互补使用,适合各层次开发者高效管理代码版本。

guigenyi的专栏 1554
上一篇: CODESYS 赛搏机器智能MIC7001总线控制器+松下A6BE总线驱动器
下一篇: 机器视觉之工业镜头与普通镜头的区别
~晓广~
博客等级 码龄18年 8336粉丝 107原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~晓广~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值