Baumer工业相机堡盟工业相机如何通过BGAPISDK显示彩色相机和黑白相机的图像(C#)

简介: Baumer工业相机堡盟工业相机如何通过BGAPISDK显示彩色相机和黑白相机的图像(C#)

Baumer工业相机

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


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

Baumer工业相机的具有彩色工业相机和黑白工业相机两种类型,适用于多种场合,专门用于各种工业应用的成像设备,如质量控制、自动化、检查和机器视觉。它们通常被设计成在极端条件下工作,如高温、潮湿、灰尘和振动。


Baumer工业相机的彩色和黑白成像的技术背景

堡盟工业相机有彩色和黑白两种类型。这两类相机的主要区别在于它们捕捉和处理图像的方式。


彩色相机配备有拜耳滤光片,这是一种放置在相机图像传感器前的类似棋盘的彩色滤光片。这种滤镜将光线分离成红、绿、蓝三色成分,然后由相机的图像处理器进行处理,形成全彩图像。


黑白相机通常使用没有拜耳滤镜的单色图像传感器。这些传感器捕获的图像是灰度的,没有色彩信息。


就应用而言,彩色相机通常用于色彩准确性和差异性很重要的场合,如产品检验或质量控制。黑白相机通常用于需要高对比度和清晰度的情况,如机器视觉应用或低光环境中。


最终,是选择彩色还是黑白堡盟工业相机将取决于相关应用的具体需求。


Baumer工业相机通过BGAPI SDK在回调函数里显示图像

Baumer彩色工业相机和黑白工业相机的像素格式有所不同,因此在SDK回调函数里进行格式转换显示图像时也会有所不同,下面介绍在C#里Baumer彩色工业相机和黑白工业相机的不同的显示图像的方式


彩色工业相机在BufferEvent显示图像

在回调函数里显示图像,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
                IntPtr imagebuffer = new IntPtr();
                BGAPI2.Image pImage = pImgProcessor.CreateImage((uint)mBufferFilled.Width, (uint)mBufferFilled.Height, mBufferFilled.PixelFormat, mBufferFilled.MemPtr, mBufferFilled.MemSize);
                BGAPI2.Image pTranImage = null;
                pTranImage = pImgProcessor.CreateTransformedImage(pImage, "BGR8");
                int w = 0;
                int h = 0;
                w = (int)pTranImage.Width;
                h = (int)pTranImage.Height;
                imagebuffer = pTranImage.Buffer;
                if (bFirstFrame)
                {
                    pImgBits = new Byte[w * h * 3];                        
                    pBitmap = new System.Drawing.Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    prcSource.X = 0;
                    prcSource.Y = 0;
                    prcSource.Width = w;
                    prcSource.Height = h;
                    bFirstFrame = false;
                }
                System.Drawing.Imaging.BitmapData bmpdata;
                bmpdata = pBitmap.LockBits(prcSource, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                System.Runtime.InteropServices.Marshal.Copy(imagebuffer, pImgBits, 0, w * h * 3);
                System.Runtime.InteropServices.Marshal.Copy(pImgBits, 0, bmpdata.Scan0, w * h * 3);
                pBitmap.UnlockBits(bmpdata);
                //清除多余内存
                GC.Collect();
                #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;
    }

黑白工业相机在BufferEvent显示图像

在回调函数里显示图像,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彩色工业相机和黑白工业相机在图像处理上的不同点

彩色工业相机和黑白(单色)工业相机在其图像处理能力上有所不同。


彩色工业相机被设计用来捕捉全彩图像,这意味着它们必须处理和分析来自多个颜色通道(通常是红色、绿色和蓝色)的数据。这需要更多的计算能力和专门的算法来从原始图像数据中提取准确的颜色信息。


黑白工业相机只捕获灰度图像,这意味着它们不需要处理多个颜色通道。这简化了图像处理任务,从而使帧率更快,分辨率更高,噪音更低。


这两种的区别也在导致上面再回调函数里进行显示图像时也有所不同的原因。


就应用而言,彩色工业相机是需要准确识别颜色的任务的理想选择,如质量控制、颜色分类和印刷材料的检查。黑白工业相机更适合于需要高灵敏度的任务,如低光成像或运动检测。

目录
相关文章
|
9月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
117 0
|
5月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
|
8月前
|
并行计算 算法 C#
C# Mandelbrot和Julia分形图像生成程序更新到2010-9-14版 支持多线程计算 多核处理器
此文档是一个关于分形图像生成器的介绍,作者分享了个人开发的M-J算法集成及色彩创新,包括源代码和历史版本。作者欢迎有兴趣的读者留言交流,并提供了邮箱(delacroix_xu@sina.com)以分享资源。文中还展示了程序的发展历程,如增加了真彩色效果、圈选放大、历史记录等功能,并分享了几幅精美的分形图像。此外,还提到了程序的新特性,如导入ini文件批量输出图像和更新一批图片的功能。文档末尾附有多张程序生成的高分辨率分形图像示例。
|
8月前
|
存储 编解码 算法
C#.NET逃逸时间算法生成分形图像的毕业设计完成!晒晒功能
该文介绍了一个使用C#.NET Visual Studio 2008开发的程序,包含错误修复的Julia、Mandelbrot和优化过的Newton三种算法,生成色彩丰富的分形图像。作者改进了原始算法的效率,将内层循环的画点操作移至外部,提升性能。程序提供五种图形模式,支持放大缩小及颜色更新,并允许用户自定义画布大小以调整精度。还具备保存为高质JPG的功能。附有四张示例图片展示生成的分形效果。
|
9月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
333 0
|
9月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
260 3
|
3月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
60 3
|
2月前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
116 12
|
3月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
114 4
|
5月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
69 2