1. 程式人生 > >halcon影象採集之同步(synchronous)與非同步(asynchronous)

halcon影象採集之同步(synchronous)與非同步(asynchronous)

通常情況下,當我們抓取幀的時候是從一個連續的視訊流序列中去抓取一個或者多個視訊幀。儘管近來有許多的專業裝置使用數字訊號,但大多數情況下,視訊訊號是模擬訊號(analog)。最常見的模擬視訊格式是

  1. NTSC: 640 × 480 pixel, 30 frames per second and

  2. PAL: 768 × 576 pixel, 25 frames per second

這兩種格式都是彩色視訊訊號,還有許多的影象獲取裝置儘管有一個彩色視訊訊號但是隻傳輸灰度影象。下面讓我們假設使用的是模擬訊號的影象採集卡。

讓我們看一下模擬訊號:實際上它由許多不同訊號組成,有垂直或者水平的同步訊號,原始資料訊號。有時,彩色和亮度大的訊號是混合訊號,他們在不同的輸入頻道上傳送(RGB)。因為在錄影時幀抓取是同步的,所以它必須等到下一個垂直同步訊號到達才開始抓取新的影象。

當隨機抓取一幀影象時會引起一個大約半幀時間的延遲。如下圖也就是說你如果想節省時間的話必須在抓完前一幀的情況下緊接著抓取下一幀。但是這樣做的結果就是,我們沒有

時間去處理影象。在這種同步模式下,上位機只顧著傳送抓取影象的命令而沒有時間去處理影象。因此,Halcon也支援非同步抓取。

同步抓取和非同步抓取

         為了明白什麼是非同步抓取,我們先來看一下影象採集裝置對於採集到的幀到底做了什麼。明白這個很簡單,一個數字化的幀必須儲存在一些儲存器裡。基本上有三種類型的儲存器

  1. 影象採集裝置裡的儲存器

  2. 上位機的儲存器

  3. 主存

    第一個是掛載在儲存裝置主機板上的專用儲存器。這樣的話,影象採集裝置可以直接把獲取的影象儲存在自己的儲存器裡,並且上位機的每一個處理步驟都可以在任何時候獲取到資料。另一方面,它的儲存大小是固定的。而且很小,很難儲存許多張圖片。如果它很大,那麼主機板將會非常的貴。上位機的儲存器是一個被幀抓取裝置驅動動態分配的未分頁系統儲存。因此,儲存大小可以很容易的調整。但是另一方面,如果影象採集裝置頻繁的往上位機儲存裝置裡傳送,這很容易造成資料擁塞。因此,我們通常情況下不使用一些影象採集裝置裡連續抓取影象模式,而是根據需求來抓取影象。主存是使用者分配的在應用的地址空間的某個地方。因為主存是可分頁的,因此在通常情況下從影象採集裝置傳送的影象都會準確的複製到他的儲存區(除非DMA失敗)。

上位機的工作,就是上面提到的那樣,發出命令當需要採集一張新的影象時觸發採集裝置,但是它沒有必要在裝置數字化幀的時候去等待。當使用片上儲存時,很明顯上位機會這樣工作,但是當儲存系統是上位機上的儲存器時,如果要實現上述的功能,很可能就要使用DMA技術。所以上位機唯一要做的事情就是在需要採集影象之前提前一點五幀的時間出發影象採集。這個技術就叫做非同步抓取。在很容易明白這就是可以說是實時抓取,應為我們抓取影象的時間(PAL40毫秒,NTSC33毫秒)比在視訊中兩個幀中間隔時間長很多。

許多的影象採集裝置支援非同步資料傳送。因此,HALCON即提供同步抓取(grab_image)又提供非同步抓取(grab_image_async)。為什麼有非同步抓取了又提供同步抓取,從字面上來理解就是說

grab_image只有當圖片處理結束後才開始抓取。因此,傳送的影象都是最新的。使用非同步抓取模式需要對應用時間上面有所把握。否則抓取的影象也許就已經是過期的影象了。

下面讓我們看一下對於高效的影象採集有用的記憶體管理策略

快取策略(Buffering Strategies)

       讓我們回過頭去看一下實時抓取的問題,假設一個板子支援非同步傳送,那麼它的執行順序可能是下面這種情況:

  1. 觸發一個抓取訊號(抓取控制訊號立即執行)

  2. 等待抓取結束

  3. 觸發下一幀的抓取

  4. 處理步驟2中採集的影象

  5. 返回步驟2

對於上述步驟反映在HALCON程式中就是

while(1)

grab_image_async(Image,-1)

< process Image >

end while

       步驟1和3(開始非同步抓取)不會阻塞程序,當影象採集裝置繁忙時沒有時間會被浪費。唯一存在的問題就是為了抓取影象我們應該怎樣分配記憶體:假設步驟3使影象採集裝置傳送的資料放入專用的記憶體區域而不知道上位機在步驟4中所做的事情,很明顯,影象採集裝置必須使用一個不同於上位機的儲存區域。如果不這樣做的話,裝置也許會寫入上位機正在讀取的記憶體,那麼處理的影象就會被打亂。處理這種問題的最好的方法就是使用兩個可選擇的緩衝區(alternative buffers):一個用來寫入新的資料,另外一個處理以前的資料。這些緩衝區在迴圈開始前也許只被分配一次。在每次迴圈後它們會互換角色(影象採集裝置寫入的緩衝區變成處理讀取緩衝區或者反過來)。當有非同步資料傳送這是一個非常常見的技術我們把它叫做雙緩衝區(double buffering)。以前的影象資料被重寫,我們叫做volatile grabbing。

       這種技術一方面使抓取效能達到最好,另一方面,靈活減少。很明顯,採集過的影象會被一遍一遍的覆蓋。所以“歷史”痕跡都會丟失。但是這個嚴格的組織違背了HALCON的一般哲學即中允許建立任意個數的影象資料並且可以並行處理他們直到你在程式中確定你不再需要他們。因此,一個HALCON幀抓取介面總是應當預設建立一個新的影象物件,並且把volatile grabbing最為一個可選擇的選項。