有關運算子類型與同步處理的實用指導,請參閱Operator Types and Synchronization教學主題。
VisualApplets 的一項強大功能是能夠結合來自不同相機來源的影像。 在接下來的內容中,我們將學習如何
- 在相機來源之間切換
- 疊加兩台相機的影像
- 對相機影像進行多工處理
- 拼接兩台相機的影像
要在兩台相機之間進行切換,我們需要一個包含兩個相機模組的簡單設計。 在 VisualApplets 中,可以使用 SourceSelector 運算子(請參閱 'SourceSelector')在兩個非同步來源之間進行切換。 此運算子允許選擇其中一個輸入,同時丟棄其他輸入上的資料。 如果選擇其中一個輸入,其他輸入的運作方式將如同連接到 Trash 運算子一樣。 您可以在擷取執行時切換輸入。該運算子將在新的影格開始時進行切換。 兩個輸入的影格率和影像大小不需要相同。
接下來,我們將探討如何結合這兩台相機的影像資料。 在我們的範例中,我們使用覆疊混合(overlay-blend)來結合這兩張影像。
我們範例的規格如下:
-
基本運算子
我們從設計中的基本運算子開始,如下圖所示。 我們可以使用所有預設參數和 Property。
-
同步化
接下來,我們需要同步兩台相機的資料串流。 這可以透過使用 SYNC 運算子來輕鬆完成。 SYNC 運算子會控制其輸入,使輸出完全同步。 如您所見,我們在同步之前使用了兩個緩衝區模組。 我們必須使用它們,因為我們無法確保兩台相機是 100% 同步的。
儘管我們已經同步了影像資料,但我們仍需注意一些限制:
-
兩台相機的影格數(即影格率)必須相同。 如果其中一台相機的影格率高於另一台相機,其中一個 ImageBuffer 模組將需要儲存一些影像 並可能會進入溢位(overflow)狀態。 因此,對於長時間擷取,兩台相機必須使用相同的影格率來擷取影格。 觸發系統可以確保這一點。
- 兩台相機 ROI 的影像大小和影像位置可能會不同。 SYNC 運算子將根據其參數化設定,自動將較小的影像擴展到較大的影像或裁剪較大的影像。 請參閱 SYNC 運算子的說明以取得更多詳細資訊:('SYNC')
-
-
覆疊混合
最後一步是實作覆疊混合以結合這兩張影像。 為了方便起見,我們使用階層方塊(hierarchical box)來實作覆疊混合。
覆疊混合必須分別套用到所有色彩分量。 因此,我們需要將連結分割為所有三個色彩分量。 覆疊混合再次被放置在階層方塊中。 因此,我們在當前的階層方塊內擁有三個階層方塊。 您可以使用複製和貼上功能來複製每個色彩分量的方塊。
我們將有多種不同的可能性來使用 VisualApplets 運算子實現上述方程式。 一般來說,在實作方程式之前,您應該始終嘗試針對 FPGA 的使用來調整和最佳化方程式。
該方程式包含一些與常數值的乘法和除法運算。 這些運算在 VisualApplets 中可用,但在 FPGA 上實作時效率不高。 如果乘法或除法可以寫成 2 的冪次方乘法,我們就可以使用簡單的位元移位(bit shift)來實作。 位元移位將完全不需要任何資源! 我們將簡化

設定為

也就是對 7 個位元進行簡單的右移,即我們捨棄最低的 7 個位元。

接下來,方程式中有些部分例如 255 減去 ColorA。 這是一種簡單的色彩反相。白色變為暗色,暗色變為白色。 數值的反相也可以透過對每個位元進行簡單的反相來完成。 這讓我們最終可以將方程式改寫為:
我們現在可以開始進行實作。 方程式中的其餘運算可作為 VisualApplets 運算子使用。 我們將需要
-
IF
-
用於反相的 NOT
-
用於除以 2^7 的 ShiftRight
-
用於乘法的 HWMULT
除了 HWMULT 之外,VisualApplets 還包含 MULT 運算子。 它們的作用相同,但 HWMULT 會使用 FPGA 中的專用乘法器,因此需要的資源少得多。
-
對於位元深度限制,我們將需要一個 CastBitWidth 運算子。 此運算子可用於透過捨棄 MSB 從 9 位元切換至 8 位元。 從公式中我們知道不會有大於 255 的數值。
-
-
使用模擬進行驗證
-
我們可以使用 VisualApplets 模擬輕鬆驗證溢位混色功能。 使用兩個模擬來源為兩個相機注入影像。 將模擬探棒放置在您喜歡的任何鏈結上。 模擬結果將向您顯示兩個影像的重疊。 如果感興趣,您也可以檢查階層式方塊中重疊的中間結果。

- 無法使用模擬來驗證同步,因為模擬只會反映小程式的功能部分,而不會反映時序。 需要在硬體中進行驗證。
-
-
新增觸發
如前所述,兩個相機必須以相同的幀率運行,以避免其中一個緩衝區發生溢位。 使用觸發系統可以輕鬆解決此問題。
在 VisualApplets 中對影像或行進行多工處理非常簡單。 我們將從兩個相機的影像多工處理範例開始, 也就是說,我們想要使用相同的 DMA 通道來交替輸出相機 A 和相機 B 的影像。
-
基本運算子
我們將需要使用兩個相機模組、兩個緩衝區和一个 DMA 的兩個相機標準設計。

-
多工影像
為了對影像進行多工處理,我們使用 InsertImage 運算子。 此運算子將依序轉發其輸入的影像。 例如,如果我們使用兩個輸入,運算子將轉發輸入 0、1、0、1、0、1、... 的影像。 因此,在處理完一個輸入後,將使用下一個輸入。 因此,要求兩個輸入處的影格數相同,即輸入將具有相同的幀率。

如您所見,我們將影像緩衝區模組放置在插入作業之前。這是因為 InsertImage 運算子本身沒有緩衝區。 在轉發輸入 0 的影像時,輸入 1 會被封鎖,因此需要緩衝相機影像以避免資料遺失。
對於每個輸入(I0、I1、…),運算子提供了一個稱為 Ins0、Ins1、… 的第二個輸入。 此輸入是用於控制是否應使用或捨棄影像的控制輸入。 因此,如果 Ins 輸入處的值為 0,則可以跳過輸入,如果提供值 1,則會使用該輸入。 輸入群組 I 和 Ins 必須是同步的,即它們必須透過任意的 O 型運算子網路來自相同的 M 型運算子來源。 請參閱 'Operator Types' 以取得更多資訊。由於兩個輸入是同步的,因此它們需要具有相同的影像尺寸。 InsertImage 將使用 Ins 輸入上的第一個像素來決定是使用還是捨棄影像。 正如您在先前的螢幕擷取畫面中所見,我們只是使用 CONST 運算子來啟用影像的使用。 將 CONST 運算子的輸出鏈結位元深度設為 1 位元,並將參數「Value」設為 1 以啟用插入。
請注意:如果其中一個 Ins 輸入處的值為零,運算子仍需處理此輸入上的影像。 值為零並不表示不需要提供影像。如果在某個輸入處未提供影像,則運算子會一直等待,直到影像可用為止。
如前所述,一次一律開啟其中一個輸入,同時封鎖其他輸入。 影像必須非同步提供來源,例如從不同的緩衝區。 在下圖中,您可以看到兩個無法運作的組態。 您將不會從小程式獲得任何結果,因為它正在自我封鎖。這就是所謂的「死結」狀況。
當其中一個輸入處於作用中狀態時,請一律檢查另一個輸入是否可以在停止時進行緩衝。 請勿忘記,DRC 和模擬都無法偵測到死結情況。 有關死結的更多資訊,可以在 'Timing Synchronization' 中找到。
在上一節中,我們多工處理了兩個相機的影像。拼接的作法也幾乎相同。 我們改用 InsertLine 運算子,並需要使用 AppendLine 運算子附加兩個連續的行。

InsertLine 首先會將兩個輸入的行進行多工處理,之後我們需要附加兩個行。
當然,在最後兩個範例中,使用相同的影像來源也是可行的。 我們唯一需要注意的是,在插入之前必須具備足夠的緩衝區。 若要插入影像,我們需要緩衝完整的影像。 若要複製行,我們只需要緩衝其中一行,同時在另一個路徑上處理相同的行。 若只需要緩衝幾行,我們可以使用 ImageFifo 運算子。此運算子不會使用擷取卡的 DRAM Memory。 取而代之的是,它會使用 FPGA 內部的 BlockRAM Memory。 我們將會把 FIFO 設定為最多儲存一行。 在以下範例中,我們複製了影像行,並且該複製是反向的。 因此我們的結果是左側為原始影像,右側為反向(負片)版本。






上一頁

