在本應用手冊中,您將學習如何在 VisualApplets 中設計並建立影像處理應用程式(= applet),以及如何在擷取卡上使用它。您也將學習如何在執行階段透過 microDisplay 與 Framegrabber API 使用此 applet,以及如何在該軟體中設定 applet 的參數。您可以在 Getting Started 中找到關於如何在執行階段設計、建置與使用 applet 的介紹。在本應用手冊中,我們將以 Sobel 邊緣濾鏡應用程式為範例,帶領您學習上述的 applet 開發與使用階段。一個較短的引導路徑是 From Empty Design to Running Applet 教學主題。
工作流程如下:
-
在 VisualApplets 中設計 applet。
-
在 VisualApplets 中模擬 applet 並執行設計規則檢查(Design Rules Check, DRC)。
-
建置 applet。
-
針對 mE5 平台:燒錄 applet。
-
透過 microDisplay 或 Framegrabber API 在硬體上使用 applet。
applet 的設計階段是在 VisualApplets 中進行。若要開啟 VisualApplets,請按一下 VisualApplets 安裝目錄中 VisualApplets.exe 資料夾內的
bin 檔案,或是 Windows Start 功能表中的 VisualApplets 程式圖示,或桌面上的圖示。
-
起初,VisualApplets 主視窗會開啟且未載入任何專案。
-
按一下 File+New ( Ctrl+N ),或使用 圖示列中的 圖示。隨即會開啟一個 視窗,讓您指定專案名稱、目標硬體平台以及目標執行階段。您隨後隨時可以變更這些設定。
-
若要跟隨此處的範例,請使用以下設定:
-
按一下 確認您的設定。
VisualApplets 現在會啟動一個新專案,您會在程式視窗中央看到一個空白的設計視窗。在右側的 索引標籤中,會顯示有關目前專案的資訊,例如專案名稱、目標硬體、目標平台等。
在 VisualApplets 中,影像處理作業是以 operators 表示。您可以在 VisualApplets 設計視窗右側的 中找到所有這些 operators。您可以透過拖放(drag-and-drop)非常輕鬆地將 operators 放置到設計視窗中。
設計中的運算子執行個體稱為 module。 運算可以具有輸入和輸出連接埠。設計中的運算(即 modules)可以使用這些連接埠進行連接。modules 之間的連接稱為 links,在設計視窗中以箭頭表示。這些 modules 和 links 代表影像(或訊號)處理管線。因此,運算的順序由 modules 的順序決定。
運算子和 links 具有 properties,用於描述對目前影像處理管線相關的設定,例如影像尺寸。若要檢視和編輯這些 properties,請按兩下運算子。運算子的 properties 將在 底下的運算子說明文件中詳細說明。
此範例實作了 Sobel 邊緣濾波演算法。
在 VisualApplets 設計範例庫中,有適用於邊緣濾波及其他影像處理應用的「開箱即用」範例。您可以在以下位置找到這些設計範例: Examples\Processing 位於您的 VisualApplets 安裝目錄中,並附帶對應的說明文件,請參閱 處理範例。您可以將這些範例設計作為您自己應用的基礎。
針對此範例 Sobel 濾波器設計的實作,請在 中尋找運算子,將其拖曳至設計中,並依照 Getting Started 一節中的說明使用連結將其連接。
您稍後可以重新命名 modules,以便在設計中獲得更好的概覽,並在執行階段更好地理用。
只要合適,請使用 HierarchicalBoxes 來組織設計,以獲得更好的設計概覽。
並且別忘了不時儲存設計。
本應用筆記中的範例設計由下列元件組成,如下圖所示:
-
Camera Link 灰階相機介面
-
影像緩衝區
-
具有 x 和 y 方向邊緣濾波功能的 Sobel 邊緣濾波器 module(基於範例
SobelMultiGradient.vad位於Examples\Processing\Filter\EdgeDetection\Sobel_Multi_Gradient在 VisualApplets 安裝目錄中) -
可調整的二值化閾值以及縮放運算子,以便在執行階段更好地於顯示器上視覺化二值化影像
-
傳送到 PC 的 DMA。
您可以在設計中使用 CoefficientBuffer 作為影像的模擬來源,而不使用相機擷取的影像。透過 SourceSelector 運算子,您可以選擇 VisualApplets 中以及執行階段期間處理管線的影像輸入來源。
若要對運算子和連結進行參數化,您可以透過按兩下元素來編輯每個元素的參數。
Links 具有 properties,可定義已處理影像的 properties,例如最大影像尺寸、image protocol、Bit Width,以及與最大可能頻寬相關的參數:Parallelism(即在一個設計時脈週期中傳輸的像素數量)。如果這些 links 連接到特定的運算子(請參閱對應的運算子說明文件),例如相機介面運算子,您可以根據您的用途編輯和調整這些 properties。
您選擇的最大影像尺寸和 Parallelism 越高,FPGA 資源消耗就越大。因此,Basler 建議僅將這些值設定到所需的程度,以節約 FPGA 資源。Link Property 只能在 VisualApplets 的設計階段進行變更。
Operator Property 有兩種類型:static 和 dynamic。您只能在 VisualApplets 的設計階段變更 Static 參數,而 Dynamic 參數則可以在設計階段和執行階段進行變更。請參閱下方截圖,其中包含 operator IS_GreaterThan 的 Static 和 Dynamic 參數範例。
在此範例設計中,請設定下列參數:
- Operator IS_GreaterThan:
-
將參數 Number 設定為 600。
這會識別邊緣的灰階。如果您想找出邊緣的灰階,可以在 IS_GreaterThan operator 之前設定模擬探棒(simulation probe),執行模擬,然後放大包含邊緣的像素以查看其灰階。這是一個動態參數,您可以在執行階段進行更改。
- Operator SCALE:
-
將參數 ScaleFactor 設定為 255。
這會增強邊緣的可見度。這是一個動態參數。不過,為了節約 FPGA 資源,您可以將此參數設定為 Static。
在執行階段,您可以變更 Dynamic 參數。常見的使用情境是您的設計中有許多 operator,且您需要變更許多不同 operator 的相同參數(例如影像尺寸)。
此 參數 library 提供之 operator 僅需控制一個參數,即可存取設計中的不同模組參數。此外,這些 operator 還能讓存取參數顯示在特定的階層層級上。這些選項可讓執行階段的參數設定更加輕鬆。範例設計 Sobel_Filter.va
(請參閱 圖 189、「範例設計實作 Sobel_Filter.va'」使用翻譯和參照參數,以便在階層層級上輕鬆存取影像寬度和高度、影像來源選擇器、閾值和縮放比例。
為此,請建立一個空的 HierarchicalBox,將其命名為 並將對應翻譯和參照參數的
DisplayHierarchy 參數設定為 。您可以在對應的文件中找到該 library 的詳細說明,請參閱 參數 library Library Parameters.
在設計階段,模擬來源和探棒非常有用。使用模擬來源,您可以載入 Test Images,並在幾個瞬間內檢查處理管線中每個 link 上的處理後影像。例外狀況:無法模擬訊號。此外,模擬會針對實作的形式正確性執行 Design Rule Check Level 1。模擬結果與執行階段的結果相同。您可以在 VisualApplets 的圖示選單或文字選單的 Analysis 下找到模擬來源和探棒。如需模擬來源和探棒用法的詳細說明,請參閱 'Simulation' 下的詳細說明。
在 圖 189、「範例設計實作 Sobel_Filter.va' 中,您可以看到載入至範例設計中模擬來源的測試影像
Sobel_Filter.va。在閾值處理之後、DMA 之前,您可以看到目前處理步驟的結果。
完成實作後,建議執行 Design Rule Check Level 1 和 2。若要執行 Design Rule Check Level 1 和 2,請選取 Analysis+Design Rules Check Level 1 and 2 或使用圖示列中的 圖示。
Design Rule Check Level 1 會回報實作中的形式錯誤及其在設計中的確切位置。在將設計轉譯為硬體 applet 之前,您必須修正這些錯誤。
Design Rule Check Level 2 另外會提供有關設計中所使用預估 FPGA 資源的資訊。透過此資訊,您可以檢查是否有足夠的 FPGA 資源可用於您的影像處理實作。如果資源超過任何一項 FPGA 資源的 100%,您需要重新設計實作以節省資源。
在 圖 192,「範例設計的 Design Rule Check 1 和 2
Sobel_Filter.va' 顯示了 Design Rule Check 1 和 2 的結果:設計完全正確,並且使用了大約 36% 的可用 Lookup Tables、22% FlipFlops、15% Block RAM 以及 2% 的可用嵌入式 ALU。您可以在 圖 193,「FPGA 資源估算」下看到關於設計中每個元素消耗多少 FPGA 資源的詳細概覽(請參閱 Analysis+FPGA Resource Estimation
唯有在正確安裝 XILINX 工具的情況下,才能執行硬體 applet 建置程序。在 https://docs.baslerweb.com/visualapplets/installing-visualapplets#which-xilinx-toolchain-and-version-for-which-frame-grabber-platform 下,您可以找到詳細的概覽,說明哪個 Xilinx 版本適用於您的擷取卡平台。在此範例設計中 Sobel_Filter.va
選取了 microEnable 5 marathon VCL 平台。因此,適用 Xilinx ISE 14.7 版或 2016.1 與 2020.1 之間的 Vivado 版本。
現在您已完成範例設計 Sobel_Filter.va ,並希望將設計轉譯為硬體 applet。對於此轉譯程序(稱為 build ),您需要選取正確的 Xilinx 建置設定。開啟 Settings+Build Settings,從您的檔案系統中選取對應 Xilinx 版本的批次檔 settings64.bat (建議:Xilinx Vivado 2018.2)並以 OK 確認。您可以在下方找到編輯建置設定的詳細說明: 'Build Settings'.
VisualApplets 現在會使用 Xilinx 工具將應用程式轉換為 FPGA 位元串流 (Bitstream),亦即 程式 或 applet。
此過程的時間長短取決於設計的複雜度。建置高度複雜的設計可能需要數小時。對於此範例實作
Sobel_Filter.va,建置時間約需 15 分鐘。建置成功後,applet 即會完整產生。applet 的名稱
(*.hap 檔案) 與設計檔案的名稱相同
(*.va): Sobel_Filter.hap
若要在硬體框架擷取卡上執行 applet,系統必須安裝可程式化 (V 系列) 框架擷取卡 (硬體)。此外,PC 上必須安裝 Framegrabber SDK 軟體。針對 microEnable 5 marathon VCL 的這個範例 applet,最新可用的 Framegrabber SDK 版本為 5.7。
如果您像本範例一樣使用 microEnable 5 marathon 框架擷取卡,則需要使用 microDiagnostics 將新的 applet 燒錄 (Flash) 至您的框架擷取卡中。
如果您打算在 microEnable IV 框架擷取卡或最新 CXP 12 系列框架擷取卡上使用新的 applet,請直接跳過此節。
若要燒錄框架擷取卡,請執行以下步驟:
若要測試您的 applet Sobel_Filter.hap 並設定一些初始參數,請使用程式 microDisplay。載入 Applet 需要執行以下步驟:
-
將 Applet(此處為:
Sobel_Filter.hap下看到關於設計中每個元素消耗多少 FPGA 資源的詳細概覽(請參閱Hardware Applets\<your frame grabber>(此處為 mE5-MA-VCL)儲存在 Framegrabber SDK 安裝目錄中。 -
從 Framegrabber SDK 安裝目錄中的
bin資料夾啟動 microDisplay。 -
在 microDisplay 中,於 下選取您要使用的圖形擷取卡。隨即會顯示所選圖形擷取卡可用的所有 Applet。
-
按兩下選取您要使用的
*.hap檔案(此處為:Sobel_Filter.hap)。
載入 Applet 後,您可以在 microDisplay 中看到參數樹和影像擷取視窗。下方顯示了載入至 microDisplay 中的 Applet
Sobel_Filter.hap 截圖。
左側會顯示參數樹。這些參數對應至 VisualApplets 設計階段中的運算子名稱。為運算子使用良好的命名非常重要,這樣才能找到您想要調整以進行擷取的正確參數。動態參數可在執行階段進行調整。動態參數分為兩種:僅能在擷取開始前調整的參數(例如 DMA dimensions),以及甚至可以在影像擷取期間調整的參數(例如運算子 IS_GreaterThan 的閾值)。
在此範例中,您使用來自模擬器來源的影像執行影像擷取,並將二值化閾值設為值 150。如果您在 VisualApplets 的設計階段中整合了 Parameters 圖庫的參數,您可以在參數樹中的 階層級別下設定所有相關的動態參數。否則,您需要逐一查看不同的階層級別以尋找我們要設定的正確參數。
在此範例中,前往階層級別 並將其展開:
-
在 上按滑鼠右鍵。因此,您可以選取您要用於影像擷取的範例影像。
-
按一下 載入此影像。
-
將參數 ImageSource selector 設為 Simulator,並將 Binarization Threshold 設為值 150。
-
將影像尺寸設為 1024x1024 像素。
設定好這些參數(或您的 Applet 所需的所有相關參數)之後,您就可以開始擷取。在這裡,您可以選擇連續擷取、擷取序列或單一影格。若要停止連續擷取,請按一下「停止」按鈕。若是多處理程序設計,您可以分別啟動和停止單一處理程序的擷取。
如需 Applet 組態以及使用 microDisplay 進行擷取的詳細說明,請參閱 https://docs.baslerweb.com/frame-grabbers/what-is-micro-display-x。
您也可以將其整合至您自己的 SDK 環境中,而不在 microDisplay X 中執行 Applet 組態與擷取。在本節中,您將找到影像擷取與組態相關 SDK 元件之基本功能的介紹。
作為 C++ SDK 的基礎,您可以使用 VisualApplets 內部 SDK 程式碼產生器,您可以在圖示選單中找到它,或者在 VisualApplets 的 Build+Generate SDK Example 下找到。此功能會自動產生對應的 CMake 檔案和 VisualStudio 專案檔案,您可以將其用作 SDK 程式碼的基礎。
專案檔案中產生的 C++ 程式碼 vasFgProject.cpp
包含以下程式碼元件:
-
擷取卡:初始化
採集循環次數的定義、板卡索引的定義、 呼叫函式
Fg_Init("Sobel_Filter.hap", boardIndex)以啟動 Applet。 -
為擷取緩衝區配置 Memory。
函式:
Fg_AllocMemEx(fg, ..., ...) -
擷取卡:取得 Process0 的 Get* 與 Set* 參數
函式:
Fg_setParameterWithType(fg, ..., ..., ...)和Fg_getParameterWithType(fg, ..., ..., ...)此處列出了設計中包含的所有 Property。為了獲得更好的檢視效果,Basler 建議 刪除所有在執行階段調整時不需要的 Property。
-
建立顯示畫面
函式
CreateDisplay() -
針對每個存在的 Port,啟動 Applet 和相機上的擷取:
函式:
Fg_AcquireEx(fg, 0, nrOfCycles, ...,...); -
擷取影像:
函式:
Fg_getLastPicNumberBlockingEx(fg, ..., ..., ..., ...); -
停止擷取
功能
Fg_stopAcquireEx(fg, .., .., ...) -
關閉顯示畫面
函式
CloseDisplay(...); -
釋放緩衝區的 Memory
函式
Fg_FreeMemEx(fg, ..); -
擷取卡取消初始化
函式
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 環境中, 以便對擷取卡(預先)處理過的影像進行進一步的軟體處理。














上一頁

