Baumer工业相机
Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。
Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。
Baumer工业相机通过使用BGAPI SDK进行开发时,可以联合OpenCVSharp实现图像的拼接和保存。
Baumer工业相机SDK联合OpenCVSharp的技术背景
Baumer工业相机SDK是一种软件开发工具包,用于与工业相机通信和图像采集。这些SDK通常包含驱动程序和API,可以让开发人员使用多个编程语言(例如C++、C#、Python)编写应用程序。它们也提供了许多图像参数和相机参数的控制选项,以便满足各种应用需求。
OpenCVSharp是OpenCV在C#中的封装,是一种流行且广泛使用的计算机视觉库,提供了大量的图像处理和计算机视觉算法,例如图像过滤、特征提取、目标检测等。OpenCVSharp可以与工业相机SDK集成,以便对从相机采集的图像进行处理和分析。
联合使用工业相机SDK和OpenCVSharp,开发人员可以实现更高级别的图像处理和视觉分析应用。例如,他们可以使用工业相机SDK实现图像采集和实时显示,然后使用OpenCVSharp进行图像处理和物体检测。他们还可以使用OpenCVSharp的计算机视觉算法来实现特定应用,例如质量控制、机器人视觉导航和自动识别等。
这里主要描述如何在C#的平台下实现通过BGAPI SDK和OpenCV进行图像转换的核心代码,本文的回调函数将实现拼接四张图像并进行显示的功能。
代码分析
本文介绍使用BGAPI SDK对Baumer的JPEG工业相机进行开发时,使用通过BGAPI SDK和OpenCVSharp进行图像拼接并显示图像的功能
第一步:先引用对应的OpenCV的类文件
C#环境下核心代码如下所示:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using BGAPI2; using System.Runtime.InteropServices; using System.IO; using CSCameraDemo.Properties; using System.Globalization; using WindowsFormsApplication1; using System.Threading.Tasks; using System.Threading; using System.Drawing.Imaging; using OpenCvSharp; using OpenCvSharp.Dnn;
第二步:在回调函数里进行Buffer图像转换并进行拼接
后续进行图像转换为OpenCV库的Mat图像并进行拼接和显示的核心代码,如下所示:
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); Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(panoramaResult);//用mat转换为bitmap panorama1.Dispose(); panorama2.Dispose(); panoramaResult.Dispose(); #endregion #region//回调函数保存图像功能 if (bSaveImg) { //使用bitmap自带函数保存 string strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff"); string saveimagepath = pImgFileDir + "\\" + strtime + ".jpg"; bmp.Save(saveimagepath, System.Drawing.Imaging.ImageFormat.Bmp); 使用opencv进行保存图像 //if (mBufferFilled.PixelFormat == "Mono8") //{ // OpenCvSharp.Mat matgray = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat // matgray.SaveImage("opencv_image.png"); // Cv2.ImWrite("opencvcv_image_Clone.png", matgray); //} bSaveImg = false;//变量控制单次保存图像 } #endregion #region//bitmap的图像数据复制pBitmap Bitmap clonebitmap = (Bitmap)bmp.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; }
3.OpenCVSharp进行图像拼接的具体应用
C#调用代码如下所示:
#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); Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(panoramaResult);//用mat转换为bitmap panorama1.Dispose(); panorama2.Dispose(); panoramaResult.Dispose(); #endregion
工业相机图像通过OpenCV转为Mat图像的优点
低水平图像处理: OPENCV为低级别的图像处理提供了一套丰富的库。它允许轻松访问图像特征,如对比度、亮度和颜色校正。
实时视频处理: 使用OPENCV,你可以实时处理视频流,允许对处理过程进行即时反馈和调整。
精确的物体检测: OPENCV提供先进的物体检测和识别算法,能够准确识别和跟踪视频流中的物体。
高效的硬件利用: OPENCV的设计旨在最大限度地提高硬件利用率,使其成为一个高效的视频处理平台。
跨平台兼容性: OPENCV与多种操作系统兼容,使其易于集成到现有的软件系统中。
总的来说,通过OPENCV将工业相机图像转换为Mat图像,可以实现高效、准确、实时的图像处理和分析,使其成为工业应用的有力工具。
工业相机图像通过OpenCV转为Mat图像的行业应用
自动化生产控制:工业相机可以用于自动化生产控制,将其拍摄的图像通过SDK转为OPENCV的MAT图像后,可以使用图像处理技术对产品进行检测、分类、计数等操作,实现自动化生产控制。
智能交通:工业相机可以用于智能交通,将其拍摄的图像通过SDK转为OPENCV的MAT图像后,可以使用图像处理技术对车辆进行识别、计数、跟踪等操作,实现智能交通管理。
医疗影像:工业相机可以用于医疗影像,将其拍摄的图像通过SDK转为OPENCV的MAT图像后,可以使用图像处理技术对医疗影像进行分析、诊断等操作,提高医疗诊断的准确性和效率。
物流仓储:工业相机可以用于物流仓储,将其拍摄的图像通过SDK转为OPENCV的MAT图像后,可以使用图像处理技术对物流仓储过程进行监控、管理、智能化等操作,提高物流仓储效率和安全性。
视频监控:工业相机可以用于视频监控,将其拍摄的图像通过SDK转为OPENCV的MAT图像后,可以使用图像处理技术对视频图像进行分析、识别、跟踪等操作,实现智能化视频监控。