跳至內容

應用說明:Blob Analysis#

本應用筆記說明了 VisualApplets Blob Analysis 設計。

您將學習如何在 VisualApplets 中結合使用 Blob Analysis operator 與其他 operator。這些範例使用 Blob Analysis operator 在 FPGA 內部進行基本的 Object Detection 與分類。行 applet 展示了 Blob Analysis 1D operator 的使用。此外,亦提供適用於給定範例的 C++ SDK 專案,有助於理解如何在 PC 端解讀 Blob Analysis 結果。(應用筆記 SAN011)

以下設計範例說明了 VisualApplets Blob Analysis operator 的使用方式:

  • 包含物件視覺化 SDK 專案的簡單 Blob Analysis 應用程式:此範例使用 Blob Analysis 進行基本的 Object Detection。所有檢測到的物件都會傳輸到主機 PC。
  • 使用 Blob Analysis 進行分類與 ROI 選擇:此範例展示了在 FPGA 內部使用 Blob Analysis 進行 Object Detection 與分類。
  • Blob Analysis 1D:此範例說明如何將 Blob Analysis 1D operator 用於無縫線形掃描影像。

包含物件視覺化 SDK 專案的 Simple Blob Analysis 應用程式#

第一個範例是一個基本的 Blob Analysis applet。相機影像會被二值化。接著,二值化影像會傳送至路徑中的 DMA,而在另一條路徑上則會執行 Blob Analysis,並透過第二個 DMA 通道輸出結果。

圖 1:適用於簡單 Blob Analysis 應用程式的 VisualApplets 設計

此範例中使用的二值化是基於簡單的閾值處理。Blob Analysis 假設每個白色像素都是物件像素。圖 2 顯示了使用兩個閾值來選擇前景值範圍。這允許使用以黑色像素形成物件的影像,或物件與背景對比更亮的影像。二值化完成後,影像會進行緩存。影像從緩存傳送到 Blob Analysis,並傳輸到主機 PC 以監控二值化影像。

圖 2:二值化 (Binarization)

Blob Analysis 參數的配置可見於下圖:

圖 3:Simple Blob2D Applet 的 Blob Analysis 參數
圖 4:將 Blob 資料流合併為適用於 Blob2D Applet 的單一 Link

在上圖中,您可以看到 Blob Analysis 資料是如何合併到單一 link 中的。在此範例中,特徵 Bounding Box 和 Area 已使用。首先,將各 16Bits 的 bounding box links 合併在一起,從而產生 64 Bits 的 link width。該區域也擴展至 64Bits。使用 InsertPixel 運算子,將兩個 links 合併在一起。因此,產生的 DMA 傳輸將具有以下格式:

適用於 Simple Blob2D Applet 的 Blob DMA Byte Order#

Byte No. Object Feature
0 至 1 Bounding Box X0
2 至 3 Bounding Box X1
4 至 5 Bounding Box Y0
6 至 7 Bounding Box Y1
8 至 15 面積

請注意 PC 中不同的位元組順序。物件特徵的 bit widths 已擴展。實際上,Bounding Box 僅使用 10Bits 來表示 0 和 1023 之間的值,而 Area 僅使用 21Bits。此 Applet 附帶一個小型 SDK C++ 專案以展示其功能。它與設計檔案一同位於資料夾中 Examples\Processing\BlobAnalysis\Blob2D 位於 VisualApplets 安裝路徑中。

使用 Blob Analysis 進行分類和 ROI 選擇#

此範例展示了一種根據萃取出的物件特徵來裁剪感興趣區域 (ROI) 的方法。其目的是尋找具有最大面積的物件,並萃取出該物件用來形成 ROI 的重心。

此範例展示了 VisualApplets 能夠利用 Blob Analysis 結果在 Applet 內部進行分類的能力,從而顯著增強影象處理在擷取卡內的功能。圖 1 顯示了該設計的螢幕擷取畫面。主要部分包括二值化、Blob Analysis、分類以及 ROI 裁剪。這些部分將在後文中進行詳細說明。

圖 1:用於 ROI 選擇的 Blob Analysis 設計

此範例中使用的二值化是基於簡單的閾值處理。Blob Analysis 假設每個白色像素都是物件像素。圖 2 顯示了使用兩個閾值來選擇前景值範圍。這允許使用以黑色像素形成物件的影像,或物件與背景對比更亮的影像。二值化完成後,影像會進行緩存。影像從緩存傳送到 Blob Analysis,並傳輸到主機 PC 以監控二值化影像。

圖 2:二值化 (Binarization)

Blob Analysis 是在二值化之後執行的。在此,僅使用 x 和 y 方向的重心以及面積等物件特徵進行後續處理。在此範例中不使用所有其他特徵。

接著,Applet 會對 Blob Analysis 結果進行分類(圖 3)。首先,透過將重心值除以面積來對其進行標準化。這只需使用 DIV 運算子即可完成。同時,執行具有最大面積物件的檢測。在此,運算子 FrameMax 和暫存器 (Registers) 被使用。分類演算法的概念是抑制面積小於目前已調查物件的每一個物件。具體而言,Blob Analysis 會輸出一個物件串流。該 FrameMax 運算子用於檢測當前物件是否大於目前已調查過的物件,並在其輸出端輸出邏輯 1 IsMax。此值用於 Capture 暫存器的輸入端。如果當前物件大於先前的物件,則重心座標會被鎖存到輸出端。因此,影象的最後一個輸出(即 blob 串流)代表具有最大面積物件的重心座標。圖 3 說明了此行為。

圖 3:尋找具備最大面積的物件
表:尋找具備最大面積物件的演算法範例

分類模組現在輸出影象中找到的最大物件的重心座標。接下來,必須將座標轉換為 ROI 座標 XOffset, XLength, YOffset 和 YLength。圖 4 顯示了此轉換的設計。該 XLength 和 YLength 被設為常數,而重心座標則減去 ROI 大小的一半。

圖 4:ROI 座標的產生

現在使用四個 ROI 值,透過 DynamicROI 運算子從原始影象中裁剪出 ROI。如前所述,分類模組在影象的最後一個值中輸出具有最大面積的物件。這是很有利的,因為 DynamicROI 運算子僅考慮接收到的最後一個 ROI 座標。因此,使用了正確的座標,並且從原始影象中裁剪出了最大的物件。此 VisualApplets 專案的設計檔案可以在資料夾中找到 Examples\Processing\BlobAnalysis\Blob2D_ROI_select 位於 VisualApplets 安裝路徑中。該 Applet 可以在 microDisplay 中執行,並且可以直接看到結果。此外,範例中還新增了一個小型 SDK 專案。若要使用 SDK 專案,必須將 ROI 的 DMA 大小變更為由模組設定的 DMA 大小 ROIsizeX 和 ROIsizeY。使用 顯示 microDisplay 中的設定或 widht1 和 height1 SDK 專案中的引數來執行調整。

Blob Analysis 1D#

Blob Analysis 1D 範例說明了如何在 VisualApplets 環境中使用 1D blob 運算子。

1D Blob Analysis 範例是一個基於線型相機的簡單小程式(applet)。此相機僅搭配行觸發(line trigger)使用。因此,該小程式是基於真實的 1D 影像。為了進行 DMA 傳輸,原始影像會被轉換成由連續行組成的小片段,進而形成 2D 影像。小程式的所有部分將在後文中詳細說明。圖 1 顯示了設計的主要工作表。

圖 1:Blob Analysis 1D 設計

為了進行擷取,連接至 ImageBuffer 的線型相機運算子會被使用。此緩衝區允許對 1D 影像行進行緩衝。接下來,在階層式方塊(Hierarchical Box) Binarize 中會執行簡單的閾值處理,將像素轉換為前景和背景像素。選擇器允許將原始影像和二元影像切換至影像輸出路徑。這只需透過一個 IF 運算子和一個 CONST 運算子即可完成。該 dynamic 運算子的 CONST 參數允許修改 IF 運算子的條件輸入,以切換其輸入。因此,在執行階段期間,可以在原始灰階影像和二元化影像之間進行切換。

圖 2:灰階與二元影像之間的切換

由於該小程式的應用目的是視覺化在原始影像中找到的物件,因此需要在 PC 中同步兩個 DMA 通道。行標記(line marker)用於標記原始影像的每一行以及每一個 blob。因此,會使用一個 Counter 來計算每一行。行 Counter 包含在階層式方塊 1DBlobAnalysis 中,與 blob 分析運算子一起運作,且行計數值透過上方連結 O000 離開方塊。該 Counter 的範圍為 10 位元。因此,當達到值 1024 時會發生溢位(overflow),且 Counter 會從零重新開始。

在 ReplaceFirstPixelByLineNo 一行的前四個像素會被行號取代。為此,Parallelism 會被更改,以便以 32 位元的粒度執行操作。x 座標即為計數,且每當 x 座標為零時,就會轉發行號(擴展為 32 位元)而不是原始像素值。

圖 3:以行號取代開頭像素

除了行標記之外,還需要為 Blob Analysis 操作產生清除(flush)條件。清除可以實作為觸發輸入,或者在此情況下,每行會產生一次清除條件。因此,Blob Analysis 將會在每行完成(Eof)其輸出。然而,唯有在使用參數 supres_empty_output_frames且輸出畫面不為空的情況下,Blob Analysis 才會被設定為此行為。此外,Blob Analysis 被設定為最大物件高度為 10 位元,即 1024 個像素。該運算子的最大輸出畫面大小設定為 20。如果必須輸出更多物件且未發生清除條件,運算子將產生一個新畫面。這些小的輸出畫面可以將偵測到物件的時間以及在 PC 中分析該物件的時間降至最低。

圖 4:Line Counting 和 Blob Analysis
圖 5:Blob 1D 範例組態參數

11 個 Blob Analysis 輸出串流會合併為一個連接至 DMA 的串流。這只需使用 MergePixel 和 InsertPixel 運算子即可完成。物件特徵的順序如下表所示。

圖 6:將 Blob Streams 合併為 Blob1D Applet 的單一 Link
Byte No. Object Feature
0 至 3 Line Marker
4 至 5 Bounding Box X0
6 至 7 Bounding Box X1
8 至 11 Center of Gravity Y
12 至 15 Center of Gravity Y
16 至 17 Bounding Box Y0
18 至 19 Bounding Box Y1
20 至 23 面積
24 至 25 Contour Length Diagonal
26 至 27 Contour Length Orthogonal
28 至 31 Error Flags

此專案在硬體中的執行需要搭配線型相機和觸發編碼器系統的特殊硬體設定。設計檔案可以在 Examples\Processing\BlobAnalysis\Blob1D 資料夾中的 VisualApplets 安裝路徑下找到。設計中加入了一個複雜的 SDK 專案,主要用於展示物件的顯示。