內(nèi)容綱要:
1.工業(yè)相機(jī)編程模型和流程
3.Basler Pylon工業(yè)相機(jī)SDK的使用
4.Pylon 以實(shí)時圖像采集講解PylonC SDK使用流程
5.關(guān)于使用維視工業(yè)相機(jī) SDK 采集圖像的問題
6.工業(yè)相機(jī)SDK之opencv二次開發(fā)
一、工業(yè)相機(jī)編程模型和流程
不同的工業(yè)相機(jī)提供不同的編程接口(SDK),盡管不同接口不同相機(jī)間編程接口各不相同,他們實(shí)際的API結(jié)構(gòu)和編程模型很相似,了解了這些再對工業(yè)相機(jī)編程就很簡單了。
DMA技術(shù):
DMA是一種高速的數(shù)據(jù)傳輸操作,允許在外部設(shè)備和存儲器之間直接讀寫數(shù)據(jù),既不通過CPU,也不需要CPU干預(yù)。整個數(shù)據(jù)傳輸操作在一個稱為"DMA控制器"的控制下進(jìn)行的。CPU除了在數(shù)據(jù)傳輸開始和結(jié)束時做一點(diǎn)處理外,在傳輸過程中CPU可以進(jìn)行其他的工作。這樣,在大部分時間里,CPU和輸入輸出都處于并行操作。因此,使整個計(jì)算機(jī)系統(tǒng)的效率大大提高。
對于工業(yè)相機(jī)來說,當(dāng)CMOS或CCD芯片曝光然后將數(shù)據(jù)轉(zhuǎn)到相機(jī)緩存后,這時候DMA會負(fù)責(zé)將緩存中數(shù)據(jù)保存到硬盤上指定位置,正好滿足相機(jī)高速大數(shù)據(jù)的傳輸。一般都會使用DMA來完成實(shí)時的數(shù)據(jù)采集和保存。
多數(shù)時候,DMA控制器存在各種接口的圖像采集卡中,包括1394/GigE/USB/Camera Link等,這些采集卡有自己的時間控制單元完成和相機(jī)曝光的同步,并控制DMA的存取行為。
工作流程:
當(dāng)相機(jī)工作時,就是連續(xù)的采集-處理-采集-處理...的過程,但是這就存在一個問題,如果采集的速度比處理速度快,處理不過來,怎么辦?在實(shí)際中,我們使用隊(duì)列來解決這個問題,當(dāng)前幀沒有處理完,下一幀到來時直接放入隊(duì)列等待當(dāng)前處理完成后再處理它。
如下圖
▼
這里使用三個隊(duì)列完成采集和處理同步。
DMA隊(duì)列:
當(dāng)CMOS或CCD芯片曝光然后將數(shù)據(jù)轉(zhuǎn)到相機(jī)緩存后,這時候DMA會負(fù)責(zé)將緩存中數(shù)據(jù)寫入到“DMA隊(duì)列”頭Buffer中。
準(zhǔn)備隊(duì)列:
一旦“DMA隊(duì)列”頭Buffer被填充完成,會被加到“準(zhǔn)備隊(duì)列”尾后,這時候會發(fā)送中斷通知用戶程序:當(dāng)前又有一幀數(shù)據(jù)采集完成,您看著處理吧。
處理隊(duì)列:
當(dāng)用戶接收到中斷會自動跳轉(zhuǎn)到中斷函數(shù)中,使用GetFrame拿取“準(zhǔn)備隊(duì)列”頭Buffer,然后加到當(dāng)前用戶程序“處理隊(duì)列”尾,用戶程序從“處理隊(duì)列”頭拿取Buffer處理完成后使用PutFrame將Buffer再添加到原始的“DMA隊(duì)列”尾。
需要說明如下幾點(diǎn):
1.這里的初始隊(duì)列為1-10,都是初始分配為DMA隊(duì)列的,這個內(nèi)存分配和釋放過程有的SDK是自己負(fù)責(zé)的,有的則需要用戶自己分配和釋放,SDK只負(fù)責(zé)托管使用。
2.一般最開始注冊一個中斷處理函數(shù),當(dāng)“準(zhǔn)備隊(duì)列”填充完成會自動跳轉(zhuǎn)到中斷函數(shù)中,借此完成同步操作。也可以是用戶自己維護(hù)同步結(jié)構(gòu)體,使用查詢和等待的方式判斷“準(zhǔn)備隊(duì)列”頭是否填充完成,是否該用戶程序獲取數(shù)據(jù)和處理了。
3.如果用戶處理任務(wù)非常簡單,可以去掉“處理隊(duì)列”,每次直接GetFrame->處理->PutFrame。如果用戶處理任務(wù)比較復(fù)雜而不希望出現(xiàn)丟幀的現(xiàn)象,則需要用戶使用“處理隊(duì)列”來保存所有可用的Buffer。
4.這里隊(duì)列也只是能夠解決處理速度比采集速度慢少許的情況,主要是對不同處理速度做平均來保證采集和處理同步。如果每一幀的處理時間太長,這時候“DMA隊(duì)列” Buffer全部轉(zhuǎn)移到“處理隊(duì)列” Buffer,就會出現(xiàn)異常情況,這時不同的相機(jī)會有不同的處理方法。
數(shù)據(jù)傳輸和顯示流程
▼
如圖,每個相機(jī)可能有不同的流采集器(Grab Streamer)或同一接口上安裝了多個相機(jī)(也對應(yīng)多個流采集器),對應(yīng)多個通道(Channel)。對每個通道來說,在實(shí)際采集時數(shù)據(jù)傳輸實(shí)際上是拆分成如圖的數(shù)據(jù)包(Packet) RawData形式傳遞的,內(nèi)存中存儲形式為一維數(shù)組,在每一幀圖像的起始存在不同的標(biāo)識表明一幀的開始和結(jié)束,每一個Packet都有標(biāo)識表明當(dāng)前所屬的通道。為了顯示圖像,用戶程序需要重新將一維數(shù)組數(shù)據(jù)拼裝成圖像形式,這一過程由用戶完成,通??山柚鶲penCV或MIL等圖像處理包完成該操作。
編程模型和流程
對于相機(jī)來說,常見編程時我們關(guān)注三個對象——相機(jī)對象、采集對象、參數(shù)對象。
相機(jī)對象(Camera Object):負(fù)責(zé)相機(jī)的連接、斷開等工作。
采集對象(Grab Streamer):負(fù)責(zé)相機(jī)的采集隊(duì)列分配、相機(jī)單幀、連續(xù)采集。
參數(shù)對象(Parameter Object):負(fù)責(zé)相機(jī)參數(shù)的設(shè)置。
不同的SDK可能安排不一樣,一般來說要不是三種對象的功能合并到“相機(jī)對象”中,要不是分為三種對象,其實(shí)采集對象和參數(shù)對象都是在“相機(jī)對象”上封裝而來。
通用編程流程如下圖
▼
可以看到相機(jī)編程需要做三方面工作:
1.初始化操作
首先初始化相機(jī)驅(qū)動Com環(huán)境,然后遍歷得到當(dāng)前的相機(jī)列表,根據(jù)相機(jī)ID或List 編號選擇對應(yīng)相機(jī)。
之后連接指定相機(jī),首先設(shè)置本次采集的相機(jī)參數(shù)(幀速、圖像大小、縮放比等),然后是分配和注冊當(dāng)前DMA隊(duì)列,這里有的是用戶完成,有的是SDK完成。
之后先開啟DMA邏輯等待相機(jī)采圖,然后使相機(jī)開始工作采圖,整個系統(tǒng)就按照之前工作流程運(yùn)作起來了,許多SDK將“開啟DMA”和“相機(jī)開始工作”合并為“開始采集”。
2.結(jié)束操作
先停止相機(jī)工作再關(guān)閉DMA邏輯,許多SDK將“開啟DMA”和“相機(jī)開始工作”合并為“結(jié)束采集”。
然后清理DMA隊(duì)列,和分配時對應(yīng),這里有的是用戶完成,有的是SDK完成。
最后斷開相機(jī)并清理工作環(huán)境。
3.中斷響應(yīng)操作
當(dāng)相機(jī)一幀采集完成后,自動跳轉(zhuǎn)進(jìn)入中斷回調(diào)函數(shù),這里分了兩種中斷回調(diào)函數(shù)。
第一種為簡單的取Buffer->處理->放回。
第二種結(jié)合Windows的消息隊(duì)列,在此處再給一個“處理隊(duì)列”,給處理一個緩沖時間。
這里的處理包括常見的圖像處理、計(jì)算和顯示及RawData拼裝為圖像等用到Buffer的地方。
前面也說過,常用的是中斷響應(yīng)處理,除此之外,自己去查詢Buffer填充狀態(tài)并作相關(guān)同步操作在某些場合也會用到,這個請查詢不同相機(jī)SDK給出的同步方案。
差不多所有的工業(yè)相機(jī)SDK都是這樣的編程模型和流程,AVT 1394相機(jī)和Basler Camera Link相機(jī)和AVT GigE相機(jī)相關(guān)代碼在筆者網(wǎng)站可下載,還有之前講的Basler Pylon SDK相機(jī)編程,他們基本流程都是一樣,恕不詳述!
二、 工業(yè)相機(jī)SDK接口使用總結(jié)
相機(jī)調(diào)用 :
我們利用相機(jī)采集圖像,首先要對相機(jī)進(jìn)行相關(guān)參數(shù)設(shè)置及控制,這需要對相機(jī)的SDK包比較了解,一般相機(jī)廠家都會提供相機(jī)SDK,其中包含用戶手冊和調(diào)用Demo,這些都大大降低了調(diào)用門檻,提高了二次開發(fā)用戶的效率。目前用過Balser、海康、大華等相機(jī),其實(shí)都是一個套路,都是按照下面幾個步驟進(jìn)行的。
1)枚舉設(shè)備
2)創(chuàng)建句柄
3)打開設(shè)備
4)開始抓圖
5)獲取一幀并保存圖像
6)停止抓圖
7)關(guān)閉設(shè)備
8)銷毀句柄
相機(jī)同步:
若是開發(fā)過程中用到雙目或者多目的話,則需要外接同步觸發(fā)器或者外部觸發(fā)信號,通過相機(jī)同步觸發(fā)線來實(shí)現(xiàn)同步問題。以實(shí)際應(yīng)用過的Basler acA1300-200uc為例,其相機(jī)同步觸發(fā)線具體類型如下:
1 -—— +12 VDC 紅
2 —— I/O Input 1 黃
3 —— VCC(加電阻) 藍(lán)
4 —— I/O Out 1 綠
6 —— DCcam Power GND 黑
0000—— I/O GND 白
三、 Basler Pylon工業(yè)相機(jī)SDK的使用
Pylon庫有C++ .Net等各種封裝版本,一般用C++版本,功能全面效率高,但對于不同接口(GigE USB3.0 CameraLink)的相機(jī)必須對應(yīng)使用不同的類,之間不能通用。
基于GenAPI通用相機(jī)抽象接口使用的是Node結(jié)構(gòu),以字符串形式訪問相機(jī)參數(shù),可以統(tǒng)一管理不同接口類型的相機(jī)。但效率低,使用不方便。
Pylon高層用C++封裝,形成本地相機(jī)對象
如何管理多個相機(jī),最靠譜的方法是按相機(jī)ID標(biāo)定順序,需要讀一個配置文件,比如XML或JSON,然而一開始不知道ID,需要先列舉出來。
四、Pylon 以實(shí)時圖像采集講解PylonC SDK使用流程
一般的對于提供硬件編程來說,硬件生產(chǎn)廠家都會提供好SDK使用的手冊和實(shí)例。手冊中一般包括安裝和配置流程,一些基本概念的介紹,SDK每個函數(shù)使用,SDK使用流程和實(shí)例(有些硬件實(shí)例直接寫在手冊中,有些會以單獨(dú)文件存在,還有的兩者皆有)。對于上位機(jī)軟件開發(fā)人員來說拿到一個硬件上位機(jī)編程任務(wù)。
首先應(yīng)該閱讀了解其SDK概念,再按照其介紹的SDK開發(fā)流程閱讀其提供的實(shí)例,修改相應(yīng)的實(shí)例為自己所用,有不懂的函數(shù)查詢一下其用法即可。有些開發(fā)人員習(xí)慣性的去記其API,這是費(fèi)時費(fèi)力的做法,并不推薦。下面主要以實(shí)時圖像采集講解Basler相機(jī)的PylonC SDK的使用流程。
PylonC SDK的使用的總體流程圖如下
▼
下面是其中對于不同的工作要求,加載相機(jī)對象和卸載相機(jī)對象是通用的。而要使用其他模塊,如事件對象時,相應(yīng)的改為加載事件對象和卸載事件對象,以及使用事件對象完成相關(guān)任務(wù)即可。編程時一定要對整個流程做好規(guī)劃,特別是硬件編程時一定留意內(nèi)存泄露,前面分配的資源一定要在后面釋放。
下面是五個大流程的詳細(xì)解析,需要的地方已經(jīng)加以說明,并注解了需要用到的函數(shù)
加載相機(jī)對象:
卸載相機(jī)對象:
加載數(shù)據(jù)流抓取對象:
卸載數(shù)據(jù)流抓取對象:
單幀或連續(xù)抓圖過程:
按照以上介紹的流程即可實(shí)現(xiàn)實(shí)時圖像采集:
在工業(yè)控制當(dāng)中,用到basler工業(yè)相機(jī)sdk編程,主要是使用c或者c++,當(dāng)項(xiàng)目龐大時,又需要良好的用戶界面,用C++是不錯的選擇。
以實(shí)例和看過的一些參照講講PylonCppSDK使用流程。
首先,同C一樣,這里給出一個bolg鏈接,寫的不錯,即上面文大俠這篇http://blog.csdn.net/wenzhou1219/article/details/7543420。
從中我們知道,總的開發(fā)流程圖如下
▼
那么,用C++開發(fā)也大抵如此。
這里我們看一個basler的cpp sample:
把這個和上面的流程圖對比理解,再看看文檔和sdk的結(jié)構(gòu),理解起來就容易多了。
五、關(guān)于使用維視工業(yè)相機(jī) SDK 采集圖像的問題
問:最近一直在研究怎么用相機(jī)的SDK采集圖像且能實(shí)時采集。用的維視MV-1300UC,它提供了DEMO,還有說明文檔(一些函數(shù)的定義),我發(fā)現(xiàn)例子里面沒有給出類,就直接定義類中的函數(shù),看不明白。有開發(fā)經(jīng)驗(yàn)的老師嗎?給點(diǎn)指導(dǎo),自己一個人學(xué)習(xí)一點(diǎn)進(jìn)展也沒有,謝謝!
答:
引用
工業(yè)相機(jī)的SDK,為了通用性應(yīng)該提供的是C接口
既然如此,例子中的類應(yīng)該就只限那個例子有效,并不是使用該相機(jī)必須的
只要你看懂了每個函數(shù)的功能,用不著照抄例子中使用的類
有包含文件(.h)和靜態(tài)鏈接庫(.lib)我看了例子都沒有看到主函數(shù)基本都是void 類名::函數(shù)名(){ }這種形式。
所以說你的問題在于看不懂例程,而不是看不懂相機(jī)開發(fā)包
一般工控領(lǐng)域提供的例程都是MFC程序,你到里面找main函數(shù)當(dāng)然找不到
問:哦,這樣啊,老師你有這方面的經(jīng)驗(yàn)嗎?這個東西我都弄了兩周了,還是無從下手,難怪我還一直找主函數(shù)。給的說明文檔我都看了好幾遍了,感覺例子里面用到的也不多,自己想把里面的函數(shù)單獨(dú)拿出來來實(shí)現(xiàn)功能,參數(shù)經(jīng)常發(fā)生錯誤。
答:你說的這款相機(jī)我沒用過。
建議你簡單學(xué)習(xí)一下MFC。工控方面的編程用MFC比較多,畢竟搞工控的都不是專業(yè)程序員,沒精力去專研那些復(fù)雜先進(jìn)的軟件技術(shù),MFC算是最普及最簡單的圖形界面庫了。
相機(jī)的話,應(yīng)該是程序啟動時【Open】,關(guān)閉時【Close】,采集圖像前需要【設(shè)置采集參數(shù)】,采集單幅圖像可以隨時【采集】,采集連續(xù)圖像的話需要【Start】和【Stop】,Start前要【設(shè)置連續(xù)采集參數(shù)】大多還需要【設(shè)置回調(diào)函數(shù)】。你可以去找這些功能的函數(shù)以及它們在例程中的位置和用法,配合MFC簡單編程的學(xué)習(xí),應(yīng)該能快一點(diǎn)上手吧。
轉(zhuǎn)自:CSDN論壇
六、工業(yè)相機(jī)SDK之opencv二次開發(fā)
做視覺的第一步是選好相機(jī)鏡頭等硬件設(shè)備,接下來就是將自己開發(fā)的算法在硬件上實(shí)現(xiàn)。我最近做一個項(xiàng)目,實(shí)現(xiàn)了一下Opencv在相機(jī)SDK上的運(yùn)用,下面小結(jié)一下具體實(shí)現(xiàn)步驟.
1. 安裝相機(jī)自帶的驅(qū)動和SDK開發(fā)包;
2. 用VS2010新建一個工程,配置好SDK的動態(tài)鏈接庫(或者靜態(tài)),具體動態(tài)鏈接庫的使用可參見孫鑫的那本書,這里不多說;
3. 條用SDK開發(fā)包中的函數(shù)建立相機(jī)和PC機(jī)件的鏈接;
4. 建立視頻流數(shù)據(jù),設(shè)立一個回調(diào)函數(shù)(具體參見各SDK),并將數(shù)據(jù)拷貝到Mat中的data中;
5. 有了opencv中的Mat數(shù)據(jù)結(jié)構(gòu),接下來就可以實(shí)現(xiàn)我們的各種算法了。
-
相機(jī)
+關(guān)注
關(guān)注
4文章
1350瀏覽量
53581 -
編程
+關(guān)注
關(guān)注
88文章
3614瀏覽量
93686 -
dma
+關(guān)注
關(guān)注
3文章
560瀏覽量
100546 -
SDK
+關(guān)注
關(guān)注
3文章
1035瀏覽量
45900
原文標(biāo)題:工業(yè)相機(jī)編程流程及SDK接口使用匯總
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論