当前位置: 首页 > news >正文

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

  • Baumer工业相机
  • Baumer工业相机图像保存到电脑内存的技术背景
  • 代码分析
    • 注册SDK回调函数BufferEvent
    • 声明可以存储相机图像的内存序列和名称
    • 在图像回调函数中将图像保存在内存序列中
    • 从内存序列中释放保存的相机图像
    • 保存工业相机图像到内存的测试
  • Baumer工业相机通过电脑内存存储的优势
  • Baumer工业相机通过电脑内存存储的行业应用

Baumer工业相机

Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。

Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。

Baumer工业相机的实时帧率是工业相机的一个重要参数,因为它影响相机准确捕捉快速移动物体或事件的能力。分辨率、图像质量和可用存储空间等因素也会影响工业相机的帧率。

Baumer工业相机的Camera Explorer软件功能强大,内容丰富,通过该软件可以有效的获取相机相关的全部信息,在对于相机检测项目的开发中,有时需要获取相机中图像Buffer信息和相关的数据流信息,而Camera Explorer软件可以有效的显示相关的信息。

Baumer工业相机图像保存到电脑内存的技术背景

工业相机将相机图像保存到电脑内存的过程涉及多种技术背景。当工业相机捕获图像时,涉及到图像传感器、数据传输、图像处理和存储等方面的技术。以下是一些涉及到的技术背景:

图像传感器技术:工业相机的核心是图像传感器,它负责将光学图像转换成电子信号。不同类型的图像传感器(如CCD、CMOS)具有不同的工作原理和性能特点,对于图像的质量和处理方式有着重要影响。

数据传输技术:一旦图像被捕获,它需要被传输到计算机内存进行存储和处理。这涉及到数据传输接口(如USB、Ethernet、Camera Link)以及数据传输协议的选用,确保图像能够快速、稳定地传输到计算机内存中。

图像处理技术:在图像被保存到内存之前,通常需要进行一定程度的图像处理,例如白平衡校正、曝光补偿、降噪等。这些图像处理技术有助于提高图像质量和信息的准确性。

存储技术:一旦图像被传输到计算机内存,它需要被存储在磁盘或其他存储设备中。这涉及到文件系统、存储介质、数据压缩等技术,以确保图像能够被有效地存储和管理。

代码分析

本文介绍使用BGAPI SDK对Baumer工业相机进行开发时,使用回调函数BufferEvent进行图像保存在本地内存的方式进行高速存储的功能。

注册SDK回调函数BufferEvent

C#环境下注册回调函数BufferEvent库代码如下所示:

foreach (BGAPI2.DataStream CurDataStream in ListDataStream)
{CurDataStream.RegisterNewBufferEvent(BGAPI2.Events.EventMode.EVENT_HANDLER);CurDataStream.NewBufferEvent += new BGAPI2.Events.DataStreamEventControl.NewBufferEventHandler(mDataStream_NewBufferEvent2TestSpeed);CurDataStream.StartAcquisition();
}

声明可以存储相机图像的内存序列和名称

C#环境下代码如下所示:

 List<Bitmap> listOfBitMaps;List<string> listNameOfBitMaps;listOfBitMaps = new List<Bitmap>();
listNameOfBitMaps = new List<string>();

在图像回调函数中将图像保存在内存序列中

C#环境下代码如下所示:

public int SetImageCount = 0; public int SetImageSaveNumber = 0; public int SetImageCount2 = 0;
public int ControlConfigSaveFPS = 1; public bool NormalDisplay = false;
void mDataStream_NewBufferEvent(object sender, BGAPI2.Events.NewBufferEventArgs mDSEvent)
{try{BGAPI2.Buffer mBufferFilled = null;              mBufferFilled = mDSEvent.BufferObj;if (mBufferFilled == null){MessageBox.Show("Error: Buffer Timeout after 1000 ms!");}else if (mBufferFilled.IsIncomplete == true){//MessageBox.Show("Error: Image is incomplete!");//queue buffer againmBufferFilled.QueueBuffer();}else{#region//获取当前FrameIDFrameIDInt = (int)mBufferFilled.FrameID;if (NormalDisplay)OnNotifySetFrameID(FrameIDInt.ToString());#endregion//将相机内部图像内存数据转为bitmap数据System.Drawing.Bitmap bitmap  = new System.Drawing.Bitmap((int)mBufferFilled.Width, (int)mBufferFilled.Height, (int)mBufferFilled.Width,System.Drawing.Imaging.PixelFormat.Format8bppIndexed, (IntPtr)((ulong)mBufferFilled.MemPtr + mBufferFilled.ImageOffset));#region//Mono图像数据转换。彩色图像数据转换于此不同System.Drawing.Imaging.ColorPalette palette = bitmap.Palette;int nColors = 256;for (int ix = 0; ix < nColors; ix++){uint Alpha = 0xFF;uint Intensity = (uint)(ix * 0xFF / (nColors - 1));palette.Entries[ix] = System.Drawing.Color.FromArgb((int)Alpha, (int)Intensity, (int)Intensity, (int)Intensity);}bitmap.Palette = palette;#endregion#region//bitmap的图像数据复制pBitmapBitmap clonebitmap = (Bitmap)bitmap.Clone();BitmapData data = clonebitmap.LockBits(new Rectangle(0, 0, clonebitmap.Width, clonebitmap.Height), ImageLockMode.ReadOnly, clonebitmap.PixelFormat);clonebitmap.UnlockBits(data);pBitmap = clonebitmap;#endregion//回调函数保存图像功能if (bSaveImg){SetImageCount = SetImageCount + 1;//使用bitmap自带函数保存string strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff");ulong ts = mBufferFilled.Timestamp;string saveimagepath = pImgFileDir + "\\" + strtime + "-" + FrameIDInt + ".bmp";#region//存储当前图片时间戳作为名称,与图片对应起来listNameOfBitMaps.Add(saveimagepath);                       //存储当前图片放入电脑内存中listOfBitMaps.Add(clonebitmap);if (SetImageCount == SetImageSaveNumber){pDevice.RemoteNodeList["AcquisitionStop"].Execute();bSaveImg = false;MemorySave.Checked = false;OnNotifySetFrameID(SetImageCount.ToString());}#endregion}if (NormalDisplay){#region//将pBitmap图像数据显示在UI界面PictureBox控件上prcSource.X = 0; prcSource.Y = 0;prcSource.Width = (int)mBufferFilled.Width; prcSource.Height = (int)mBufferFilled.Height;System.Drawing.Graphics graph = System.Drawing.Graphics.FromHwnd(pictureBoxA.Handle);graph.DrawImage(pBitmap, prcPBox, prcSource, GraphicsUnit.Pixel);#endregionclonebitmap.Dispose(); //清除临时变量clonebitmap所占内存空间}mBufferFilled.QueueBuffer();}}catch (BGAPI2.Exceptions.IException ex){{string str2;str2 = string.Format("ExceptionType:{0}! ErrorDescription:{1} in function:{2}", ex.GetType(), ex.GetErrorDescription(), ex.GetFunctionName());MessageBox.Show(str2);}}return;
}

从内存序列中释放保存的相机图像

C#调用代码如下所示:

List<Bitmap> listOfBitMaps;
List<string> listNameOfBitMaps;
//释放相机占用的电脑内存图像并保存到本地
private void RealeaseDataFromMemory3()
{int count1 = 0; int width1 = 0; int Height1 = 0; string PixelFormatstr = "";try{foreach (Bitmap BitmapCur in listOfBitMaps){string name1 = listNameOfBitMaps[count1];Bitmap BitmapCurNew = BitmapCur;OnNotifySaveImage2(BitmapCurNew, name1);count1++;SetImageCount2 = SetImageCount2 + 1;}}catch (Exception ex1){OnNotifyShowRecieveMsg(ex1.Message + "-" + count1 + "-" + width1 + "-" + PixelFormatstr);}OnNotifyShowRecieveMsg("内存释放图像保存完成");
}private delegate void dgNotifySaveImage2(Bitmap bmp, string name1);
private dgNotifySaveImage2 OnNotifySaveImage2;private void SetSaveImage2(Bitmap contents, string name1)
{if (this.InvokeRequired){this.Invoke(new dgNotifySaveImage2(SetSaveImage2), contents, name1);}else{ImgSave2(contents, name1);}}private int ImgSave2(Bitmap bmpinstance, string name1)
{#region 保存图片//stopWatch.Start();//OnNotifyShowRecieveMsg("save....");DateTime dtNow = System.DateTime.Now;  // 获取系统当前时间String strPath;String strtime;strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff");//ImagePersistence.Save(ImageFileFormat.Png, stfFileName, grabResult);bmpinstance.Save(name1, System.Drawing.Imaging.ImageFormat.Bmp);//OnNotifyShowRecieveMsg("save:" + strtime);return 0;#endregion
}

保存工业相机图像到内存的测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Baumer工业相机通过电脑内存存储的优势

工业相机通过电脑内存进行图像存储具有许多优势,包括:

  1. 高速存储:电脑内存通常具有较高的读写速度,这意味着工业相机可以快速地将图像数据传输到计算机内存中,而且处理速度也会更快。

  2. 大容量存储:现代计算机内存通常具有大容量,可以存储大量的图像数据。这意味着工业相机可以在不间断地进行图像捕获的情况下,将大量图像数据存储到内存中,而无需担心空间问题。

  3. 灵活性:通过将图像存储到计算机内存,用户可以方便地对图像数据进行访问、处理和传输。此外,可以轻松地实现实时图像处理和分析,因为存储在内存中的图像数据可立即用于计算和算法处理。

  4. 数据传输便利:一旦图像存储在计算机内存中,它可以通过各种方式进行传输,如网络传输、存储到磁盘或其他外部设备,以及实时显示等,这为图像数据的使用和共享提供了便利。

总的来说,工业相机通过电脑内存存储图像数据具有高速存储、大容量、灵活性和便利的优势,有助于满足现代工业应用对图像处理和数据传输的要求。

Baumer工业相机通过电脑内存存储的行业应用

工业相机通过电脑内存进行图像存储在许多行业和应用领域中发挥着重要作用,包括但不限于:

  1. 自动化制造:工业相机通过电脑内存存储的图像数据可以用于自动检测和品质控制,例如在生产线上检测产品的尺寸、外观、缺陷等。此外,内存存储的图像数据还可用于生产过程监控、工艺优化和自动化控制。

  2. 医学影像:在医学领域,工业相机通过电脑内存存储的图像可以用于医学影像诊断、手术导航、病理学研究等应用。内存存储的高速数据传输和大容量存储使得医学图像可以快速实时地进行处理和分析。

  3. 机器视觉:工业相机通过内存存储的图像数据被广泛应用于机器视觉系统中,用于目标检测、识别、测量和导航。这些应用需要快速、准确地处理大量图像数据,而内存存储技术正好满足了这些需求。

  4. 智能交通:在交通监控和管理中,工业相机通过电脑内存存储的图像数据可以用于车辆识别、交通流量监测、违章行为检测等应用。这些应用需要对大量实时图像数据进行快速处理和分析。

  5. 军事和航空航天:在军事和航空航天领域,工业相机通过内存存储的图像数据可用于目标识别、导航、监视和情报收集。高速、稳定的内存存储技术对于在复杂环境中进行实时图像处理至关重要。

通过电脑内存存储的工业相机图像数据在这些行业应用中发挥着关键作用,促进了自动化、智能化和数据驱动的发展。

相关文章:

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机图像保存到电脑内存的技术背景代码分析注册SDK回调函数BufferEvent声明可以存储相机图像的内存序列和名称在图像回调函数中将图像保存在内存序…...

iOS 防截屏方法(一)

利用UITextField的安全输入secureTextEntry来实现防截屏效果&#xff0c;上代码&#xff1a; // 将 textField 添加到父视图UITextField *textField [[UITextField alloc] init];textField.backgroundColor [UIColor whiteColor];textField.secureTextEntry YES;[self.view …...

【SpringBoot篇】5种类型参数传递json数据传参的操作

&#x1f38a;专栏【SpringBoot】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f33a;普通参数&#x1f33a;POJO参数&#x1f33a;嵌套…...

Mac系统升级node.js版本和npm版本

升级node.js版本 第一步&#xff1a;查询当前node.js版本 node -v 第二步&#xff1a;清除node.js的缓存 sudo npm cache clean -f 第三步&#xff1a;验证缓存是否清空 npm cache verify 第四步&#xff1a;安装n工具&#xff0c;n工具是专门用于管理node.js版本的工具…...

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端 目 录 1、产品规格 2、接口使用 2.1、侧面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、产品规格 输入电源&#xff1a; 12V&#xff5e;24V的直流电源 网络接口&am…...

智能优化算法应用:基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜉蝣算法4.实验参数设定5.算法结果6.参考文献7.MA…...

pymysql报错: unable to rollback、Already closed

参考&#xff1a; https://www.coder.work/article/4516746 https://www.cnblogs.com/leijiangtao/p/11882107.html https://stackoverflow.com/questions/55116007/pymysql-query-unable-to-rollback unable to rollback处理&#xff1a; # 关闭光标对象 cursor.close() # 关…...

[Linux] Web基础知识与http协议

一、HTML 1.1 HTML 的概念 HTML被称为超文本标记语言。 它是规范和标准. 它通过标记符号来标记网页中出现的各个部分。网页文件本身就是一种文本文件。 通过向文本文件添加标记&#xff0c;您可以告诉浏览器如何显示其中的内容。 HTML命令可以描述文本、图形、动画、声音、表格…...

2020年第九届数学建模国际赛小美赛B题血氧饱和度的变异性解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 B题 血氧饱和度的变异性 原题再现&#xff1a; 脉搏血氧饱和度是监测患者血氧饱和度的常规方法。在连续监测期间&#xff0c;我们希望能够使用模型描述血氧饱和度的模式。   我们有36名受试者的数据&#xff0c;每个受试者以1 Hz的频率连…...

【Flink on k8s】- 11 - 使用 Flink kubernetes operator 运行 Flink 作业

目录 1、创建本地镜像库 1.1 拉取私人仓库镜像 1.2 运行 1.3 本地浏览器访问 5000 端口...

【Linux】系统初识之冯诺依曼体系结构与操作系统

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.冯诺依曼体系结构 2.操作…...

【PyTorch】模型训练过程优化分析

文章目录 1. 模型训练过程划分1.1. 定义过程1.1.1. 全局参数设置1.1.2. 模型定义 1.2. 数据集加载过程1.2.1. Dataset类&#xff1a;创建数据集1.2.2. Dataloader类&#xff1a;加载数据集 1.3. 训练循环 2. 模型训练过程优化的总体思路2.1. 提升数据从硬盘转移到CPU内存的效率…...

GO -- 设计模式

整篇文档参考了各大神对设计模式的总结&#xff0c;然后整理的一篇关于使用GO来实现设计模式的文档&#xff0c;如有问题&#xff0c;请批评指正&#xff01; 目录 设计模式的优点 设计模式的六大原则 设计模式&#xff0c;即Design Patterns&#xff0c;是指在软件设计…...

angular状态管理方案(ngrx)

完全基于redux的ngrx方案&#xff0c;我们看看在angular中如何实现。通过一个简单的计数器例子梳理下整个流程 一 安装 &#xff1a;npm i ngrx/store 这里特别要注意一点&#xff1a;安装 ngrx/store的时候会出现和angular版本不一致的问题 所以检查一下angular/core的版本…...

EPICS modbus 模块数字量读写练习

本文使用modbus slave软件模拟一个受控的modbus设备&#xff0c;此模拟设备提供如下功能&#xff1a; 1、线圈组1&#xff0c;8个线圈&#xff0c;起始地址为0&#xff0c;数量为8&#xff0c;软件设置如下(功能码1)&#xff0c;用于测试功能码5&#xff0c;一次写一个线圈&am…...

万界星空科技低代码平台:搭建MES系统的优势

低代码MES系统&#xff1a;制造业数字化转型的捷径 随着制造业的数字化转型&#xff0c;企业对生产管理系统的需求逐渐提高。传统的MES系统实施过程复杂、成本高昂&#xff0c;已经无法满足现代企业的快速发展需求。而低代码搭建MES系统的出现&#xff0c;为企业提供了一种高…...

【ArcGIS微课1000例】0078:创建点、线、面数据的最小几何边界

本实例为专栏系统文章:讲述在ArcMap10.6中创建点数据最小几何边界(范围),配套案例数据,持续同步更新! 文章目录 一、工具介绍二、实战演练三、注意事项一、工具介绍 创建包含若干面的要素类,用以表示封闭单个输入要素或成组的输入要素指定的最小边界几何。 工具位于:数…...

五花八门客户问题(BUG) - 数据库索引损坏

问题 曾经有个客户问题&#xff0c;让我们开发不知所措了很久。简单点说就是客户的index周期性的损坏&#xff0c;即使全部重建后经历大约1~2周数据update后也会坏掉。导致的直接结果&#xff1a;select出来的数据不对。问题很严重。 直接看损坏的index文件看不出什么蛛丝马迹…...

mysql select count 非常慢

MySQL select count 性能分析 问题&#xff1a;mysql 在count时发现非常慢 select count(*) from xxx; 无论执行多少次&#xff0c;查询速度基本稳定在10-12秒之间 环境说明 windows11 x64SSD硬盘MySQL8.0.35数据库引擎为InnoDB数据行数不到3万行&#xff0c;但是数据量将近…...

Tomcat管理功能使用

前言 Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能&#xff0c;需要配置管理用户&#xff0c;即配置tomcat-users.xml文件。 &#xff01;&#xff01;&#xff01;注意&#xff1a;测试功…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

未授权访问事件频发,我们应当如何应对?

在当下&#xff0c;数据已成为企业和组织的核心资产&#xff0c;是推动业务发展、决策制定以及创新的关键驱动力。然而&#xff0c;未授权访问这一隐匿的安全威胁&#xff0c;正如同高悬的达摩克利斯之剑&#xff0c;时刻威胁着数据的安全&#xff0c;一旦触发&#xff0c;便可…...

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…...

基于Java项目的Karate API测试

Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...

华为云Flexus+DeepSeek征文 | MaaS平台避坑指南:DeepSeek商用服务开通与成本控制

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 一、技术架构概览 1.1 整体架构设…...