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


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

目录
相关文章
|
5天前
|
监控 安全 C#
开发公司电脑监控软件的报警系统:一个C#示例
在当今数字化时代,企业对其计算机网络和系统的安全性和稳定性越来越重视。为了确保员工遵守公司政策、保护机密信息以及监控系统的正常运行,开发一种可靠的公司电脑监控软件变得至关重要。本文将介绍如何使用C#编写一个简单而有效的报警系统,以便监控关键数据并在必要时发出警报。
12 0
|
5天前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
56 0
|
5天前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用ForceIP强制修改网口IP功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用ForceIP强制修改网口IP功能(C#)
32 0
|
5天前
|
编解码 监控 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Binning像素合并功能(C#)
21 0
|
19小时前
|
存储 弹性计算 监控
【阿里云弹性计算】深入阿里云ECS配置选择:CPU、内存与存储的最优搭配策略
【5月更文挑战第20天】阿里云ECS提供多种实例类型满足不同需求,如通用型、计算型、内存型等。选择CPU时,通用应用可选1-2核,计算密集型应用推荐4核以上。内存选择要考虑应用类型,内存密集型至少4GB起。存储方面,系统盘和数据盘容量依据应用和数据量决定,高性能应用可选SSD或高效云盘。结合业务特点和预算制定配置方案,并通过监控应用性能适时调整,确保资源最优利用。示例代码展示了使用阿里云CLI创建ECS实例的过程。
21 5
|
3天前
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
17 4
|
4天前
|
存储 小程序 编译器
数据在内存中的存储(探索内存的秘密)
数据在内存中的存储(探索内存的秘密)
11 0
|
5天前
|
存储 监控 NoSQL
Redis处理大量数据主要依赖于其内存存储结构、高效的数据结构和算法,以及一系列的优化策略
【5月更文挑战第15天】Redis处理大量数据依赖内存存储、高效数据结构和优化策略。选择合适的数据结构、利用批量操作减少网络开销、控制批量大小、使用Redis Cluster进行分布式存储、优化内存使用及监控调优是关键。通过这些方法,Redis能有效处理大量数据并保持高性能。
25 0
|
5天前
|
存储 编译器 程序员
C语言:数据在内存中的存储
C语言:数据在内存中的存储
15 2
|
5天前
|
存储
整数和浮点数在内存中存储
整数的2进制表⽰⽅法有三种,即原码、反码和补码。
18 0