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

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

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 again
            mBufferFilled.QueueBuffer();
        }
        else
        {
            #region//获取当前FrameID
            FrameIDInt = (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的图像数据复制pBitmap
            Bitmap 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);
                #endregion
                clonebitmap.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. 高速存储:电脑内存通常具有较高的读写速度,这意味着工业相机可以快速地将图像数据传输到计算机内存中,而且处理速度也会更快。


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


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


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


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


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


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


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


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


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


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


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


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

目录
相关文章
|
6月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
90 0
|
1月前
|
测试技术
升级电脑内存
升级电脑内存
52 2
|
5月前
|
存储 Java C#
C# 中的值类型与引用类型:内存大小解析
C# 中的值类型与引用类型:内存大小解析
|
1月前
|
固态存储 内存技术
升级电脑内存和硬盘
升级电脑内存和硬盘
46 6
|
2月前
|
Python
python对电脑的操作,获取几核,获取操作系统,获取内存
python对电脑的操作,获取几核,获取操作系统,获取内存
|
3月前
|
设计模式 uml
在电脑主机(MainFrame)中只需要按下主机的开机按钮(on()),即可调用其它硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Hard
该博客文章通过一个电脑主机启动的示例代码,展示了外观模式(Facade Pattern)的设计模式,其中主机(MainFrame)类通过调用内部硬件组件(如内存、CPU、硬盘)和操作系统的启动方法来实现开机流程,同时讨论了外观模式的优缺点。
|
5月前
|
监控 Rust 安全
Rust代码在公司电脑监控软件中的内存安全监控
使用 Rust 语言开发的内存安全监控软件在企业中日益重要,尤其对于高安全稳定性的系统。文中展示了如何用 Rust 监控内存使用:通过获取向量长度和内存大小来防止泄漏和溢出。此外,代码示例还演示了利用 reqwest 库自动将监控数据提交至公司网站进行实时分析,以保证系统的稳定和安全。
216 2
|
6月前
|
监控 安全 C#
开发公司电脑监控软件的报警系统:一个C#示例
在当今数字化时代,企业对其计算机网络和系统的安全性和稳定性越来越重视。为了确保员工遵守公司政策、保护机密信息以及监控系统的正常运行,开发一种可靠的公司电脑监控软件变得至关重要。本文将介绍如何使用C#编写一个简单而有效的报警系统,以便监控关键数据并在必要时发出警报。
184 0
|
6月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
227 0
|
17天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
30 3