硬體 Applet:從構想至應用

在本應用說明中,您將學習如何在VisualApplets 中設計與建立影像處理 應用程式(即 Applet),以及如何在幀擷取卡上使用它。您還將 學習如何在執行期間透過 microDisplay 和Framegrabber API 使用此 Applet,以及 如何在該軟體中設定 Applet 的參數。 您可於以下連結找到有關如何 在 microDisplay 中設計、建置及於執行期間使用小程式的介紹: 《入門指南》中。在本應用說明中,您將透過索貝爾邊緣濾波器應用的範例, 了解上述 Applet 開發與使用的各個階段。 若需更簡短的指引,請參閱 《從空白設計到執行 Applet的教學指南》主題。

Workflow Description

工作流程如下:

  1. 在VisualApplets 中設計一個 Applet。

  2. 在VisualApplets 中模擬該小程式,並執行設計規則檢查 (DRC)。

  3. 建立小程式。

  4. 針對 mE5 平台:刷寫小程式。

  5. 透過 microDisplay 或Framegrabber API 在硬體上使用該小程式。

在 VisualApplets 中設計 Applet

建立新專案

Applet 的設計階段是在VisualApplets 進行的。要開啟VisualApplets , 請點擊該檔案 VisualApplets.exe 表格中顯示 bin 位於「VisualApplets 」安裝目錄中的資料夾,或 位於「Windows 」開始功能表中的「VisualApplets 」程式圖示,或是您 桌面上的圖示。

  1. 起初,VisualApplets 的主視窗開啟時,並未載入任何專案 。

    VisualApplets 主視窗

    圖 186.VisualApplets 主視窗


  2. 點擊 「檔案」+「新增」(Ctrl+N) 或使用 「新增」 圖示,位於 檔案 圖示列中的「新增」 「新建專案」 視窗,讓您指定專案名稱、目標硬體 平台以及目標執行環境。您日後隨時可以變更這些設定 。

  3. 若要依照此處的範例操作,請使用以下設定:

    專案名稱:Sobel_Filter

    硬體平台:microEnable 5marathon VCL

    目標執行環境:Win 64(Windows /AMD64)

  4. 請點擊以下按鈕以確認您的設定 「確定」。

    「新專案」視窗

    圖 187. 「新專案」視窗


VisualApplets 現在開始一個新專案,您會看到一個空白的设计視窗位於 程式視窗的中央。在 「專案資訊」 標籤頁的 右側,會顯示有關當前專案的資訊,例如專案名稱、目標 硬體、目標平台等。

Operators and Links

在VisualApplets 中,影像處理操作由運算子來表示。您 可以在 運算子庫VisualApplets 中 。您可以透過拖放功能, 非常輕鬆地將運算子放置到設計視窗中。

設計中運算子的實例稱為 模組。 運算子可以具有輸入和輸出埠。設計中的運算子(即模組)可 透過這些埠進行連接。模組之間的連接稱為連結, 在設計視窗中以箭頭表示。這些模組和連結代表 影像(或訊號)處理管線。因此,運算順序 由模組的順序決定。

各運算子與連結皆具有屬性,用以描述與 當前影像處理流程相關的設定,例如影像尺寸。若要檢視及編輯這些 屬性,請雙擊運算子。關於運算子的屬性, 詳見運算子文件中的 「說明」下的操作員文件中。

操作員文件位於VisualApplets

圖 188. 操作員文件位於VisualApplets


設計實作

此範例實作了一種索貝爾邊緣濾波器 演算法。

在VisualApplets 設計範例庫中,提供適用於 邊緣濾波及後續影像處理應用的「即用型」範例。您可以在以下位置找到這些設計 範例: Examples\Processing 位於您的VisualApplets 安裝目錄中,並附有相應的文件,詳見 Processing Examples. 您可以將這些範例設計作為您自己 應用程式的基礎。

要實作此索貝爾濾波器設計範例,請在 運算子庫中,將它們拖曳至設計畫面中,並依照 「入門指南」 章節中的說明,使用連結線將其連接起來。

您可以稍後重新命名這些模組,以便在設計階段獲得更清晰的概覽,並 在執行階段更有效地使用它們。

只要有幫助,請使用 HierarchicalBoxes 來建構設計,以便獲得更佳的設計 全貌。

另外,別忘了不時儲存設計。

Design Components

本應用說明中的樣品設計包含以下元件,如 下圖所示:

設計實作範例 Sobel_Filter.va

圖 189. 設計實作範例 Sobel_Filter.va


  • Camera Link 灰階攝影機介面

  • 影像緩衝區

  • 具備 x 軸與 y 軸方向邊緣濾波功能的索貝爾邊緣濾波模組 (基於範例 SobelMultiGradient.vad 在……之下 Examples\Processing\Filter\EdgeDetection\Sobel_Multi_Gradient (位於VisualApplets 的安裝目錄中)

  • 可調整的二值化閾值與縮放運算子,用以在執行期間於顯示器上更佳地 呈現二值化影像

  • DMA 至 PC。

您可以在設計中將CoefficientBuffer用作 影像的模擬來源,以取代由相機擷取的影像。透過 SourceSelector運算子,您可以在VisualApplets 中以及執行期間,為處理管線選擇 影像輸入來源。

Parameter Settings

若要為運算子與連結設定參數,您可以透過雙擊每個 元件來編輯其參數。

Link Parameters

連結具有若干屬性,這些屬性定義了經處理影像的特性, 例如最大影像尺寸、影像協定、位元寬度,以及一項 與最大可用頻寬相關的參數:並行度 (即在一個設計時鐘週期內傳輸的像素數量)。 若這些連結 已連接至特定運算子(請參閱對應的運算子文件), 例如相機介面運算子,您即可根據需求 編輯並調整這些屬性。

您選擇的最大影像尺寸和並行度越高, FPGA 資源消耗就越大。因此,Basler 建議僅將 這些數值設定為必要範圍內,以節省 FPGA 資源。連結 屬性僅能在設計階段於VisualApplets 中進行變更。

Link Properties

圖 190. 連結屬性


Operator Properties

運算子屬性有兩種類型: 靜態 與 動態。您僅能在 設計階段於VisualApplets 中變更靜態參數,而動態參數則可在 設計階段及執行階段進行變更。請參閱下方的螢幕截圖,其中展示了運算子 IS_GreaterThan 的靜態 與動態參數範例。

靜態與動態運算子參數

圖 191. 靜態與動態運算子參數


在此範例設計中,請設定以下參數:

運算子IS_GreaterThan:

將「Number」參數設定為 600。

此參數用於識別邊緣的灰階值。若要找出 邊緣的灰階值,請在 IS_GreaterThan運算子之前設定一個模擬探針,執行 模擬,並放大檢視包含邊緣的像素,以觀察 其灰階值為何。此為動態參數,您 可在執行期間進行調整。

運算子SCALE:

將參數ScaleFactor設定為 255。

此設定可增強邊緣的可見度。這是一個動態 參數。不過,為了節省 FPGA 資源,您可以將此 參數設定為「靜態」。

執行階段參數存取準備

在執行期間,您可以變更動態參數。一個常見的應用情境是 當設計中包含許多運算子,而您需要針對設計中 許多不同的運算子變更相同的 參數(例如影像尺寸)。

圖書館 Parameters 提供了一系列運算子,可讓使用者 僅需控制一個 參數,即可存取設計中不同的模組參數。此外,這些運算子還可讓存取參數 顯示在特定的層級上。這些選項使參數 在執行期間的配置更加簡便。範例設計 Sobel_Filter.va (請參閱 圖 189,「設計實作範例」 Sobel_Filter.va') 透過 translate 和 reference 參數,可輕鬆取得影像的寬度與高度、影像來源 選擇器、閾值以及在層級結構中的縮放係數 Parameters. 為此,請建立一個空的 HierarchicalBox, 並將其命名為 Parameters 並設定 DisplayHierarchy 將對應的 平移參數和參考參數設定為 Parameters. 您可以在這裡找到 關於該項目的詳細文件: Parameters 該 相關文件中的函式庫,請參閱 Library Parameters.

完成設計

模擬來源與探棒

在設計階段,模擬來源與探針非常有用。透過 模擬來源,您可以載入測試影像,並在短短幾秒內檢查 處理流程中每個環節所產出的影像。例外情況: 訊號無法進行模擬。此外,模擬功能會執行設計規則 檢查第 1 級(Design Rule Check Level 1),以驗證實作的正式正確性。模擬 結果等同於執行時的結果。 您可在 圖示選單中,或於 VisualApplets 的文字選單中「分析」項目下,找到模擬 源與探針。有關模擬源 與探針使用方法的詳細說明,請參閱「模擬」下的詳細文件。

在 圖 189,「設計實作範例」 Sobel_Filter.va' 您可以看到一張測試圖像 已載入至範例設計中的模擬來源 Sobel_Filter.va. 在閾值處理之後、DMA 之前,您可以 看到當前處理步驟的結果。

Design Rule Check (DRC)

在完成佈局後,建議執行 第 1 級與第 2 級設計規則檢查。若要執行第 1 級與第 2 級設計規則檢查, 請選取 分析+設計規則檢查第 1 級與第 2 級 ,或使用圖示 設計規則檢查第 1 級與 第 2 級 。

設計規則檢查第 1 級會報告實作中的形式錯誤, 以及這些錯誤在設計中的確切位置。您必須先修正這些錯誤, 才能將設計轉換為硬體小程式。

設計規則檢查第 2 級還會提供有關設計中預估 FPGA 資源使用量的資訊。透過這些資訊,您可以檢查 您的影像處理實作是否具備足夠的 FPGA 資源。如果 某項 FPGA 資源的使用量超過 100%,您就需要重新設計 您的實作以節省資源。

在 圖 192,「範例設計的設計規則檢查 1 和 2」 Sobel_Filter.va' 以下顯示設計規則檢查 1 和 2 的結果: 所有設計均正確無誤,且已使用約 36% 的可用查表器 、22% 的觸發器、15% 的區塊 RAM 以及 2% 的可用嵌入式算術邏輯單元 (ALU)。 您可查看詳細概覽,了解設計中每個元件 消耗了多少 FPGA 資源(參見 圖 193,「FPGA 資源估算」) 位於 Analysis+FPGA 資源估算

範例設計 Sobel_Filter.va 的設計規則檢查 1 與 2

圖 192. 範例設計的設計規則檢查 1 和 2 Sobel_Filter.va


FPGA 資源估算

圖 193. FPGA 資源估算


在 VisualApplets 中建置 Applet

前置條件

只有當 XILINX 工具已 正確安裝時,才能執行硬體小程式的建置流程。在 https://docs.baslerweb.com/visualapplets/installing-visualapplets#which-xilinx-toolchain-and-version-for-which-frame-grabber-platform 您可以查閱詳細概述,了解哪些Xilinx 版本適合您的 幀擷取卡平台。在此範例設計中 Sobel_Filter.va 已選取 microEnable 5marathon VCL 平台。因此,Xilinx ISE 版本 14.7 或 Vivado 版本 2016.1 至 2020.1 皆適用。

編輯建置設定

現在您已經完成了這個範例設計 Sobel_Filter.va 並且 希望將該設計轉化為硬體小程式。這個轉化過程, 稱為 建構 您需要選擇正確的Xilinx 建置 設定。開啟 設定+Build Settings,然後選取該批次檔 settings64.bat 從您的 檔案系統中選取對應的Xilinx 版本(建議:Xilinx Vivado 2018.2), 並按「確定」確認。有關編輯建置 設定的詳細說明,請參閱 「建置設定」.

建立硬體小程式對話方塊

圖 194. 「建立硬體小程式」對話方塊


VisualApplets 現在使用Xilinx 工具,將應用程式轉換為 FPGA 位元流,也就是 程式 或 小程式. 此過程所需的時間取決於設計的複雜程度。建構 高度複雜的設計可能需要數小時。以這個範例實作來說 Sobel_Filter.va, 編譯時間約為 15 分鐘。編譯 成功後,小程式即已完全生成。小程式的名稱 (*.hap 檔案) 與設計檔案的名稱相同 (*.va): Sobel_Filter.hap

在硬體上執行 Applet

前置條件

若要在幀擷取卡上以硬體方式執行小程式,系統中必須安裝可程式化(V 系列)幀 擷取卡(硬體)。此外, PC 上還需安裝Framegrabber SDK 軟體。針對此 microEnable 5marathon VCL 的範例小程式, Framegrabber SDK 的最新支援版本為 5.7。

燒錄

若您如同本範例所示,使用 microEnable 5marathon 幀擷取卡, 則需透過microDiagnostics 將新的應用程式燒錄至幀擷取卡中。

如果您打算在 microEnable IV 幀擷取卡或 最新款 CXP 12 系列幀擷取卡上使用這個新小程式,請直接跳過本節。

若要對幀擷取卡進行韌體更新,請依照以下步驟操作:

  1. 在以下路徑中啟動工具microDiagnostics : bin 位於 Framegrabber SDK 安裝目錄中。

  2. 請選擇您的幀擷取卡。

  3. 選擇 韌體 。

  4. 請將您的硬體小程式指派給顯示的分區之一(0 至 7): 前往存放已建立硬體小程式的目錄,並選取 該檔案。

    韌體分區顯示於microDiagnostics

    圖 195. 顯示於microDiagnostics


  5. 按一下 立即觀看

  6. 請等待新韌體完全安裝完畢。當刷寫 完成後,您將在microDiagnostics 收到一則訊息。

  7. 請遵循訊息中的指示。

在 microDisplay 中測試並載入 Applet

要測試您的 Applet Sobel_Filter.hap 若要設定一些初始 參數,請使用 microDisplay 程式。要載入一個 小程式,必須執行以下步驟:

  1. 儲存該小程式(此處: Sobel_Filter.hap) 位於 Hardware Applets\<your frame grabber> (此處: mE5-MA-VCL ) 位於Framegrabber SDK 的安裝目錄中。

  2. 從 bin 位於 Framegrabber SDK 安裝目錄中的資料夾。

  3. 在 microDisplay 中,請於 「擷取裝置」下,選取您要使用的幀擷取卡。系統將立即顯示 所有適用於該幀擷取卡的小程式。

  4. 選擇您要使用的 *.hap 您要使用的檔案(此處: Sobel_Filter.hap) 雙擊。

引數設定與擷取

載入小程式後,您將在 microDisplay 中看到參數樹和影像擷取 視窗。以下是該小程式的螢幕截圖 Sobel_Filter.hap 顯示在 microDisplay 中載入的內容。

microDisplay 中的參數樹與影像擷取視窗

圖 196. microDisplay 中的參數樹與影像擷取視窗


左側顯示的是參數樹。這些參數相當於 在VisualApplets 中的設計階段所使用的運算子名稱。為能正確找到您欲 在擷取過程中調整的參數,為運算子賦予 適當的名稱至關重要。動態參數可在執行期間進行調整。 動態參數 分為兩類:一類是僅能在 擷取開始前調整的參數(例如DMA 尺寸),另一類則是 即使在影像擷取過程中也能調整的參數(例如運算子 IS_GreaterThan 的閾值)。

在此範例中,您將使用來自模擬器 來源的影像進行影像擷取,並將二值化閾值設定為 150。若您已整合 以下 參數 函式庫的參數, 在VisualApplets 的設計階段中,您可在層級結構的 「參數」 層級下設定所有相關的動態參數。否則,您需要 依序瀏覽各層級,以找到我們想要 設定的正確參數。

在此範例中,請前往層級 「參數」 ,並 展開該層級:

  1. 右鍵點擊 「參數模擬圖像」。如此一來, 您便可以選取欲用於影像 擷取的範例影像。

  2. 點擊此處載入此圖片 載入模擬圖片。

  3. 將「ImageSource」選取器的參數設定為 「Simulator」,並將「Binarization」 的「Threshold」設定為150。

  4. 將圖片尺寸設定為 1024x1024 像素。

設定完這些參數(或您的小程式所需的所有相關參數)後, 即可開始擷取。在此您可以選擇連續擷取、 序列擷取或單一幀擷取。若要停止連續擷取,請點擊 「停止」按鈕。若採用多程序設計,您可以分別啟動和停止 各程序的擷取作業。

有關使用 microDisplay 進行小程式設定與資料擷取的詳細說明,請參閱https://docs.baslerweb.com/frame-grabbers/what-is-micro-display-x。

在您自己的 SDK 中啟動 Applet

您無需在 mircoDisplay X 中執行 Applet 的設定與擷取作業, 而是可以將這些功能整合至您自己的 SDK 環境中。在本節中, 您將了解相關 SDK 元件在影像擷取與設定方面的 基本功能介紹。

作為 C++ SDK 的基礎,您可以使用VisualApplets 內的 SDK 程式碼產生器, 您可以在圖示選單中找到它,或前往 「建置」+產生 SDK 範例VisualApplets 中找到。此功能會自動產生 對應的 CMake 檔案與 Visual Studio 專案檔案,您可將其作為 SDK 程式碼的基礎。

生成的 SDK 專案檔案

圖 197. 生成的 SDK 專案檔案


專案檔案中生成的 C++ 程式碼 vasFgProject.cpp 包含以下程式碼元件:

  1. 幀擷取卡:初始化

    設定採集週期數、設定板卡索引, 呼叫函式 Fg_Init("Sobel_Filter.hap", boardIndex) 來啟動 Applet。

  2. 為擷取作業的緩衝區分配記憶體。

    函式: Fg_AllocMemEx(fg, ..., ...)

  3. 影像擷取卡:Process0 的 Get* 和 Set* 參數

    功能: Fg_setParameterWithType(fg, ..., ..., ...) 進行明確的生命週期管理即呼叫 Fg_getParameterWithType(fg, ..., ..., ...)

    此處列出了設計中包含的所有參數。Basler 建議 刪除所有在 執行期間無需調整的參數,以獲得更清晰的概覽。

  4. 建立顯示器

    函式 CreateDisplay()

  5. 針對每個現有埠,在 Applet 和相機上開始擷取:

    函式: Fg_AcquireEx(fg, 0, nrOfCycles, ...,...);

  6. 截圖:

    函式: Fg_getLastPicNumberBlockingEx(fg, ..., ..., ..., ...);

  7. 中止收購

    功能 Fg_stopAcquireEx(fg, .., .., ...)

  8. 關閉螢幕

    函式 CloseDisplay(...);

  9. 釋放緩衝區的記憶體

    函式 Fg_FreeMemEx(fg, ..);

  10. 幀擷取卡未初始化

    函式 Fg_FreeGrabber(fg);

有關 SDK 功能的詳細說明與解說,請參閱https://docs.baslerweb.com/frame-grabbers/sdk/basler__fg_8h.html

有關「Framegrabber API 」的簡介,請參閱https://docs.baslerweb.com/frame-grabbers/framegrabber-api.html。

您可以將生成的 SDK 範例程式碼整合至更大的 SDK 環境中, 以便對幀擷取器(預)處理過的影像進行進一步的軟體處理。