Baumer工业相机堡盟工业相机如何联合GAPI SDK和OpenCV实现相机图像将图像转换为Mat格式再转为Bitmap图像进行显示(C#)

Baumer工业相机堡盟工业相机如何联合GAPI SDK和OpenCV实现相机图像将图像转换为Mat图像格式再转为Bitmap图像进行显示(C#)

Baumer工业相机

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

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

Baumer工业相机NEOAPI SDK是用于Baumer工业相机的一款最新的软件开发工具包(SDK)。它为开发人员提供了一系列API和工具,用于与Baumer工业相机进行通信和控制,控制方式极为便捷类似Halcon的相机助手类控制方式。​

在使用工业视觉软件集成工业相机时,常常需要将工业相机SDK中一些功能整合到图像处理软件中,方便项目的推进使用;比如将SDK中采集的图像数据转换为适合图像格式如Bitmap等或者Opencv的Mat图像数据格式,再进行图像处理从而开启图像处理任务;

注意:本文是基于Baumer的NEOAPI SDK的基础上联合OpenCV使用C#语言来实现相机图像将图像转换为Mat图像格式再转为Bitmap图像进行显示。

Baumer工业相机的图像转换为OpenCV的Mat图像的技术背景

工业相机的图像转换为OpenCV的Mat图像涉及到图像数据的采集、处理和存储方式。以下是这一技术背景:

  1. 图像采集:工业相机使用图像传感器采集现实世界的光学信息,并将其转换为数字图像数据。这些数据可以是灰度图像(单通道)或彩色图像(多通道)。

  2. 数据格式:工业相机的图像数据可以以不同的格式进行存储,如RAW、RGB、YUV等。这些格式反映了像素值的排列方式以及颜色信息的表示形式。

  3. OpenCV库:OpenCV是一个开源的计算机视觉库,广泛用于处理图像和视频数据。它提供了丰富的函数和工具,可以用于加载、处理和存储图像数据。

  4. Mat对象:在OpenCV中,图像数据通常表示为Mat对象,Mat对象包含了图像的像素值以及相关的元数据,如图像大小、通道数等。

  5. 数据转换:将工业相机的图像数据转换为OpenCV的Mat图像通常涉及到数据格式的解析和转换,确保图像数据能够正确地加载和处理。这可能需要考虑到图像的通道数、位深度、颜色空间等方面的转换和处理。

因此,将工业相机的图像数据转换为OpenCV的Mat图像需要理解工业相机图像数据的格式和特性,并使用OpenCV提供的函数和工具进行适当的数据解析和转换。

代码分析

本文介绍使用BGAPI SDK对Baumer的JPEG工业相机进行开发时,使用通过BGAPI SDK和OpenCV进行图像转换的功能

第一步:先引用OpenCV库

本文使用"opencv_ffmpeg410_64.dll"和其它常用OpenCV库作为功能应用显示视频生成功能

C#环境下引用OpencCV库代码如下所示:

csharp 复制代码
using OpenCvSharp;
using OpenCvSharp.Dnn;
using OpenCvSharp.Extensions;

第二步:在回调函数里进行Buffer图像转换为OpenCV图像再转为Bitmap图像

后续进行图像转换为OpenCV库的Mat图像的核心代码,如下所示:

csharp 复制代码
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

            long currenttime = (long)mBufferFilled.Timestamp;                   
            DateTime sdasd = GetTime(currenttime, true);

                   

            #region//对四张图像进行基础拼接
            OpenCvSharp.Mat Matgray1 = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat  
            OpenCvSharp.Mat Matgray2 = Matgray1;
            OpenCvSharp.Mat Matgray3 = Matgray1;
            OpenCvSharp.Mat Matgray4 = Matgray1;

            Mat panorama1 = new Mat();
            Mat panorama2 = new Mat();
            Mat panoramaResult = new Mat();
            Cv2.VConcat(Matgray1, Matgray2, panorama1);
            Cv2.VConcat(Matgray3, Matgray4, panorama2);
            Cv2.HConcat(panorama1, panorama2, panoramaResult);         
            #endregion


			// 重新确认转换图像后的长宽,再转换为Bitmap图像
			int imageWidth = panoramaResult.cols;
			int imageHeight = panoramaResult.rows;
			width = imageWidth;height = imageHeight;
  			Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(panoramaResult);//用mat转换为bitmap              
            panorama1.Dispose(); panorama2.Dispose(); panoramaResult.Dispose();
                        
 			#region//回调函数保存图像功能
            if (bSaveImg)
            {
                if (!AutoSaveCheck.Checked & !ContinueSave.Checked)
                {
                    //使用bitmap自带函数保存
                    string strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff");
                    string saveimagepath = pImgFileDir + "\\" + strtime + ".jpg";
                    bmp.Save(saveimagepath, System.Drawing.Imaging.ImageFormat.Bmp);            
                    bSaveImg = false;//变量控制单次保存图像
                }                              
            }
            #endregion



            #region//新复制bmp的图像数据复制pBitmap
            Bitmap clonebitmap = (Bitmap)bmp.Clone();
            BitmapData data = clonebitmap.LockBits(new Rectangle(0, 0, width , 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;
}

联合OpenCV实现相机图像转换为Mat图像再转换为Bitmap测试演示图

测试使用OPENCV实现图像转换为Mat图像格式拼接为2x2后再转换为Bitmap图像进行显示如下所示:

工业相机通过OpenCV实现相机图像转换为Mat图像格式的优势

工业相机通过OpenCV实现相机图像转换为Mat图像格式具有多个优势:

  1. 数据处理方便:OpenCV提供了丰富的函数和方法,可以方便地加载、处理和保存图像数据,使用Mat对象能够轻松地进行各种图像处理操作,如滤波、旋转、裁剪等。

  2. 跨平台性:OpenCV是一个跨平台的计算机视觉库,能够在多种操作系统上运行,包括Windows、Linux、Mac等,这意味着工业相机可以与不同平台上的OpenCV库进行集成,实现更广泛的应用。

  3. 功能丰富:OpenCV提供了丰富的图像处理和计算机视觉功能,包括特征检测、目标跟踪、三维重建等,工业相机转换为Mat图像格式后,可以直接利用OpenCV的这些功能进行更加复杂的图像处理和分析。

  4. 社区支持:OpenCV拥有庞大的开发者社区和丰富的文档资源,工业相机开发人员可以从社区中获得支持和解决问题,且能够充分利用社区贡献的相关功能模块。

  5. 效率高:通过OpenCV实现相机图像转换为Mat图像格式可以实现高效的图像处理和数据存储,使得工业相机的应用具有更高的性能和响应速度。

综上所述,工业相机通过OpenCV实现相机图像转换为Mat图像格式具有便捷的数据处理、跨平台性、丰富的功能、社区支持和更高的效率等多方面的优势。

工业相机通过OpenCV实现相机图像转换为Mat图像格式的行业应用

工业相机通过OpenCV实现相机图像转换为Mat图像格式的行业应用包括但不限于:

  1. 制造业:工业相机通过OpenCV可以用于制造业中的产品质量检测、零部件尺寸测量、缺陷检测等应用。将相机图像转换为Mat图像格式后,可以利用OpenCV的丰富功能进行图像分析和质量控制。

  2. 医疗行业:在医疗行业,工业相机与OpenCV结合可以用于医学影像的分析和诊断,如X射线图像处理、医学超声图像处理等,有助于提高医学影像数据的分析和诊断效率。

  3. 农业领域:工业相机通过OpenCV实现的图像转换可应用于农业领域的作物生长监测、果蔬质量检测、病虫害检测等领域。OpenCV的图像处理功能可以帮助农业领域实现高效的数据采集和分析。

  4. 智能交通:工业相机结合OpenCV可以用于智能交通系统中的车辆识别、车牌识别、交通监控等场景,实现对交通数据的实时采集和分析。

  5. 智能制造:在智能制造领域,工业相机通过OpenCV实现的图像转换可以用于生产过程监控、产品质量分析、智能机器人视觉导航等应用,提高制造生产的智能化和自动化程度。

综上所述,工业相机通过OpenCV实现相机图像转换为Mat图像格式在制造业、医疗、农业、智能交通以及智能制造等多个行业应用中发挥着关键作用,为这些行业提供了高效的图像采集、处理和分析解决方案。

相关推荐
金智维科技官方4 分钟前
制造业如何用Ki-AgentS智能体平台实现设备巡检自动化?
大数据·运维·人工智能
stereohomology5 分钟前
大模型看大模型:推理Token的能耗用电量比对
人工智能
Hello world.Joey7 分钟前
Transformer解读
人工智能·深度学习·神经网络·自然语言处理·nlp·aigc·transformer
机器之心12 分钟前
Sand.ai开源发布MagiCompiler:突破局部编译界限,定义训推性能上限
人工智能·openai
KieranYin25 分钟前
AI编程 | 概念
人工智能
飞Link35 分钟前
LangChain Core 架构深度剖析与 LCEL 高阶实战
人工智能·架构·langchain
liangdabiao37 分钟前
Seedance 2.0 Skill 一键写好剧本上线了coze的技能商店了,免费
人工智能
喵飞云智AI研发社1 小时前
本土AI企业发力 喵飞科技AIGC开年分享会助力天津数字化转型
人工智能·科技·aigc
于过1 小时前
AgentMiddleware is All You Need
人工智能·langchain·llm
LLM精进之路1 小时前
频域+特征融合:深度学习的黄金组合,顶会顶刊的快速通道
人工智能·计算机视觉·目标跟踪