1. 程式人生 > >關於工業相機程式設計呼叫SDK二次開發的一些步驟流程

關於工業相機程式設計呼叫SDK二次開發的一些步驟流程

網上找的一些資料,整理了一下,留著仔細看一看。

內容綱要

1.工業相機程式設計模型和流程

2.工業相機SDK介面使用總結

3.Basler Pylon工業相機SDK的使用

4.Pylon 以實時影象採集講解PylonC SDK使用流程

5.關於使用維視工業相機 SDK 採集影象的問題

6.工業相機SDK之opencv二次開發

1.工業相機程式設計模型和流程

不同的工業相機提供不同的程式設計介面(SDK),儘管不同介面不同相機間程式設計介面各不相同,他們實際的API結構和程式設計模型很相似,瞭解了這些再對工業相機程式設計就很簡單了。

DMA技術

DMA是一種高速的資料傳輸操作,允許在外部裝置和儲存器之間直接讀寫資料,既不通過CPU,也不需要CPU干預。整個資料傳輸操作在一個稱為"DMA控制器

"的控制下進行的。CPU除了在資料傳輸開始和結束時做一點處理外,在傳輸過程中CPU可以進行其他的工作。這樣,在大部分時間裡,CPU和輸入輸出都處於並行操作。因此,使整個計算機系統的效率大大提高。

對於工業相機來說,當CMOS或CCD晶片曝光然後將資料轉到相機快取後,這時候DMA會負責將快取中資料儲存到硬碟上指定位置,正好滿足相機高速大資料的傳輸。一般都會使用DMA來完成實時的資料採集和儲存。

多數時候,DMA控制器存在各種介面的影象採集卡中,包括1394/GigE/USB/Camera Link等,這些採集卡有自己的時間控制單元完成和相機曝光的同步,並控制DMA的存取行為。

工作流程

當相機工作時,就是連續的採集-處理-採集-處理...的過程,但是這就存在一個問題,如果採集的速度比處理速度快,處理不過來,怎麼辦?在實際中,我們使用佇列來解決這個問題,當前幀沒有處理完,下一幀到來時直接放入佇列等待當前處理完成後再處理它。

如下圖

這裡使用三個佇列完成採集和處理同步。

DMA佇列:當CMOS或CCD晶片曝光然後將資料轉到相機快取後,這時候DMA會負責將快取中資料寫入到“DMA佇列”頭Buffer中。

準備佇列:一旦“DMA佇列”頭Buffer被填充完成,會被加到“準備佇列”尾後,這時候會發送中斷通知使用者程式:當前又有一幀資料採集完成,您看著處理吧。

處理佇列:當用戶接收到中斷會自動跳轉到中斷函式中,使用GetFrame拿取“準備佇列”頭Buffer,然後加到當前使用者程式“處理佇列”尾,使用者程式從“處理佇列”頭拿取Buffer處理完成後使用PutFrame將Buffer再新增到原始的“DMA佇列”尾。

需要說明如下幾點:

1.這裡的初始佇列為1-10,都是初始分配為DMA佇列的,這個記憶體分配和釋放過程有的SDK是自己負責的,有的則需要使用者自己分配和釋放,SDK只負責託管使用。

2.一般最開始註冊一箇中斷處理函式,當“準備佇列”填充完成會自動跳轉到中斷函式中,藉此完成同步操作。也可以是使用者自己維護同步結構體,使用查詢和等待的方式判斷“準備佇列”頭是否填充完成,是否該使用者程式獲取資料和處理了。

3.如果使用者處理任務非常簡單,可以去掉“處理佇列”,每次直接GetFrame->處理->PutFrame。如果使用者處理任務比較複雜而不希望出現丟幀的現象,則需要使用者使用“處理佇列”來儲存所有可用的Buffer。

4.這裡佇列也只是能夠解決處理速度比採集速度慢少許的情況,主要是對不同處理速度做平均來保證採集和處理同步。如果每一幀的處理時間太長,這時候“DMA佇列” Buffer全部轉移到“處理佇列” Buffer,就會出現異常情況,這時不同的相機會有不同的處理方法。

資料傳輸和顯示流程

如圖,每個相機可能有不同的流採集器(Grab Streamer)或同一介面上安裝了多個相機(也對應多個流採集器),對應多個通道(Channel)。對每個通道來說,在實際採集時資料傳輸實際上是拆分成如圖的資料包(Packet) RawData形式傳遞的,記憶體中儲存形式為一維陣列,在每一幀影象的起始存在不同的標識表明一幀的開始和結束,每一個Packet都有標識表明當前所屬的通道。為了顯示影象,使用者程式需要重新將一維陣列資料拼裝成影象形式,這一過程由使用者完成,通常可藉助OpenCV或MIL等影象處理包完成該操作。

程式設計模型和流程

對於相機來說,常見程式設計時我們關注三個物件——相機物件、採集物件、引數物件。

相機物件(Camera Object):負責相機的連線、斷開等工作。

採集物件(Grab Streamer):負責相機的採集佇列分配、相機單幀、連續採集。

引數物件(Parameter Object):負責相機引數的設定。

不同的SDK可能安排不一樣,一般來說要不是三種物件的功能合併到“相機物件”中,要不是分為三種物件,其實採集物件和引數物件都是在“相機物件”上封裝而來。

通用程式設計流程如下圖:

可以看到相機程式設計需要做三方面工作:

1.初始化操作

首先初始化相機驅動Com環境,然後遍歷得到當前的相機列表,根據相機ID或List 編號選擇對應相機。

之後連線指定相機,首先設定本次採集的相機引數(幀速、影象大小、縮放比等),然後是分配和註冊當前DMA佇列,這裡有的是使用者完成,有的是SDK完成

之後先開啟DMA邏輯等待相機採圖,然後使相機開始工作採圖,整個系統就按照之前工作流程運作起來了,許多SDK將“開啟DMA”和“相機開始工作”合併為“開始採集”

2.結束操作

先停止相機工作再關閉DMA邏輯,許多SDK將“開啟DMA”和“相機開始工作”合併為“結束採集”

然後清理DMA佇列,和分配時對應,這裡有的是使用者完成,有的是SDK完成

最後斷開相機並清理工作環境。

3.中斷響應操作

當相機一幀採集完成後,自動跳轉進入中斷回撥函式,這裡分了兩種中斷回撥函式。

第一種為簡單的取Buffer->處理->放回。

第二種結合Windows的訊息佇列,在此處再給一個“處理佇列”,給處理一個緩衝時間。

這裡的處理包括常見的影象處理、計算和顯示及RawData拼裝為影象等用到Buffer的地方。

前面也說過,常用的是中斷響應處理,除此之外,自己去查詢Buffer填充狀態並作相關同步操作在某些場合也會用到,這個請查詢不同相機SDK給出的同步方案。

差不多所有的工業相機SDK都是這樣的程式設計模型和流程,AVT 1394相機和Basler Camera Link相機AVT GigE相機相關程式碼在筆者網站可下載,還有之前講的Basler Pylon SDK相機程式設計,他們基本流程都是一樣,恕不詳述!

轉載自: http://blog.csdn.net/wenzhou1219

2. 工業相機SDK介面使用總結

相機呼叫

我們利用相機採集影象,首先要對相機進行相關引數設定及控制,這需要對相機的SDK包比較瞭解,一般相機廠家都會提供相機SDK,其中包含使用者手冊和呼叫Demo,這些都大大降低了呼叫門檻,提高了二次開發使用者的效率。目前用過Balser、海康、大華等相機,其實都是一個套路,都是按照下面幾個步驟進行的。

1)列舉裝置

2)建立控制代碼

3)開啟裝置

4)開始抓圖

5)獲取一幀並儲存影象

6)停止抓圖

7)關閉裝置

8)銷燬控制代碼

相機同步

若是開發過程中用到雙目或者多目的話,則需要外接同步觸發器或者外部觸發訊號,通過相機同步觸發線來實現同步問題。以實際應用過的Basler acA1300-200uc為例,其相機同步觸發線具體型別如下:

1 -—— +12 VDC 紅

2 —— I/O Input 1 黃

3 —— VCC(加電阻) 藍

4 —— I/O Out 1 綠

6 —— DCcam Power GND 黑

0000—— I/O GND 白

3. Basler Pylon工業相機SDK的使用

Pylon庫有C++ .Net等各種封裝版本,一般用C++版本,功能全面效率高,但對於不同介面(GigE USB3.0 CameraLink)的相機必須對應使用不同的類,之間不能通用。

基於GenAPI通用相機抽象介面使用的是Node結構,以字串形式訪問相機引數,可以統一管理不同介面型別的相機。但效率低,使用不方便。

Pylon高層用C++封裝,形成本地相機物件

如何管理多個相機,最靠譜的方法是按相機ID標定順序,需要讀一個配置檔案,比如XML或JSON,然而一開始不知道ID,需要先列舉出來。

4.Pylon 以實時影象採集講解PylonC SDK使用流程

一般的對於提供硬體程式設計來說,硬體生產廠家都會提供好SDK使用的手冊和例項。手冊中一般包括安裝和配置流程,一些基本概念的介紹,SDK每個函式使用,SDK使用流程和例項(有些硬體例項直接寫在手冊中,有些會以單獨檔案存在,還有的兩者皆有)。對於上位機軟體開發人員來說拿到一個硬體上位機程式設計任務。

首先應該閱讀了解其SDK概念,再按照其介紹的SDK開發流程閱讀其提供的例項,修改相應的例項為自己所用,有不懂的函式查詢一下其用法即可。有些開發人員習慣性的去記其API,這是費時費力的做法,並不推薦。下面主要以實時影象採集講解Basler相機的PylonC SDK的使用流程。

PylonC SDK的使用的總體流程圖如下:

下面是其中對於不同的工作要求,載入相機物件和解除安裝相機物件是通用的。而要使用其他模組,如事件物件時,相應的改為載入事件物件和解除安裝事件物件,以及使用事件物件完成相關任務即可。程式設計時一定要對整個流程做好規劃,特別是硬體程式設計時一定留意記憶體洩露,前面分配的資源一定要在後面釋放。

下面是五個大流程的詳細解析,需要的地方已經加以說明,並註解了需要用到的函式

載入相機物件

解除安裝相機物件

載入資料流抓取物件

解除安裝資料流抓取物件

單幀或連續抓圖過程

按照以上介紹的流程即可實現實時影象採集

原始碼下載連結:http://download.csdn.net/download/wenzhou1219/8721495 (點選閱讀原文進入) 。很多人問我要原始碼,翻了以前的程式資料夾找到了這個程式,演示了利用Pylon SDK進行相機採集的過程,使用MIL完成介面顯示,採集部分封裝成了類,可以直接重用。測試相機為Basler相機。注意Pylon僅完成Raw Data的採集,使用MIL的MbufPut完成影象資料的重組,然後MIL自動顯示。

轉自:http://blog.csdn.net/wenzhou1219

作者:文大俠

在工業控制當中,用到basler工業相機sdk程式設計,主要是使用c或者c++,當專案龐大時,又需要良好的使用者介面,用C++是不錯的選擇。

以例項和看過的一些參照講講PylonCppSDK使用流程。

首先,同C一樣,這裡給出一個bolg連結,寫的不錯,即上面文大俠這篇http://blog.csdn.net/wenzhou1219/article/details/7543420。

從中我們知道,總的開發流程圖如下:

那麼,用C++開發也大抵如此。

這裡我們看一個basler的cpp sample:

把這個和上面的流程圖對比理解,再看看文件和sdk的結構,理解起來就容易多了。

5.關於使用維視工業相機 SDK 採集影象的問題

問:最近一直在研究怎麼用相機的SDK採集影象且能實時採集。用的維視MV-1300UC,它提供了DEMO,還有說明文件(一些函式的定義),我發現例子裡面沒有給出類,就直接定義類中的函式,看不明白。有開發經驗的老師嗎?給點指導,自己一個人學習一點進展也沒有,謝謝!

答:

引用
工業相機的SDK,為了通用性應該提供的是C介面

既然如此,例子中的類應該就只限那個例子有效,並不是使用該相機必須的

只要你看懂了每個函式的功能,用不著照抄例子中使用的類

有包含檔案(.h)和靜態連結庫(.lib)我看了例子都沒有看到主函式基本都是void 類名::函式名(){ }這種形式。

所以說你的問題在於看不懂例程,而不是看不懂相機開發包

一般工控領域提供的例程都是MFC程式,你到裡面找main函式當然找不到

問:哦,這樣啊,老師你有這方面的經驗嗎?這個東西我都弄了兩週了,還是無從下手,難怪我還一直找主函式。給的說明文件我都看了好幾遍了,感覺例子裡面用到的也不多,自己想把裡面的函式單獨拿出來來實現功能,引數經常發生錯誤。

答:你說的這款相機我沒用過。

建議你簡單學習一下MFC。工控方面的程式設計用MFC比較多,畢竟搞工控的都不是專業程式設計師,沒精力去專研那些複雜先進的軟體技術,MFC算是最普及最簡單的圖形介面庫了。

相機的話,應該是程式啟動時【Open】,關閉時【Close】,採集影象前需要【設定採集引數】,採集單幅影象可以隨時【採集】,採集連續影象的話需要【Start】和【Stop】,Start前要【設定連續採集引數】大多還需要【設定回撥函式】。你可以去找這些功能的函式以及它們在例程中的位置和用法,配合MFC簡單程式設計的學習,應該能快一點上手吧。

轉自:CSDN論壇

6.工業相機SDK之opencv二次開發

做視覺的第一步是選好相機鏡頭等硬體裝置,接下來就是將自己開發的演算法在硬體上實現。我最近做一個專案,實現了一下Opencv在相機SDK上的運用,下面小結一下具體實現步驟.

1. 安裝相機自帶的驅動和SDK開發包;

2. 用VS2010新建一個工程,配置好SDK的動態連結庫(或者靜態),具體動態連結庫的使用可參見孫鑫的那本書,這裡不多說;

3. 條用SDK開發包中的函式建立相機和PC機件的連結;

4. 建立視訊流資料,設立一個回撥函式(具體參見各SDK),並將資料拷貝到Mat中的data中;

5. 有了opencv中的Mat資料結構,接下來就可以實現我們的各種演算法了。

我使用的是LuCam相機,由於時間關係沒有研究很深入

轉自:http://blog.sina.com.cn/s/blog_662c78590100zslr.htm