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

本文主要是介绍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#)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/461785

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采