工業相機程式設計模型和流程
阿新 • • 發佈:2019-01-31
不同的工業相機提供不同的程式設計介面(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中。 準備佇列資料傳輸和顯示流程
如圖,每個相機可能有不同的流採集器(Grab Streamer)或同一介面上安裝了多個相機(也對應多個流採集器),對應多個通道(Channel)。對每個通道來說,在實際採集時資料傳輸實際上是拆分成如圖的資料包(Packet) RawData形式傳遞的,記憶體中儲存形式為一維陣列,在每一幀影象的起始存在不同的標識表明一幀的開始和結束,每一個Packet都有標識表明當前所屬的通道。為了顯示影象,使用者程式需要重新將一維陣列資料拼裝成影象形式,這一過程由使用者完成,通常可藉助OpenCV或MIL等影象處理包完成該操作。
程式設計模型和流程
對於相機來說,常見程式設計時我們關注三個物件——相機物件、採集物件、引數物件。 相機物件(Camera Object):負責相機的連線、斷開等工作。 採集物件(Grab Streamer):負責相機的採集佇列分配、相機單幀、連續採集。 引數物件(Parameter Object):負責相機引數的設定。 不同的SDK可能安排不一樣,一般來說要不是三種物件的功能合併到“相機物件”中,要不是分為三種物件,其實採集物件和引數物件都是在“相機物件”上封裝而來。 通用程式設計流程如下圖:可以看到相機程式設計需要做三方面工作: