Operator CxpCameraMultiTap

運算子庫:硬體平台

此運算子代表 CXP 雙抽頭(dual-tap)相機與 VisualApplets 之間的影像資料介面。您可以將此運算子用於單通道、雙通道或四通道 CXP 介面。您可以使用 ConnectionCount 參數來選擇介面類型。無論相機提供何種格式,該運算子都會輸出每個 tap 連接埠的原始影像資料。然後,您需要將此影像資料轉換為相機所傳送的格式。若要轉換影像資料,請使用適當的運算子來進行組合,並將原始位元組值轉型(cast)為像素值。操作過程中的某些特定情況可能會透過如下所述的事件系統進行通訊。此外,該運算子還具備各種用以發送與相機連線狀態信號的參數。

適用於硬體平台
imaFlex CXP-12 Penta
imaFlex CXP-12 Quad

CXP 標準多重抽頭(Multi-Tap)定義

通常,影像像素是從左上角到右下角依序掃描。然而,隨著現代影像感測器上的像素數量持續穩定成長,這種方法已無法產生可接受的幀率。為了解決這個問題,感測器製造商採用同時掃描多個像素的方法。CXP 標準透過引入 taps 的概念來支援此技術。tap 可以被視為一個依序讀取影像像素的掃描裝置。影像的掃描方式被定義為 Tap Geometry,主機從裝置中讀取此幾何形狀。

[注意] Tap 僅適用於垂直掃描

Tap 僅適用於垂直掃描。水平掃描固定由左至右。

CXP 標準建議畫面擷取卡主機應支援 1X-1Y、1X-1Y2 與 1X-2YE 這三種 tap 格式。其中 1X-1Y 格式代表從左上角到右下角逐像素掃描的預設特性,而其他格式則代表下圖中所描繪的兩種 tap 幾來自:

儘管來自每個 tap 的資料被組成獨立的資料流,但請務不過,資料流 ID 與 tap 之間沒有固定的對應關係。不過可以確定的是,此對應關係在擷取過程中保持恆定。The TapG 代碼,因此尋找此對應關係所需的資訊提供在 CXP 影像標頭中,可以在選用的 MetaDataTap0/1 連接埠上讀取。

Tap 格式 TapG 代碼
1X-1Y 0x0000
1X-1Y2, tap 1 0x0004
1X-1Y2, tap 2 0x1004
1X-2YE, tap 1 0x0041
1X-2YE, tap 2 0x1041
[注意] 翻轉影像下半部並非此運算子的職責

若為 1X-2YE tap 格式,翻轉影像下半部並非此 CxpCameraMultiTap 運算子的職責。使用者應用程式需要使用額外的 VisualApplets 運算子來重新格式化 tap(1)。

在 VisualApplets 中進行實例化

運算子在其輸出 tap 上提供影像資料。此輸出隨時存在。單 tap 時為 1,雙 tap 相機則需設定為 2。除了這些標準輸出連接埠之外,您還可以專門為每個 tap 輸出設定選用的 CXP 標頭中繼資料 MetaData 輸出,亦即針對雙 tap 應用程式,您最多可以定義 2 個 MetaDataTap 連接埠。在運算子實例化期間會出現以下彈出對話方塊,並可設定為以下排列組合:

此組態相當於較簡單的 CxpCamera 運算子,僅具有 O 輸出且無中繼資料。

圖 419. 此組態相當於較簡單的 CxpCamera 運算子,僅具有 O 輸出且無中繼資料。


此組態相當於選取了連接埠 O 與 MetaDataO 的較簡單 CxpCamera 運算子。

圖 420. 此組態相當於選取了連接埠 O 與 MetaDataO 的較簡單 CxpCamera 運算子。


在此組態中,僅輸出具有其中繼資料的擷取端點 0。對於擷取端點 1,則僅輸出中繼資料。此組態可用於對相機與擷取卡組合進行偵錯。

圖 421. 在此組態中,僅輸出具有其中繼資料的擷取端點 0。對於擷取端點 1,則僅輸出中繼資料。此組態可用於對相機與擷取卡組合進行偵錯。


在此組態中,運算子在其 Tap0 與 Tap1 連接埠上將兩個相機擷取端點提供為 2 個獨立的資料串流。但是,不會輸出任何中繼資料資訊。

圖 422. 在此組態中,運算子在其 Tap0 與 Tap1 連接埠上將兩個相機擷取端點提供為 2 個獨立的資料串流。但是,不會輸出任何中繼資料資訊。


在此組態中,運算子在其 Tap0 與 Tap1 連接埠上將兩個相機擷取端點提供為 2 個獨立的串流。該運算子還會提供 Tap0 連接埠的中繼資訊。此組態對於對稱的相機擷取端點組態可能很有意義,在這些組態中,除了 <em wg-4="">TapG Code</em> 欄位外,CXP 標頭對於兩個擷取端點在大多數部分都是相同的。

圖 423. 在此組態中,運算子在其 Tap0 與 Tap1 連接埠上將兩個相機擷取端點提供為 2 個獨立的串流。該運算子還會提供 Tap0 連接埠的中繼資訊。此組態對於對稱的相機擷取端點組態可能很有意義,在這些組態中,除了 TapG Code 欄位外,CXP 標頭對於兩個擷取端點在大多數部分都是相同的。


這是運算子的最大組態,其中每個擷取端點都會呈現各自的輸出以及其自己的中繼資料。

圖 424. 這是運算子的最大組態,其中每個擷取端點都會呈現各自的輸出以及其自己的中繼資料。


選擇性 MetaDataTap 連接埠

兩個中繼資料連接埠的格式是相同的。 它在 VisualApplets 中以 32 位元輸出提供,並顯示在下圖中:

每個 CXP 張影格都提供對應的無錯誤影像標頭。對於不正確的影像標頭,不會將任何影像串流資料饋送至 VisualApplets 管線中。壓縮的影像標頭由 6 個字組組成。最後一個位元組用於附加資訊,該資訊僅供內部使用。特別是,HeaderError 位元可用於通知影像標頭本身是否有錯誤。

影像標頭 描述
StreamId CXP 資料流的 ID
標籤 16 位元來源影像索引。對於每個傳輸的影像,此索引會遞增,並在達到 0xFFFF 時循環歸零。包含與相同影像相關之資料的每個串流都應使用相同的編號(在多擷取端點串流的情況下)。
XSize 表示以像素為單位的影像寬度的 24 位元值。
XOff 表示影像相對於完整裝置影像最左側像素之水平位移(以像素為單位)的 24 位元值。
YSize 表示以像素為單位的影像高度的 24 位元值。對於線形掃描影像,此值設為 0。CameraScanMode 參數會永遠顯示從此值讀取的相機類型。如果 Tap0/Tap1 Img Protocol 設定為 VALT_LINE1D,則處理時會忽略 YSize,且運算子會將所有傳入資料輸出為無止盡的線條串流。如果影像協定設定為 VALT_IMAGE2D,則 YSize=0 也會導致無止盡的線條串流。
YOff 表示影像相對於完整裝置影像頂端線條之垂直位移(以像素為單位)的 24 位元值。對於線形掃描影像,此值設為 0。
DSizeL 表示每條影像線之資料字組數的 24 位元值。
PixelF 表示 pixel format 的 16 位元值。
TapG 表示擷取端點幾何形狀的 16 位元值。
旗標 影像旗標。
x 鏡射 (尚未使用)。描述傳入的影像是否進行了 x 軸鏡射處理。
y-Mirror (尚未使用)。描述傳入的影像是否進行了 y 軸鏡射處理。
HeaderError

1:影像標頭發生錯誤,該影格被宣告為遺失。運算子輸出資料串流中不存在對應的影像資料。

0:影像標頭正確,運算子輸出資料串流中存在對應的影像資料。

[重要] Image Protocol: Area and Line Scan Cameras

影像協定對相機運算子輸出有兩種不同的影響:

  • CXP 標頭中的 YSize 值。0 = 線形掃描;>0 = 面陣掃描。

  • 運算子輸出上設定的協定 Tap0/Tap1 Img Protocol:VALT_LINE1D = 線形掃描;VALT_IMAGE2D = 面陣掃描。

CameraScanMode 參數會隨時顯示從 CXP 標頭讀取的相機類型。如果 Tap0/Tap1 Img Protocol 設定為 VALT_LINE1D,則處理時會忽略 YSize,且運算子會將所有傳入資料輸出為無盡的行資料串流。如果影像協定設定為 VALT_IMAGE2D,YSize=0 也會導致無盡的行資料串流,進而產生超出 Tap0/Tap1 Max Img Height 的影像。尺寸過大的影像可能會在設計中接續在 CxpCamera 運算子之後的運算子中造成未定義的行為。為避免這種情況,建議將傳入的行資料串流分割為多個影像,例如使用 SplitImage 運算子。

[重要] 修改 Image Width 與 Image Height

透過輸出連結的最大影像寬度和高度屬性,您可以將寬度和高度調整為相機特定的設定。然而,Tap0/Tap1 運算子連接埠上的最大影像寬度 必須能夠被其連接埠的 Parallelism 整除。因此,請確保最大影像寬度能夠被 Tap0 和 Tap1 連接埠的 Parallelism 整除!

裝置資源使用情況

根據參數 ConnectionCount 的選擇,運算子會使用一個或多個類型為 CameraPort 的資源。對於事件 system,會使用類型為 EventPort 的資源。如果 ConnectionCount 設定為 X4(四通道),將會開啟以下資源對話方塊:

錯誤處理與事件系統

當運算子偵測到接收到的重建影格大於或小於相機在 CXP 影像標頭中所宣告的大小時計數,安全機制將會啟動。隨後,運算子會切斷超出範圍的像素和行,使後續的處理管線一律看到影像標頭中定義的影格尺寸。若接收到的影格尺寸小於影像標頭中指定的尺寸,運算子將會以未定義的資料填滿接收到的影格,以達到影像標頭中所定義的指定影格尺寸。填滿較小的影格可能會導致後續影格遺失。隨後會透過事件將遺失情況回報給執行階段軟體(Framegrabber SDK)(請參閱下列段落)。尺寸不符也會觸發事件。

For a set of very critical errors, the operator will forward asynchronous events to the host runtime software (Framegrabber SDK). The event name in the Framegrabber API is <hierarchical operator name>\CxpStreamStatus, e.g. Device1\Process0\Camera\CxpStreamStatus. The event payload is provided as four 16-bit data words. The event format is defined as follows:

  • 字組 [0]:

    • bits [0:15]:事件發生所在的 CXP 影像標籤。

  • 字組 [1]:

    • bits [8:15]:事件發生所在的串流 ID。

    • bits [0:7]:保留,視為無需理會 (don't care)。

  • 字組 [2]:

    • bit [0]:發生 CRC 錯誤。

    • bit [1]:在影像標頭中偵測到串流標記錯誤。

    • bit [2]:在影像標頭中偵測到無法修正的錯誤。

    • bit [3]:偵測到影格尺寸錯誤,亦即 CXP 影像標頭中定義的影像尺寸與從傳輸封包重建的影格尺寸不符。當相機在影像標頭中寫入一個資訊,但傳輸的資料量卻與標頭中宣告的不同時,就會發生這種情況。

    • bits [4:15]:保留,視為無需理會 (don't care)。

  • 字組 [3]:

    • bit [0]:事件類型,0 = Corrupted Entity,1 = Lost Entity。

      • Corrupted Entity 表示錯誤發生在影格內部,且該影格已經載入至 VisualApplets 管線中。

      • Lost Entity 表示錯誤發生在影格轉發至後續運算子之前,且該影格已被相機運算子捨棄。

      • 當觀察到損壞的實體時,運算子將根據 CXP 影像標頭定義來填滿畫格,以便後續運算子不會導致未定義的行為。在此填滿過程中,可能會到達新畫格並隨之遺失。當攝影機根據畫格標籤發送帶有間距的資料時,也會引發遺失實體事件。

    • bit [1]:發生了類型為 Corrupted Entity 的事件遺失。這表示先前類型為 Corrupted Entity 的事件已遺失。當執行階段軟體未對事件做出反應且內部事件佇列滿載時,就會發生這種情況。

    • bit [2]:發生了類型為 Lost Entity 的事件遺失。這表示先前類型為 Lost Entity 的事件已遺失。當執行階段軟體未對事件做出反應且內部事件佇列滿載時,就會發生這種情況。

    • bits [3:15]:遺失的 Lost Entity 事件數量。

事件分為兩種類型:損壞實體事件和遺失實體事件。word 3 的 bit 0 描述了發生的事件類型。如果事件緩衝區已滿,可能會發生事件遺失的情況。當標記損壞實體的事件遺失時,將設定 word 3 的 bit 1。當標記遺失實體的事件遺失時,將設定 word 3 的 bit 2,並且 bit 3 到 15 將提供指示遺失畫格的遺失事件數量。如果設定了 bit 2 但 Counter 為 0,則表示發生了計數器溢位。

每個事件都會引起軟體中斷。為了減少事件數量,可以將多個具有相同畫格標籤的事件合併在一起。在這種情況下,某些錯誤旗標會被組合。如果事件遺失,遺失事件之前的事件將包含有關該遺失事件的資訊,並且無法與具有相同畫格標籤的其他事件進行合併。

因 CRC 錯誤而引起的事件會回報一個畫格標籤,該標籤可能與發生 CRC 錯誤的畫格不完全相關。畫格標籤可能是前一個或後一個畫格的標籤。這種情況只有在攝影機發送包含 2 個或更多畫格之間過渡的 CXP 封包時才會發生。CRC 計算在封包結束時完成,但串流資料是在即時 (on-the-fly) 重建的。這意味著可能會出現以下情況:在運算子發送前一個畫格之後,才偵測到 CRC 錯誤。在正常情況下(攝影機封包不包含正在進行的畫格結尾和下一個畫格開頭的資料),CRC 錯誤期間的畫格標籤將始終正確。對於所有其他情況,只要完整的畫格串流資料小於 8k 的最大封包大小,每個封包內可能只有 1 個畫格重疊。在這種情況下,軟體應用程式應將帶有畫格標籤 - 1 的前一個畫格以及帶有畫格標籤 + 1 的後一個畫格也視為可能損壞。

[注意] 區分不同 Tap 的錯誤事件

錯誤處理和事件系統對兩個 CXP tap 串流都是通用的。使用 stream-ID 欄位將接收到的事件與適當的 tap 關聯起來。通常,Tap 0 將獲得較低的 stream-ID,通常為 0。Tap 1 將獲得大於 Tap 0 的 stream-ID。

I/O Properties

Property Value
Operator Type M
輸出連結 Tap0/Tap1,影像資料輸出
MetaDataTap0/MetaDataTap1,選擇性後設資料輸出

Supported Link Format

Link Parameter 輸出連線 Tap0/Tap1 輸出連線 MetaDataTap0/MetaDataTap1
Bit Width 8 32
Arithmetic 無號數 無號數
Parallelism auto 1
Kernel Columns 1 1
Kernel Rows 1 1
Img Protocol {VALT_IMAGE2D, VALT_LINE1D} (default: VALT_IMAGE2D)1 {VALT_IMAGE2D, VALT_LINE1D, VALT_PIXEL0D} (default: VALT_IMAGE2D)
Color Format VAF_GRAY VAF_GRAY
Color Flavor FL_NONE FL_NONE
Max. Img Width 任何(預設值:1032) 6
Max. Img Height 任何(預設值:1032) 1

1

如果將 Tap0/Tap1 Img Protocol 設定為 VALT_LINE1D,則在處理時會忽略 CXP 標頭中的 YSize 值,並且運算子會將所有傳入資料輸出為無盡的行串流。如果將影像協定設定為 VALT_IMAGE2D,YSize=0(線型掃描攝影機)也會導致無盡的行串流,從而產生超過 Tap0/Tap1 Max Img Height 的影像。

Parameters

ConnectionCount
Type 靜態寫入參數
Default X1
Range {X1, X2, X4}

參數 ConnectionCount 定義了聚合到 CXP 連線的 CXP 通道數。所使用連接埠的索引由 CameraPort 類型的資源處理。連接埠資源的數量與連線數相符(例如 X2:兩個 CameraPort 資源項目)。

當您實例化多個 CxpCamera 運算子(例如用於雙攝影機 Applet)時,如果使用多個具有相同索引的資源,或者消耗的 CameraPort 資源數量超過最大值 4,則可能會發生資源衝突。在這種情況下,設計規則檢查會回報錯誤。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 均通用,即 ConnectionCount 參數計算的是跨兩個 tap 串流所使用的連接埠。

ResetStatus
Type 動態寫入參數
Default 關閉
Range {Off, On}

參數 ResetStatus 會重設攝影機統計資料,即錯誤計數器。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 均通用,即 ResetStatus 參數會重設跨兩個 tap 串流的攝影機統計資料。

UsedConnections
Type 動態讀取參數
Default
Range {1,2,4}

參數 UsedConnections 顯示了執行階段由探索軟體設定的 CXP 通道數量。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 均通用,即 UsedConnections 參數代表跨兩個 tap 串流設定的連接埠。

PacketTagErrorCount
Type 動態讀取參數
Default
Range [0 : 8191]

參數 PacketTagErrorCount 用於顯示有多少接收到的封包其標籤不符合 CXP 標準所預期的標籤。具體而言,當後續串流封包標籤列舉中出現間隙時,此數值會向上遞增。此參數為 13 位元寬,其中位元 [11:0] 代表實際的 Counter 值,而位元 [12] 代表 Counter 溢位。當溢位位元設為 1 時,該 Counter 值應視為無效(don't care)。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 都是共用的,亦即 PacketTagErrorCount 參數會計算兩個 Tap 串流中標籤不符預期的封包數量。

ImageTagErrorCount
Type 動態讀取參數
Default
Range [0 : 8191]

此參數用於計算影像標頭標籤、CXP 標準預期的標籤以及接收到的標籤之間發生多少次不匹配。此參數為 13 位元寬,其中位元 [11:0] 代表實際的 Counter 值,而位元 [12] 代表 Counter 溢位。當溢位位元設為 1 時,該 Counter 值應視為無效(don't care)。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 都是共用的,亦即 ImageTagErrorCount 參數會計算兩個 Tap 串流中的標籤不匹配情況。

StreamIdErrorCount
Type 動態讀取參數
Default
Range [0 : 8191]

此參數用於計算串流封包中接收到的串流 ID 值與影像標頭中指定的串流 ID 值發生不匹配的頻率。此參數為 13 位元寬,其中位元 [11:0] 代表實際的 Counter 值,而位元 [12] 代表 Counter 溢位。當溢位位元設為 1 時,該 Counter 值應視為無效(don't care)。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 都是共用的,亦即 StreamIdErrorCount 參數會計算兩個 Tap 串流中的串流 ID。

CorrectedErrorCount
Type 動態讀取參數
Default
Range [0 : 8191]

此參數用於計算影像標頭或行標記中偵測到了多少個已修正的錯誤。此參數為 13 位元寬,其中位元 [11:0] 代表實際的 Counter 值,而位元 [12] 代表 Counter 溢位。當溢位位元設為 1 時,該 Counter 值應視為無效(don't care)。

UncorrectedErrorCount
Type 動態讀取參數
Default
Range [0 : 8191]

此參數用於計算影像標頭或行標記中偵測到的錯誤有多少個因為同一個位元組中有多個位元錯誤而無法修正。此參數為 13 位元寬,其中位元 [11:0] 代表實際的 Counter 值,而位元 [12] 代表 Counter 溢位。當溢位位元設為 1 時,該 Counter 值應視為無效(don't care)。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 都是共用的,亦即錯誤監控參數代表兩個 Tap 串流中相應錯誤類型的總和。

PacketBufferOverflowCount
Type 動態讀取參數
Default
Range [0 : 8191]

此參數用於計算在聚合模式(aggregated mode)下進行通道分集(channel bonding)時發生封包緩衝區溢位的頻率。此參數僅適用於 ConnectionCount = X2 或 X4 的情況。此參數為 13 位元寬,其中位元 [11:0] 代表實際的 Counter 值,而位元 [12] 代表 Counter 溢位。當溢位位元設為 1 時,該 Counter 值應視為無效(don't care)。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 都是共用的,亦即 PacketBufferOverflowCount 參數會計算兩個 Tap 串流中的封包緩衝區溢位次數。

PacketBufferOverflowSource
Type 動態讀取參數
Default
Range [0x0 : 0xf]

此參數實作了一個位元遮罩(bit mask),用於查詢封包緩衝區溢位發生在 4 個潛在 CXP 通道中的哪一個。參數寬度取決於 ConnectionCount 參數。在 X1 模式下,參數寬度為 1 位元;在 X2 模式下,參數寬度為 2 位元;而在 X4 模式下,參數寬度為 4 位元。順序為:LSB = 最低 CXP 通道編號,MSB = 操作員配置的最高 CXP 通道編號。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 都是共用的,亦即 PacketBufferOverflowSource 參數會搜尋兩個 Tap 串流中的溢位。

CameraScanMode
Type 動態讀取參數
Default
Range {area,line}

接收到的影像標頭帶有相關資訊,指出串流是用於面陣掃描(area scan)(YSize > 0)還是線陣掃描(line scan)(YSize = 0)應用。此參數顯示最後一次有效接收到的串流影像標頭資訊。

此參數僅針對 Tap0 串流進行讀取,前提是假設 Tap1 串流處於完全相同的模式。這意味著此參數適用於整台相機的面陣掃描或線陣掃描,因此對兩個 Tap 而言是相同的,並非 Tap 專屬。

MarkerErrorCount
Type 動態讀取參數
Default
Range [0 : 8191]

此參數用於計算 CXP 串流標記與標頭或行標記的順序不正確的頻率。此參數為 13 位元寬,其中位元 [11:0] 代表實際的 Counter 值,而位元 [12] 代表 Counter 溢位。當溢位位元設為 1 時,該 Counter 值應視為無效(don't care)。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 都是共用的,亦即錯誤監控參數代表兩個 Tap 串流中相應錯誤類型的總和。

UnexpectedStartupData
Type 動態讀取參數
Default
Range {false, true}

此參數用於偵測錯誤情況:在操作員重設後的第一個資料值是不預期的(即先前未收到任何影像標頭)。這種情況可能是由於相機、擷取卡韌體實作有誤,或是探索程序(discovery procedure)的軟體控制不當所造成。此外,相機的硬體缺陷理論上也可能導致這種情況。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個 Tap 都是共用的,亦即錯誤監控參數代表兩個 Tap 串流中相應錯誤類型的總和。

FrameLostCount
Type 動態讀取參數
Default
Range [0 : 33554431]

此參數用於計算在擷取期間遺失且未傳送至 VisualApplets 管線的影格。當偵測到影像標頭發生錯誤,或某個影格與另一個影格重疊時,就會遺失影格。此參數為 25 位元寬,其中第 [23:0] 位元表示實際的 Counter 值,而第 [24] 位元代表 Counter 溢位。當設定溢位位元時,Counter 值應視為無關 (don't care)。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個分接 (tap) 都是共用的,亦即 FrameLostCount 參數會計算兩個分接資料流中遺失的影格。

FrameCorruptedCount
Type 動態讀取參數
Default
Range [0 : 33554431]

此參數用於計算擷取期間損毀的影格。損毀的影格是指包含錯誤像素並傳送至 VisualApplets 管線的影格。此參數為 25 位元寬,其中第 [23:0] 位元表示實際的 Counter 值,而第 [24] 位元代表 Counter 溢位。當設定溢位位元時,Counter 值應視為無關 (don't care)。

[注意] 所有參數對兩個 Tap 均通用

所有參數對兩個分接都是共用的,亦即 FrameCorruptedCount 參數會計算兩個分接資料流中損毀的影格。

Examples of Use

以下範例顯示了 CxpCameraMultiTap 運算子的使用方式: