工業(yè)相機(jī)編程模型和流程

??不同的工業(yè)相機(jī)提供不同的編程接口(SDK),盡管不同接口不同相機(jī)間編程接口各不相同,他們實(shí)際的API結(jié)構(gòu)和編程模型很相似,了解了這些再對(duì)工業(yè)相機(jī)編程就很簡(jiǎn)單了

DMA技術(shù)

??DMA是一種高速的數(shù)據(jù)傳輸操作,允許在外部設(shè)備和存儲(chǔ)器之間直接讀寫數(shù)據(jù),既不通過CPU,也不需要CPU干預(yù)。整個(gè)數(shù)據(jù)傳輸操作在一個(gè)稱為"DMA控制器"的控制下進(jìn)行的。CPU除了在數(shù)據(jù)傳輸開始和結(jié)束時(shí)做一點(diǎn)處理外,在傳輸過程中CPU可以進(jìn)行其他的工作。這樣,在大部分時(shí)間里,CPU和輸入輸出都處于并行操作。因此,使整個(gè)計(jì)算機(jī)系統(tǒng)的效率大大提高。
??對(duì)于工業(yè)相機(jī)來說,當(dāng)CMOS或CCD芯片曝光然后將數(shù)據(jù)轉(zhuǎn)到相機(jī)緩存后,這時(shí)候DMA會(huì)負(fù)責(zé)將緩存中數(shù)據(jù)保存到硬盤上指定位置,正好滿足相機(jī)高速大數(shù)據(jù)的傳輸。一般都會(huì)使用DMA來完成實(shí)時(shí)的數(shù)據(jù)采集和保存。
??多數(shù)時(shí)候,DMA控制器存在各種接口的圖像采集卡中,包括1394/GigE/USB/Camera Link等,這些采集卡有自己的時(shí)間控制單元完成和相機(jī)曝光的同步,并控制DMA的存取行為。

工作流程

??當(dāng)相機(jī)工作時(shí),就是連續(xù)的采集-處理-采集-處理...的過程,但是這就存在一個(gè)問題,如果采集的速度比處理速度快,處理不過來,怎么辦?在實(shí)際中,我們使用隊(duì)列來解決這個(gè)問題,當(dāng)前幀沒有處理完,下一幀到來時(shí)直接放入隊(duì)列等待當(dāng)前處理完成后再處理它。如下圖

相機(jī)圖像采集

這里使用三個(gè)隊(duì)列完成采集和處理同步。
DMA隊(duì)列:當(dāng)CMOS或CCD芯片曝光然后將數(shù)據(jù)轉(zhuǎn)到相機(jī)緩存后,這時(shí)候DMA會(huì)負(fù)責(zé)將緩存中數(shù)據(jù)寫入到“DMA隊(duì)列”頭Buffer中。
準(zhǔn)備隊(duì)列:一旦“DMA隊(duì)列”頭Buffer被填充完成,會(huì)被加到“準(zhǔn)備隊(duì)列”尾后,這時(shí)候會(huì)發(fā)送中斷通知用戶程序:當(dāng)前又有一幀數(shù)據(jù)采集完成,您看著處理吧。
處理隊(duì)列:當(dāng)用戶接收到中斷會(huì)自動(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ì)列的,這個(gè)內(nèi)存分配和釋放過程有的SDK是自己負(fù)責(zé)的,有的則需要用戶自己分配和釋放,SDK只負(fù)責(zé)托管使用。
2.一般最開始注冊(cè)一個(gè)中斷處理函數(shù),當(dāng)“準(zhǔn)備隊(duì)列”填充完成會(huì)自動(dòng)跳轉(zhuǎn)到中斷函數(shù)中,借此完成同步操作。也可以是用戶自己維護(hù)同步結(jié)構(gòu)體,使用查詢和等待的方式判斷“準(zhǔn)備隊(duì)列”頭是否填充完成,是否該用戶程序獲取數(shù)據(jù)和處理了。
3.如果用戶處理任務(wù)非常簡(jiǎn)單,可以去掉“處理隊(duì)列”,每次直接GetFrame->處理->PutFrame。如果用戶處理任務(wù)比較復(fù)雜而不希望出現(xiàn)丟幀的現(xiàn)象,則需要用戶使用“處理隊(duì)列”來保存所有可用的Buffer。
4.這里隊(duì)列也只是能夠解決處理速度比采集速度慢少許的情況,主要是對(duì)不同處理速度做平均來保證采集和處理同步。如果每一幀的處理時(shí)間太長(zhǎng),這時(shí)候“DMA隊(duì)列” Buffer全部轉(zhuǎn)移到“處理隊(duì)列” Buffer,就會(huì)出現(xiàn)異常情況,這時(shí)不同的相機(jī)會(huì)有不同的處理方法。

數(shù)據(jù)傳輸和顯示流程

數(shù)據(jù)傳輸和顯示流程

??如圖,每個(gè)相機(jī)可能有不同的流采集器(Grab Streamer)或同一接口上安裝了多個(gè)相機(jī)(也對(duì)應(yīng)多個(gè)流采集器),對(duì)應(yīng)多個(gè)通道(Channel)。對(duì)每個(gè)通道來說,在實(shí)際采集時(shí)數(shù)據(jù)傳輸實(shí)際上是拆分成如圖的數(shù)據(jù)包(Packet) RawData形式傳遞的,內(nèi)存中存儲(chǔ)形式為一維數(shù)組,在每一幀圖像的起始存在不同的標(biāo)識(shí)表明一幀的開始和結(jié)束,每一個(gè)Packet都有標(biāo)識(shí)表明當(dāng)前所屬的通道。為了顯示圖像,用戶程序需要重新將一維數(shù)組數(shù)據(jù)拼裝成圖像形式,這一過程由用戶完成,通??山柚鶲penCV或MIL等圖像處理包完成該操作。

編程模型和流程

??對(duì)于相機(jī)來說,常見編程時(shí)我們關(guān)注三個(gè)對(duì)象——相機(jī)對(duì)象、采集對(duì)象、參數(shù)對(duì)象。
相機(jī)對(duì)象(Camera Object):負(fù)責(zé)相機(jī)的連接、斷開等工作。
采集對(duì)象(Grab Streamer):負(fù)責(zé)相機(jī)的采集隊(duì)列分配、相機(jī)單幀、連續(xù)采集。
參數(shù)對(duì)象(Parameter Object):負(fù)責(zé)相機(jī)參數(shù)的設(shè)置。
??不同的SDK可能安排不一樣,一般來說要不是三種對(duì)象的功能合并到“相機(jī)對(duì)象”中,要不是分為三種對(duì)象,其實(shí)采集對(duì)象和參數(shù)對(duì)象都是在“相機(jī)對(duì)象”上封裝而來。

通用編程流程如下圖:

采集程序

可以看到相機(jī)編程需要做三方面工作:
1.初始化操作
??首先初始化相機(jī)驅(qū)動(dòng)Com環(huán)境,然后遍歷得到當(dāng)前的相機(jī)列表,根據(jù)相機(jī)ID或List 編號(hào)選擇對(duì)應(yīng)相機(jī)。之后連接指定相機(jī),首先設(shè)置本次采集的相機(jī)參數(shù)(幀速、圖像大小、縮放比等),然后是分配和注冊(cè)當(dāng)前DMA隊(duì)列,這里有的是用戶完成,有的是SDK完成。之后先開啟DMA邏輯等待相機(jī)采圖,然后使相機(jī)開始工作采圖,整個(gè)系統(tǒng)就按照之前工作流程運(yùn)作起來了,許多SDK將“開啟DMA”和“相機(jī)開始工作”合并為“開始采集”。
2.結(jié)束操作
??先停止相機(jī)工作再關(guān)閉DMA邏輯,許多SDK將“開啟DMA”和“相機(jī)開始工作”合并為“結(jié)束采集”。然后清理DMA隊(duì)列,和分配時(shí)對(duì)應(yīng),這里有的是用戶完成,有的是SDK完成。最后斷開相機(jī)并清理工作環(huán)境。
3.中斷響應(yīng)操作
??當(dāng)相機(jī)一幀采集完成后,自動(dòng)跳轉(zhuǎn)進(jìn)入中斷回調(diào)函數(shù),這里分了兩種中斷回調(diào)函數(shù)。
第一種為簡(jiǎn)單的取Buffer->處理->放回。
第二種結(jié)合Windows的消息隊(duì)列,在此處再給一個(gè)“處理隊(duì)列”,給處理一個(gè)緩沖時(shí)間。
??這里的處理包括常見的圖像處理、計(jì)算和顯示及RawData拼裝為圖像等用到Buffer的地方。
??前面也說過,常用的是中斷響應(yīng)處理,除此之外,自己去查詢Buffer填充狀態(tài)并作相關(guān)同步操作在某些場(chǎng)合也會(huì)用到,這個(gè)請(qǐng)查詢不同相機(jī)SDK給出的同步方案。[轉(zhuǎn)自:文大俠]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,932評(píng)論 25 709
  • word直接復(fù)制來了,格式就不改了。至于這門課怎么復(fù)習(xí),只要平時(shí)實(shí)驗(yàn)都認(rèn)真完成、報(bào)告認(rèn)真寫,平時(shí)分都很高;考試的話...
    Jozhn閱讀 4,904評(píng)論 0 8
  • 世界很大 快樂很小 懂得自我調(diào)節(jié) 降低快樂的門檻 降低別人配合的難度 這樣的快樂 或許會(huì)來得簡(jiǎn)單一點(diǎn) 如果你不能改...
    稻草人的風(fēng)鈴閱讀 308評(píng)論 2 0
  • 1 我生活在渭北高原一個(gè)貧困縣城。在古代,唐代大詩人杜甫有詩形容此地“朱門酒肉臭,路有凍死骨”。 如今,縣城經(jīng)濟(jì)發(fā)...
    舞雩風(fēng)語閱讀 216評(píng)論 1 2
  • 《如何閱讀一本書》讀后感之一 不會(huì)讀書讀再多的書有什么用?讀書不能只為了消遣,更要學(xué)會(huì)正確的閱讀方法。這本書顛覆了...
    自強(qiáng)不息678閱讀 318評(píng)論 1 1

友情鏈接更多精彩內(nèi)容