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等,并通过图像回调函数将拍摄的图像数据返回给主程序进行图像处理、分析和诊断等任务,从而提高医疗诊断的准确性和效率。


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


目录
相关文章
|
2月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
|
2月前
|
开发框架 .NET 程序员
C# 去掉字符串最后一个字符的 4 种方法
在实际业务中,我们经常会遇到在循环中拼接字符串的场景,循环结束之后拼接得到的字符串的最后一个字符往往需要去掉,看看 C# 提供了哪4种方法可以高效去掉字符串的最后一个字符
253 0
|
1月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
115 65
|
5月前
|
数据采集 数据可视化 测试技术
C#生成Selenium测试报告:实用方法与技巧
在C#中使用Selenium进行自动化测试时,结合代理IP和ExtentReports能增强测试安全性和报告质量。安装必备工具如Selenium WebDriver、NUnit和ExtentReports。在测试设置中,配置代理(如亿牛云爬虫代理)以隐藏IP,通过ChromeOptions定制UserAgent,并添加Cookie。测试代码示例展示了如何打开网页、执行搜索并生成详细的测试报告。使用ExtentReports可创建可视化测试结果,便于团队分析。
C#生成Selenium测试报告:实用方法与技巧
|
2天前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
11 3
|
1月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
33 1
|
1月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
14 0
|
1月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
40 0
|
2月前
|
C#
C#一分钟浅谈:Lambda 表达式和匿名方法
本文详细介绍了C#编程中的Lambda表达式与匿名方法,两者均可用于定义无名函数,使代码更简洁易维护。文章通过基础概念讲解和示例对比,展示了各自语法特点,如Lambda表达式的`(parameters) =&gt; expression`形式及匿名方法的`delegate(parameters)`结构。并通过实例演示了两者的应用差异,强调了在使用Lambda时应注意闭包问题及其解决策略,推荐优先使用Lambda表达式以增强代码可读性。
40 8
|
3月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
74 0
下一篇
无影云桌面