Baumer工业相机堡盟工业相如何使用BGAPISDK通过两种不同的方法进行图像回调函数的使用(C#)

简介: Baumer工业相机堡盟工业相如何使用BGAPISDK通过两种不同的方法进行图像回调函数的使用(C#)

Baumer工业相机


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


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


Baumer工业相机的图像回调函数是一种在相机拍摄完成后,通过注册回调函数方式将图片数据和相关信息回调(发送)给指定的函数。这个回调函数通常是一个静态函数,不能直接与线程类关联,但可以通过传递当前线程类的指针来访问线程类的成员变量或执行特定任务。


另外,工业相机的图像回调函数还可以用于处理和操作图像数据。例如,可以在回调函数中对图像进行预处理、分析和计算等操作,然后将处理后的图像数据返回给主程序或其他线程进行处理。


需要注意的是,在使用工业相机的图像回调函数时,需要确保相机的拍摄和回调函数的注册是正确配置的。同时,也需要确保回调函数的定义和调用是符合规范和要求的,以保证程序的正确性和稳定性。


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


Baumer工业相机的固定帧率功能的技术背景


工业相机的图像回调函数是工业相机图像处理中的一项重要技术。它是在拍摄完成后,通过注册回调函数方式将图片数据和相关信息回调(发送)给指定的函数进行处理。这项技术最初由德国MVtec公司开发,用于处理和操作相机拍摄的图像数据,以实现高精度的图像识别、分析和处理等功能。


随着工业自动化和智能化的发展,工业相机的应用越来越广泛,对图像处理的要求也越来越高。因此,图像回调函数技术得到了广泛应用和推广。它不仅可以实现高精度的图像处理和分析,还可以提高工业自动化生产的效率和精度,为工业自动化和智能化的发展提供了强有力的技术支持。


在图像回调函数技术中,需要使用到多种编程语言和技术,如C++、C#、Qt等。其中,Qt是一种跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的GUI组件和网络功能,被广泛应用于工业相机的图像处理和回调函数开发中。


此外,图像回调函数技术还需要使用到相机驱动程序和图像处理库等相关软件和工具。相机驱动程序是用于控制相机硬件的软件程序,可以实现对相机的控制和数据采集等功能。图像处理库是用于对图像数据进行处理和分析的软件库,如OpenCV、Halcon等。


总之,图像回调函数技术是工业相机图像处理中的一项重要技术,它的发展和应用为工业自动化和智能化的发展提供了强有力的技术支持。


方法一:使用BGAPI SDK里的函数在图像回调函数里完成图像数据转换


在相机连接后注册图像回调函数,C#调用代码如下所示:

void DataStream_NewBufferEvent2(object sender, NewBufferEventArgs bufferEvent)
        {
            try
            {
                string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff");
                BGAPI2.Buffer bufferFilled = null;
                bufferFilled = bufferEvent.BufferObj;
                if (bufferFilled == null)
                {
                    //Console.WriteLine($"DataStream_NewBufferEvent(Error):Buffer Timeout after 1000 ms!");
                    //logger.LogMessage("BaumerCameraAPI", LogMessageType.Error, $"DataStream_NewBufferEvent(Error):Buffer Timeout after 1000 ms!");
                }
                else if (bufferFilled.IsIncomplete == true)
                {
                    bufferFilled.QueueBuffer();
                }
                else
                {
                    #region//获取当前FrameID
                    FrameIDInt = (int)bufferFilled.FrameID;
                    OnNotifySetFrameID(FrameIDInt.ToString());
                    #endregion
                    imagebuffer = new IntPtr();
                    #region//获取当前FrameID
                    //int FrameIDInt = (int)bufferFilled.FrameID;
                    #endregion
                    #region//获取当前图像类型
                    string pixelFormatstr = bufferFilled.PixelFormat;
                    if (pixelFormatstr.Contains("Mono8"))
                    {
                    }
                    if (pixelFormatstr.Contains("BRGB"))
                    {
                    }
                    #endregion
                    //设置图片的宽高
                    BGAPI2.Image p_image = pImgProcessor.CreateImage((uint)pDevice.RemoteNodeList["Width"].Value, (uint)pDevice.RemoteNodeList["Height"].Value, bufferFilled.PixelFormat, bufferFilled.MemPtr, bufferFilled.MemSize);
                    BGAPI2.Image tranImage = null;
                    tranImage = pImgProcessor.CreateTransformedImage(p_image, "Mono8");
                    int w = 0;
                    int h = 0;
                    w = (int)tranImage.Width;
                    h = (int)tranImage.Height;
                    imagebuffer = tranImage.Buffer;
                    if (firstFrame)
                    {
                        pImgBits = new Byte[w * h];
                        PubBitmap = new Bitmap(w, h, PixelFormat.Format8bppIndexed);
                        prcSource.X = 0;
                        prcSource.Y = 0;
                        prcSource.Width = w;
                        prcSource.Height = h;
                        firstFrame = false;
                    }
                    BitmapData bmpdata;
                    ColorPalette palette = PubBitmap.Palette;
                    for (int i = 0; i < 256; i++)
                    {
                        palette.Entries[i] = Color.FromArgb(255, i, i, i);
                    }
                    PubBitmap.Palette = palette;
                    bmpdata = PubBitmap.LockBits(prcSource, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
                    System.Runtime.InteropServices.Marshal.Copy(imagebuffer, pImgBits, 0, w * h);
                    System.Runtime.InteropServices.Marshal.Copy(pImgBits, 0, bmpdata.Scan0, w * h);
                    PubBitmap.UnlockBits(bmpdata);
                    PubBitmapCur = PubBitmap;
                    System.Drawing.Graphics graph = System.Drawing.Graphics.FromHwnd(pictureBoxA.Handle);
                    graph.DrawImage(PubBitmapCur, prcPBox, prcSource, GraphicsUnit.Pixel);
                    bufferFilled.QueueBuffer();
                }
            }
            catch (BGAPI2.Exceptions.IException ex)
            {
               // var errorMessage = $"DataStream_NewBufferEvent:Error in function: {ex.GetFunctionName()}\r\nError description: {ex.GetErrorDescription()}";
                //System.Console.WriteLine(errorMessage);
                //logger.LogMessage(errorMessage, "DataStream_NewBufferEvent", LogMessageType.Error);
                //logger.LogException(ex, "DataStream_NewBufferEvent");
            }
            catch (Exception ex)
            {
                //logger.LogException(ex, "DataStream_NewBufferEvent");
               // Console.WriteLine($"DataStream_NewBufferEvent:{ex.Message}");
            }
            return;
        }


方法二:使用Bitmap图像在Baumer图像回调函数里完成图像数据转换


在相机连接后注册图像回调函数,C#调用代码如下所示:

    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;
                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
                //回调函数保存图像功能
                if (bSaveImg)
                {
                    //使用bitmap自带函数保存
                    string strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff");
                    string saveimagepath = pImgFileDir + "\\" + strtime + ".jpg";
                    bitmap.Save(saveimagepath, System.Drawing.Imaging.ImageFormat.Bmp);                   
                    bSaveImg = false;//变量控制单次保存图像
                }
                #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
                #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;
    }


Baumer工业相机调用图像回调函数的优势


Baumer工业相机调用图像回调函数的优势主要包括:


1、实时性:图像回调函数能够在拍摄完成后立即返回图像数据,使得处理过程具有实时性,从而能够及时地分析和处理图像。

2、高效性:通过图像回调函数,可以将图像数据直接返回给主程序或线程进行处理,避免了不必要的数据拷贝和传输,提高了处理效率。

3、灵活性:图像回调函数可以灵活地处理各种类型的图像数据,包括彩色和灰度图像、标准格式和自定义格式等。同时,还可以根据不同的需求和场景,灵活地设计和实现图像处理算法。

4、可扩展性:图像回调函数可以通过注册回调函数的方式进行扩展和定制,使得能够根据具体的需求和场景进行定制开发,提高了系统的可扩展性和可维护性。

5、可靠性:图像回调函数可以提供稳定可靠的图像数据输出,减少了因数据传输和处理过程中的错误和异常情况导致的误差和损失。


总之,工业相机调用图像回调函数可以带来实时性、高效性、灵活性、可扩展性和可靠性等优势,为工业自动化和智能化的发展提供了强有力的技术支持。


Baumer工业相机调用图像回调函数的行业应用


工业相机调用图像回调函数的应用非常广泛,主要应用于以下行业:


1、汽车制造:在汽车制造过程中,工业相机可以用于拍摄零部件的图像,并通过图像回调函数将拍摄的图像数据返回给主程序进行图像处理、尺寸测量、缺陷检测等任务,从而提高生产效率和质量。

2、电子制造:在电子制造领域,工业相机可以用于识别和检测电子元器件的外观和位置,以确保其符合生产要求和品质标准。同时,工业相机还可以用于实现自动化生产线上的物料搬运和装配等任务。

3、食品加工:在食品加工行业中,工业相机可以用于拍摄食品的图像,并通过图像回调函数将拍摄的图像数据返回给主程序进行图像处理、品质检测和分类等任务,从而提高生产流程的效率和品质。

4、物流仓储:在物流仓储领域,工业相机可以用于拍摄货物的图像,并通过图像回调函数将拍摄的图像数据返回给主程序进行图像处理、识别和跟踪等任务,从而实现自动化仓库管理和智能物流配送等目标。

5、医疗影像:在医疗影像领域,工业相机可以用于拍摄医学影像,如X光片、CT扫描和MRI等,并通过图像回调函数将拍摄的图像数据返回给主程序进行图像处理、分析和诊断等任务,从而提高医疗诊断的准确性和效率。


总之,工业相机调用图像回调函数的应用非常广泛,涉及到制造业、物流业、医疗行业等多个领域。随着工业自动化和智能化的发展,其应用前景也将越来越广阔。


目录
相关文章
|
5天前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
5天前
|
C#
C#学习相关系列之数组---常用方法使用(二)
C#学习相关系列之数组---常用方法使用(二)
|
5天前
|
存储 C# 数据库
C# 生成唯一ID,有哪些方法?
【2月更文挑战第12天】
237 0
|
5天前
|
程序员 C#
C#抽象类和抽象方法详解
C#抽象类和抽象方法详解
10 0
|
5天前
|
存储 开发框架 .NET
C#中将DataTable转化成ListT的方法解析
C#中将DataTable转化成ListT的方法解析
9 0
|
5天前
|
数据采集 前端开发 数据挖掘
Fizzler库+C#:从微博抓取热点的最简单方法
本文介绍如何使用Fizzler库和C#构建微博热点信息爬虫。通过Fizzler的CSS选择器定位关键信息,提取热点标题和排名,实现微博内容的智能挖掘。示例代码展示单线程和多线程采集方法,并涉及代理IP使用。
Fizzler库+C#:从微博抓取热点的最简单方法
|
5天前
|
存储 数据采集 API
C# GetField 方法应用实例
C# GetField 方法应用实例
|
5天前
|
JSON 安全 API
C# GetMethod 方法应用实例
C# GetMethod 方法应用实例
|
5天前
|
设计模式 IDE 测试技术
提升 C#编程效率的技巧与方法
【4月更文挑战第20天】提升C#编程效率的关键技巧包括:选择合适的IDE(如Visual Studio)、掌握基础语法、规划良好代码结构、使用代码生成工具、复用代码、利用库和框架、定期重构、应用设计模式、避免过度设计、进行代码审查、自动化测试、学习新技术、养成良好编程习惯、定期备份代码及参与技术社区。通过这些方法,开发者能提高代码质量和开发效率。
|
5天前
|
C#
C# Dev TreeList常用属性方法
C# Dev TreeList常用属性方法