非同步影像管線的同步化

有關運算子類型與同步的實務指引,請參閱 「運算子類型與同步教學」主題。

相機同步

VisualApplets 的一項強大功能,在於能將來自不同攝影機來源的影像進行合併。 接下來,我們將學習如何

  1. 在攝影機來源之間切換
  2. 將兩台相機的影像疊加在一起
  3. 將攝影機影像進行多工處理
  4. 將兩台相機拍攝的影像拼接起來

在兩台相機之間切換

若要在兩台攝影機之間切換,我們需要一個包含兩個攝影機模組的簡單設計。 在VisualApplets 中,可使用 SourceSelector 運算子(參見「SourceSelector」)在兩個非同步來源之間切換。 此運算子允許選取其中一個輸入,同時忽略其他輸入的資料。 若選取其中一個輸入,其餘輸入的行為將如同連接至「Trash」運算元一般。 在擷取運作期間,仍可切換輸入。該運算元將於新 幀開始時進行切換。 兩個輸入的幀率與影像尺寸無需相同。

VisualApplets 設計用於在兩台相機之間切換

圖 208. 用於在兩台相機之間切換的VisualApplets 設計


結合來自兩個相機來源的影像資料 - 建立重疊混合 (Overlay Blend)

接下來,我們將探討如何將兩台相機的影像資料進行合併。 在本範例中,我們採用「疊加混合」的方式來合併這兩張影像。

本範例的規格如下:

  • 相機:兩台處於基本配置模式的 CameraLink RGB 區域掃描相機
  • 解析度:1024 x 1024 像素
  • 疊加混合:

    方程式 1. 疊加混合


  1. 基本運算子

    我們從設計中的基本運算子開始,如下圖所示。 我們可以使用所有預設參數和連結屬性。

  2. 同步

    接下來,我們需要同步兩台攝影機的資料串流。 這只需使用SYNC 運算子即可輕鬆實現。 SYNC運算子會控制其輸入,以確保輸出完全同步。 如您所見,我們在同步之前使用了兩個緩衝模組。 我們需要使用它們,是因為無法確保兩台攝影機能百分之百同步。

    雖然我們已將影像資料進行同步,但仍需留意一些限制:

    • 兩台相機的幀數(即幀率)必須相同。 若其中一台相機的幀率高於另一台,其中一個 ImageBuffer 模組將需要儲存部分 影像 並可能發生溢出狀況。 因此,在長時間擷取的情況下,兩台攝影機必須以相同的幀率進行幀擷取。 觸發系統可確保此條件成立。

    • 兩台相機的 ROIs 的影像大小與位置可能有所不同。 SYNC運算子會根據其參數設定,自動將較小的影像擴展至較大的影像,或裁切較大的 影像。 更多詳細資訊請參閱SYNC運算子的說明:('SYNC')
  3. 疊加混合

    最後一步是實作疊加混合,以將兩張圖像結合起來。 為方便起見,我們使用階層式方塊來實作疊加混合。

    疊加混合效果必須分別套用至所有色彩成分。 因此,我們需要將連結拆分為全部三種色彩成分。 疊加混合效果再次被放置於層級方塊中。 因此,在當前的層級框內,我們共有三個層級框。 您可以使用「複製」和「貼上」來為每個色彩成分複製相應的框。

    我們可以透過使用VisualApplets 運算子,以多種方式實現上述方程式。 一般而言,在實作方程式之前,應先嘗試針對 FPGA 進行調整與優化。

    該方程式包含一些涉及常數值的乘法與除法。 這些運算在VisualApplets 中雖有提供,但在 FPGA 上卻難以高效實現。 若該乘法或除法能寫成二的冪次乘法,我們便可透過簡單的位元移位來實現。 位元移位完全不需要任何資源! 我們將簡化

    設為

    這只是將位元向右移 7 位元的簡單操作,也就是說,我們捨棄了最低 7 位元。

    接下來,方程式中有一些部分,例如 255 減去 ColorA。 這是簡單的顏色反轉。白色變成深色,深色變成白色。 透過對每個位元進行簡單的反轉,也可以實現數值的反轉。 這使我們最終能夠將方程式改寫為:

    方程式 2. 適用於 FPGA 實現的優化疊加混合方案


    現在我們可以開始進行實作了。 該方程式中其餘的運算,皆可透過VisualApplets 運算子來實現。 我們需要

    • IF

    • 不適用於反轉

    • 向右移位以進行 2^7 除法

    • HWMULT用於乘法運算

      除了HWMULT 之外,VisualApplets 還包含MULT運算子。 兩者的功能相同,但HWMULT會使用 FPGA 中的專用乘法器,因此所需資源將少得多。

    • 由於位元深度有限制,我們需要一個CastBitWidth運算子。 此運算子可用於透過捨棄最高位元(MSB),將位元深度從 9 位元切換為 8 位元。 根據公式可知,值不會大於 255。

  4. 利用模擬進行驗證

    1. 我們可以透過「VisualApplets 」模擬,輕鬆驗證「overflow-blend」的功能。 使用兩個模擬來源,分別為兩台相機注入影像。 將模擬探針放置在您選擇的任何連結上。 模擬結果將顯示兩張影像的疊加效果。 若感興趣,您亦可透過層級方塊查看疊加過程的中間結果。

    2. 無法透過模擬來驗證同步性,因為模擬僅會反映 Applet 的功能性部分,而不會反映時序。 因此必須在硬體上進行驗證。
  5. 新增觸發器

    如前所述,兩台攝影機必須以相同的幀率運作,以避免其中一個緩衝區發生溢出。 這問題可透過觸發系統輕鬆解決。

多工處理兩台相機的影像

在VisualApplets 中,影像或畫面的多工處理非常簡單。 我們將以兩台攝影機的影像多工處理為例, 也就是說,我們希望使用同一個 DMA 通道,交替輸出攝影機 A 和攝影機 B 的影像。

  1. 基本運算子

    我們需要一套標準設計方案,該方案需使用兩個相機模組、兩個緩衝區和一個 DMA 來驅動兩台相機。

  2. 多重影像

    為了對影像進行多工處理,我們使用運算子 `InsertImage`。 此運算子會將其輸入的影像依序傳送出去。 例如,若使用兩個輸入,該運算子將依序傳送輸入 0、1、0、1、0、1、…… 的影像 因此,當一個輸入被處理完畢後,系統便會處理下一個輸入。 因此,兩個輸入的幀數必須相同,也就是說,兩個輸入的 幀率必須一致。

    如您所見,我們將影像緩衝模組放置在插入操作之前。這是因為 `InsertImage ` 運算子本身 並未具備緩衝區。 當輸入 0 的影像被轉發時,輸入 1 會被阻塞,因此必須對攝影機影像進行緩衝,以避免 資料遺失。

    對於每個輸入 (I0, I1, ..),該運算子會提供一個稱為 Ins0、Ins1, ... 的第二個輸入。 此輸入為控制輸入,用於控制圖像應被採用或捨棄。 因此,若 Ins 輸入的值為 0,則該輸入將被跳過;若提供值 1,則該輸入將被採用。 輸入群組 I 和 Ins 必須是同步的,也就是說,它們必須由同一個 M 型運算子透過 任意的 O 型運算子網路來提供。 詳情請參閱「運算子類型」。由於這兩組輸入是同步的,因此它們必須具有相同的影像尺寸。 InsertImage 系統將根據 Ins 輸入端的第一個像素,決定是否使用該影像或將其捨棄。 如前面的螢幕截圖所示,我們僅需使用一個CONST運算子即可啟用影像的使用。 將CONST運算子的輸出連結位元深度設定為 1 位元,並將「Value」參數設定為 1,即可啟用插入功能。

    請注意:若其中一個 Ins 輸入端的值為零,操作員仍需處理此 輸入端的影像。 值為零並不表示無需提供任何影像。若某個輸入端未提供影像,操作員將等待 直到有影像可用為止。

    如前所述,每次僅會開啟其中一個輸入,其餘則被阻塞。 圖片必須以非同步方式讀取,例如從不同的緩衝區中讀取。 在下圖中,您可以看到兩種無法正常運作的配置。 由於小程式會阻塞自身,因此您將無法從小程式中獲得任何結果。這是一種所謂的「死鎖」狀態。

    使用以下設定所產生的死鎖狀況InsertImage

    圖 209. 採用InsertImage


    請務必檢查,當其中一個輸入處於停止狀態時,是否可對其進行緩衝,而另一個輸入則處於活躍狀態。 請注意,死鎖情況無法透過 DRC 或模擬來偵測。 有關死鎖的更多資訊,請參閱「時序同步」。

兩個相機的拼接

在前一節中,我們將兩台攝影機的影像進行多工處理。影像拼接的操作方式幾乎與此相同。 我們改用 InsertLine 運算子,並需要透過 AppendLine 運算子將兩行連續的影像接合起來。

InsertLine 會先將兩個輸入的行進行多工處理,之後我們需要追加兩行。

當然,前兩個範例也可以使用相同的圖像來源。 唯一需要注意的是,在插入之前必須確保有足夠的緩衝區。 若要插入影像,我們需要緩衝整幅影像。 若要複製一行,我們只需緩衝其中一行,同時在另一條路徑上處理同一行。 若僅需緩衝幾行,我們可以使用 ImageFifo 運算子。此運算子不會使用幀擷取卡的 DRAM 記憶體。 取而代之,它使用 FPGA 內建的 BlockRAM 記憶體。 我們將配置 FIFO 以最多儲存一行影像。 在以下範例中,我們複製了一行影像,且複製結果經過反轉處理。 因此,結果為左側為原始影像,右側為反轉(負片)版本。

行重複

圖 210. 線條重複