Baumer工業相機堡盟工業相機如何聯合GAPI SDK和OpenCV實現相機圖像將圖像轉換為Mat圖像格式再轉為Bitmap圖像進行顯示(C#)
- Baumer工業相機
- Baumer工業相機的圖像轉換為OpenCV的Mat圖像的技術背景
- 代碼分析
- 第一步:先引用OpenCV庫
- 第二步:在回調函數里進行Buffer圖像轉換為OpenCV圖像再轉為Bitmap圖像
- 聯合OpenCV實現相機圖像轉換為Mat圖像再轉換為Bitmap測試演示圖
- 工業相機通過OpenCV實現相機圖像轉換為Mat圖像格式的優勢
- 工業相機通過OpenCV實現相機圖像轉換為Mat圖像格式的行業應用
?
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圖像涉及到圖像數據的采集、處理和存儲方式。以下是這一技術背景:
-
圖像采集:工業相機使用圖像傳感器采集現實世界的光學信息,并將其轉換為數字圖像數據。這些數據可以是灰度圖像(單通道)或彩色圖像(多通道)。
-
數據格式:工業相機的圖像數據可以以不同的格式進行存儲,如RAW、RGB、YUV等。這些格式反映了像素值的排列方式以及顏色信息的表示形式。
-
OpenCV庫:OpenCV是一個開源的計算機視覺庫,廣泛用于處理圖像和視頻數據。它提供了豐富的函數和工具,可以用于加載、處理和存儲圖像數據。
-
Mat對象:在OpenCV中,圖像數據通常表示為Mat對象,Mat對象包含了圖像的像素值以及相關的元數據,如圖像大小、通道數等。
-
數據轉換:將工業相機的圖像數據轉換為OpenCV的Mat圖像通常涉及到數據格式的解析和轉換,確保圖像數據能夠正確地加載和處理。這可能需要考慮到圖像的通道數、位深度、顏色空間等方面的轉換和處理。
因此,將工業相機的圖像數據轉換為OpenCV的Mat圖像需要理解工業相機圖像數據的格式和特性,并使用OpenCV提供的函數和工具進行適當的數據解析和轉換。
代碼分析
本文介紹使用BGAPI SDK對Baumer的JPEG工業相機進行開發時,使用通過BGAPI SDK和OpenCV進行圖像轉換的功能
第一步:先引用OpenCV庫
本文使用“opencv_ffmpeg410_64.dll”和其它常用OpenCV庫作為功能應用顯示視頻生成功能
C#環境下引用OpencCV庫代碼如下所示:
using OpenCvSharp;
using OpenCvSharp.Dnn;
using OpenCvSharp.Extensions;
第二步:在回調函數里進行Buffer圖像轉換為OpenCV圖像再轉為Bitmap圖像
后續進行圖像轉換為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 againmBufferFilled.QueueBuffer();}else{#region//獲取當前FrameIDFrameIDInt = (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;#endregionlong 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的圖像數據復制pBitmapBitmap 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);#endregionclonebitmap.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圖像格式具有多個優勢:
-
數據處理方便:OpenCV提供了豐富的函數和方法,可以方便地加載、處理和保存圖像數據,使用Mat對象能夠輕松地進行各種圖像處理操作,如濾波、旋轉、裁剪等。
-
跨平臺性:OpenCV是一個跨平臺的計算機視覺庫,能夠在多種操作系統上運行,包括Windows、Linux、Mac等,這意味著工業相機可以與不同平臺上的OpenCV庫進行集成,實現更廣泛的應用。
-
功能豐富:OpenCV提供了豐富的圖像處理和計算機視覺功能,包括特征檢測、目標跟蹤、三維重建等,工業相機轉換為Mat圖像格式后,可以直接利用OpenCV的這些功能進行更加復雜的圖像處理和分析。
-
社區支持:OpenCV擁有龐大的開發者社區和豐富的文檔資源,工業相機開發人員可以從社區中獲得支持和解決問題,且能夠充分利用社區貢獻的相關功能模塊。
-
效率高:通過OpenCV實現相機圖像轉換為Mat圖像格式可以實現高效的圖像處理和數據存儲,使得工業相機的應用具有更高的性能和響應速度。
綜上所述,工業相機通過OpenCV實現相機圖像轉換為Mat圖像格式具有便捷的數據處理、跨平臺性、豐富的功能、社區支持和更高的效率等多方面的優勢。
工業相機通過OpenCV實現相機圖像轉換為Mat圖像格式的行業應用
工業相機通過OpenCV實現相機圖像轉換為Mat圖像格式的行業應用包括但不限于:
-
制造業:工業相機通過OpenCV可以用于制造業中的產品質量檢測、零部件尺寸測量、缺陷檢測等應用。將相機圖像轉換為Mat圖像格式后,可以利用OpenCV的豐富功能進行圖像分析和質量控制。
-
醫療行業:在醫療行業,工業相機與OpenCV結合可以用于醫學影像的分析和診斷,如X射線圖像處理、醫學超聲圖像處理等,有助于提高醫學影像數據的分析和診斷效率。
-
農業領域:工業相機通過OpenCV實現的圖像轉換可應用于農業領域的作物生長監測、果蔬質量檢測、病蟲害檢測等領域。OpenCV的圖像處理功能可以幫助農業領域實現高效的數據采集和分析。
-
智能交通:工業相機結合OpenCV可以用于智能交通系統中的車輛識別、車牌識別、交通監控等場景,實現對交通數據的實時采集和分析。
-
智能制造:在智能制造領域,工業相機通過OpenCV實現的圖像轉換可以用于生產過程監控、產品質量分析、智能機器人視覺導航等應用,提高制造生產的智能化和自動化程度。
綜上所述,工業相機通過OpenCV實現相機圖像轉換為Mat圖像格式在制造業、醫療、農業、智能交通以及智能制造等多個行業應用中發揮著關鍵作用,為這些行業提供了高效的圖像采集、處理和分析解決方案。