免費建立個人文章網(wǎng)站百度游戲風云榜
Baumer工業(yè)相機堡盟工業(yè)相機如何通過BGAPISDK將相機圖像高速保存到電腦內(nèi)存(C#)
- Baumer工業(yè)相機
- Baumer工業(yè)相機圖像保存到電腦內(nèi)存的技術(shù)背景
- 代碼分析
- 注冊SDK回調(diào)函數(shù)BufferEvent
- 聲明可以存儲相機圖像的內(nèi)存序列和名稱
- 在圖像回調(diào)函數(shù)中將圖像保存在內(nèi)存序列中
- 從內(nèi)存序列中釋放保存的相機圖像
- 保存工業(yè)相機圖像到內(nèi)存的測試
- Baumer工業(yè)相機通過電腦內(nèi)存存儲的優(yōu)勢
- Baumer工業(yè)相機通過電腦內(nèi)存存儲的行業(yè)應用
?
Baumer工業(yè)相機
Baumer工業(yè)相機堡盟相機是一種高性能、高質(zhì)量的工業(yè)相機,可用于各種應用場景,如物體檢測、計數(shù)和識別、運動分析和圖像處理。
Baumer的萬兆網(wǎng)相機擁有出色的圖像處理性能,可以實時傳輸高分辨率圖像。此外,該相機還具有快速數(shù)據(jù)傳輸、低功耗、易于集成以及高度可擴展性等特點。
?
Baumer工業(yè)相機的實時幀率是工業(yè)相機的一個重要參數(shù),因為它影響相機準確捕捉快速移動物體或事件的能力。分辨率、圖像質(zhì)量和可用存儲空間等因素也會影響工業(yè)相機的幀率。
Baumer工業(yè)相機的Camera Explorer軟件功能強大,內(nèi)容豐富,通過該軟件可以有效的獲取相機相關(guān)的全部信息,在對于相機檢測項目的開發(fā)中,有時需要獲取相機中圖像Buffer信息和相關(guān)的數(shù)據(jù)流信息,而Camera Explorer軟件可以有效的顯示相關(guān)的信息。
Baumer工業(yè)相機圖像保存到電腦內(nèi)存的技術(shù)背景
工業(yè)相機將相機圖像保存到電腦內(nèi)存的過程涉及多種技術(shù)背景。當工業(yè)相機捕獲圖像時,涉及到圖像傳感器、數(shù)據(jù)傳輸、圖像處理和存儲等方面的技術(shù)。以下是一些涉及到的技術(shù)背景:
圖像傳感器技術(shù):工業(yè)相機的核心是圖像傳感器,它負責將光學圖像轉(zhuǎn)換成電子信號。不同類型的圖像傳感器(如CCD、CMOS)具有不同的工作原理和性能特點,對于圖像的質(zhì)量和處理方式有著重要影響。
數(shù)據(jù)傳輸技術(shù):一旦圖像被捕獲,它需要被傳輸?shù)接嬎銠C內(nèi)存進行存儲和處理。這涉及到數(shù)據(jù)傳輸接口(如USB、Ethernet、Camera Link)以及數(shù)據(jù)傳輸協(xié)議的選用,確保圖像能夠快速、穩(wěn)定地傳輸?shù)接嬎銠C內(nèi)存中。
圖像處理技術(shù):在圖像被保存到內(nèi)存之前,通常需要進行一定程度的圖像處理,例如白平衡校正、曝光補償、降噪等。這些圖像處理技術(shù)有助于提高圖像質(zhì)量和信息的準確性。
存儲技術(shù):一旦圖像被傳輸?shù)接嬎銠C內(nèi)存,它需要被存儲在磁盤或其他存儲設(shè)備中。這涉及到文件系統(tǒng)、存儲介質(zhì)、數(shù)據(jù)壓縮等技術(shù),以確保圖像能夠被有效地存儲和管理。
代碼分析
本文介紹使用BGAPI SDK對Baumer工業(yè)相機進行開發(fā)時,使用回調(diào)函數(shù)BufferEvent進行圖像保存在本地內(nèi)存的方式進行高速存儲的功能。
注冊SDK回調(diào)函數(shù)BufferEvent
C#環(huán)境下注冊回調(diào)函數(shù)BufferEvent庫代碼如下所示:
foreach (BGAPI2.DataStream CurDataStream in ListDataStream)
{CurDataStream.RegisterNewBufferEvent(BGAPI2.Events.EventMode.EVENT_HANDLER);CurDataStream.NewBufferEvent += new BGAPI2.Events.DataStreamEventControl.NewBufferEventHandler(mDataStream_NewBufferEvent2TestSpeed);CurDataStream.StartAcquisition();
}
聲明可以存儲相機圖像的內(nèi)存序列和名稱
C#環(huán)境下代碼如下所示:
List<Bitmap> listOfBitMaps;List<string> listNameOfBitMaps;listOfBitMaps = new List<Bitmap>();
listNameOfBitMaps = new List<string>();
在圖像回調(diào)函數(shù)中將圖像保存在內(nèi)存序列中
C#環(huán)境下代碼如下所示:
public int SetImageCount = 0; public int SetImageSaveNumber = 0; public int SetImageCount2 = 0;
public int ControlConfigSaveFPS = 1; public bool NormalDisplay = false;
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;if (NormalDisplay)OnNotifySetFrameID(FrameIDInt.ToString());#endregion//將相機內(nèi)部圖像內(nèi)存數(shù)據(jù)轉(zhuǎn)為bitmap數(shù)據(jù)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圖像數(shù)據(jù)轉(zhuǎn)換。彩色圖像數(shù)據(jù)轉(zhuǎn)換于此不同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#region//bitmap的圖像數(shù)據(jù)復制pBitmapBitmap 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//回調(diào)函數(shù)保存圖像功能if (bSaveImg){SetImageCount = SetImageCount + 1;//使用bitmap自帶函數(shù)保存string strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff");ulong ts = mBufferFilled.Timestamp;string saveimagepath = pImgFileDir + "\\" + strtime + "-" + FrameIDInt + ".bmp";#region//存儲當前圖片時間戳作為名稱,與圖片對應起來listNameOfBitMaps.Add(saveimagepath); //存儲當前圖片放入電腦內(nèi)存中listOfBitMaps.Add(clonebitmap);if (SetImageCount == SetImageSaveNumber){pDevice.RemoteNodeList["AcquisitionStop"].Execute();bSaveImg = false;MemorySave.Checked = false;OnNotifySetFrameID(SetImageCount.ToString());}#endregion}if (NormalDisplay){#region//將pBitmap圖像數(shù)據(jù)顯示在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所占內(nèi)存空間}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;
}
從內(nèi)存序列中釋放保存的相機圖像
C#調(diào)用代碼如下所示:
List<Bitmap> listOfBitMaps;
List<string> listNameOfBitMaps;
//釋放相機占用的電腦內(nèi)存圖像并保存到本地
private void RealeaseDataFromMemory3()
{int count1 = 0; int width1 = 0; int Height1 = 0; string PixelFormatstr = "";try{foreach (Bitmap BitmapCur in listOfBitMaps){string name1 = listNameOfBitMaps[count1];Bitmap BitmapCurNew = BitmapCur;OnNotifySaveImage2(BitmapCurNew, name1);count1++;SetImageCount2 = SetImageCount2 + 1;}}catch (Exception ex1){OnNotifyShowRecieveMsg(ex1.Message + "-" + count1 + "-" + width1 + "-" + PixelFormatstr);}OnNotifyShowRecieveMsg("內(nèi)存釋放圖像保存完成");
}private delegate void dgNotifySaveImage2(Bitmap bmp, string name1);
private dgNotifySaveImage2 OnNotifySaveImage2;private void SetSaveImage2(Bitmap contents, string name1)
{if (this.InvokeRequired){this.Invoke(new dgNotifySaveImage2(SetSaveImage2), contents, name1);}else{ImgSave2(contents, name1);}}private int ImgSave2(Bitmap bmpinstance, string name1)
{#region 保存圖片//stopWatch.Start();//OnNotifyShowRecieveMsg("save....");DateTime dtNow = System.DateTime.Now; // 獲取系統(tǒng)當前時間String strPath;String strtime;strtime = DateTime.Now.ToString("yyyyMMddhhmmssfff");//ImagePersistence.Save(ImageFileFormat.Png, stfFileName, grabResult);bmpinstance.Save(name1, System.Drawing.Imaging.ImageFormat.Bmp);//OnNotifyShowRecieveMsg("save:" + strtime);return 0;#endregion
}
保存工業(yè)相機圖像到內(nèi)存的測試
Baumer工業(yè)相機通過電腦內(nèi)存存儲的優(yōu)勢
工業(yè)相機通過電腦內(nèi)存進行圖像存儲具有許多優(yōu)勢,包括:
-
高速存儲:電腦內(nèi)存通常具有較高的讀寫速度,這意味著工業(yè)相機可以快速地將圖像數(shù)據(jù)傳輸?shù)接嬎銠C內(nèi)存中,而且處理速度也會更快。
-
大容量存儲:現(xiàn)代計算機內(nèi)存通常具有大容量,可以存儲大量的圖像數(shù)據(jù)。這意味著工業(yè)相機可以在不間斷地進行圖像捕獲的情況下,將大量圖像數(shù)據(jù)存儲到內(nèi)存中,而無需擔心空間問題。
-
靈活性:通過將圖像存儲到計算機內(nèi)存,用戶可以方便地對圖像數(shù)據(jù)進行訪問、處理和傳輸。此外,可以輕松地實現(xiàn)實時圖像處理和分析,因為存儲在內(nèi)存中的圖像數(shù)據(jù)可立即用于計算和算法處理。
-
數(shù)據(jù)傳輸便利:一旦圖像存儲在計算機內(nèi)存中,它可以通過各種方式進行傳輸,如網(wǎng)絡(luò)傳輸、存儲到磁盤或其他外部設(shè)備,以及實時顯示等,這為圖像數(shù)據(jù)的使用和共享提供了便利。
總的來說,工業(yè)相機通過電腦內(nèi)存存儲圖像數(shù)據(jù)具有高速存儲、大容量、靈活性和便利的優(yōu)勢,有助于滿足現(xiàn)代工業(yè)應用對圖像處理和數(shù)據(jù)傳輸?shù)囊蟆?/p>
Baumer工業(yè)相機通過電腦內(nèi)存存儲的行業(yè)應用
工業(yè)相機通過電腦內(nèi)存進行圖像存儲在許多行業(yè)和應用領(lǐng)域中發(fā)揮著重要作用,包括但不限于:
-
自動化制造:工業(yè)相機通過電腦內(nèi)存存儲的圖像數(shù)據(jù)可以用于自動檢測和品質(zhì)控制,例如在生產(chǎn)線上檢測產(chǎn)品的尺寸、外觀、缺陷等。此外,內(nèi)存存儲的圖像數(shù)據(jù)還可用于生產(chǎn)過程監(jiān)控、工藝優(yōu)化和自動化控制。
-
醫(yī)學影像:在醫(yī)學領(lǐng)域,工業(yè)相機通過電腦內(nèi)存存儲的圖像可以用于醫(yī)學影像診斷、手術(shù)導航、病理學研究等應用。內(nèi)存存儲的高速數(shù)據(jù)傳輸和大容量存儲使得醫(yī)學圖像可以快速實時地進行處理和分析。
-
機器視覺:工業(yè)相機通過內(nèi)存存儲的圖像數(shù)據(jù)被廣泛應用于機器視覺系統(tǒng)中,用于目標檢測、識別、測量和導航。這些應用需要快速、準確地處理大量圖像數(shù)據(jù),而內(nèi)存存儲技術(shù)正好滿足了這些需求。
-
智能交通:在交通監(jiān)控和管理中,工業(yè)相機通過電腦內(nèi)存存儲的圖像數(shù)據(jù)可以用于車輛識別、交通流量監(jiān)測、違章行為檢測等應用。這些應用需要對大量實時圖像數(shù)據(jù)進行快速處理和分析。
-
軍事和航空航天:在軍事和航空航天領(lǐng)域,工業(yè)相機通過內(nèi)存存儲的圖像數(shù)據(jù)可用于目標識別、導航、監(jiān)視和情報收集。高速、穩(wěn)定的內(nèi)存存儲技術(shù)對于在復雜環(huán)境中進行實時圖像處理至關(guān)重要。
通過電腦內(nèi)存存儲的工業(yè)相機圖像數(shù)據(jù)在這些行業(yè)應用中發(fā)揮著關(guān)鍵作用,促進了自動化、智能化和數(shù)據(jù)驅(qū)動的發(fā)展。