一. 概敘
前文回顧,從上一篇 APEX 常用資料型態轉換 ( UMat / Mat ) 的介紹。相信各位已經大致上理解 UMat 與 Mat 之間的資料型態轉換,以及得知如何擷取影像中感興趣的區塊 (ROI )。 後續,將開始介紹如何撰寫與使用 APEX 代碼,而此章節會先從 APEX-CV 資料庫介紹起,向各位說明資料庫內有哪些作用。最後分享一些使用 APEX-CV 資料庫的編寫技巧與運算能力探討。如同下圖 “APEX 技術指南-文章架構示意圖” 所示,此次介紹章節為 “ APEX-CV 資料庫與使用方式“ 。
APEX 技術指南-文章架構示意圖
二. APEX-CV 資料庫介紹與使用方式
所謂的 APEX-CV 資料庫就是恩智浦 NXP 為了 APEX Kernel 所量身打造的專屬資料庫,稱作 APEX-CV 或是 ApexCV 。 其原型是參照 OpenCV 資料庫所設計,因此許多函式的使用方式皆與 OpenCV 相同。而兩者資料庫最大的差異就是所執行的 核心 不同,OpenCV 主要使用 Arm 核心運行,而 APEX-CV 則是以 APEX 核心運行。以下先說明 APEX-CV 資料庫有哪些功能與作用? 以及 APEX-CV 的程式架構介紹 …
APEX-CV與 OpenCV資料庫說明圖
1. APEX-CV資料庫介紹 :
原廠恩智浦 NXP 依照算法複雜度,將 APEX-CV 資料庫分作兩大類分別為 APEX-CV Base Library 以及 APEX-CV Pro Library。
如下圖所示 (1) APEX-CV Base Library : 主要功能為矩陣基本運算、色彩空間轉換、濾波器、積分圖、內插法等等
(2) APEX-CV Pro Library : 主要功能為特徵偵測、特徵追蹤、影像變換這類的算法。
後續章節會以拆分成這兩個資料庫依序說明。
APEX-CV 資料庫示意圖
2. APEX-CV資料庫使用方式 :
APEX-CV 資料庫使用方式很簡單,僅需要於程式段落的前後加上 APEX_Init() 與 APEX_Deint() 函式後, 便能啟動與關閉 APEX 核心,在依照各函式的使用方式即可運行,後續將實際演示專案的建立步驟,向各位介紹如何正確使用 APEX-CV 資料庫。
專案建立步驟
Step 1 : 建立專案資料夾
首先於 ../s32v234_sdk/demos/apps/ 路徑下,且建立新資料夾並撰寫 *.cpp。
編譯前,必須先將 APEX-CV 標頭檔 (*.h) 的路徑,以及加入 APEX-CV 函式庫 (*.a) 的路徑加入至 BUILD.mk 之中。
* 建置資料夾的方式可參考前篇文章 – APEX 搭建編譯環境
BUILD.mk 撰寫方式之示意圖
Step 2 : 撰寫程式碼 - 添加標頭檔
首先於程式段落引入會使用到的 標頭檔(#include) 與 定義(#define), 如下..
標頭檔添加方式之示意圖
其中..
< apex.h > 為關於 APEX 基本函式之標頭檔。
< apexcv_base.h > 為關於 APEX-CV Base 資料庫的函式之標頭檔。
< umat.hpp > 為關於 UMat / Mat 函式之標頭檔。
< frame_output_v234fb.h > 為關於 Ouput & DCU 函式之標頭檔。
Step 3 : 撰寫程式碼 - 主段落
如下程式碼所示,必須先以 APEX_Init() 函式初始化 APEX 核心, 才能啟動 APEX 作用。否則無法編譯成功,反之需關閉時,則必須以 APEX_Deint() 函式關閉核心。而此範例的目標是將載入影像後,藉由 APEX-CV 的函式將彩色影像轉換成灰階影像。
程式 Main 段撰寫方式之示意圖
此外,這裡也提供了一個小技巧分享給各位。就是關於 APEX_Converter_RGB888toGray 這個函式,此函式為非官方所撰寫,最初是為了使程式看起簡潔所架構的函式。但由於原廠所提供的 APEX-CV 資料庫內的使用方式相當固定,因此也建議各位利用這種方式將代碼整理起來。以下就展示實際的 APEX-CV 的用法 …
APEX-CV 實際用法之示意圖
如上 APEX-CV 實際用法之示意圖,就是標準原廠方式所使用 APEX-CV 的方式 …
首先呼叫欲使用的 APEX-CV Kernel ,如同範例所呼叫的 apexcv::ColorConverter 這個 Kernel。接著必須進行 Kernel 初始化 ( lProcess.Initialize ),初始化後就可以執行該 Kernel 算法 ( lProcess.Process ),並編譯完成後即可於 S32V 的平台上運行。
因每個 kernel的操作方法略有不同,以下將接續介紹 APEX-CV Kernel 故為固定的 kernel用法
(1) Initialize : 是將 APEX-CV kernel 初始化。
(2) Process : 為執行 APEX-CV Kernel。
(3) ReconnectIO : 是將 APEX-CV Kernel 的 Input / Output 重新定義。
(4) SelectApexCore : 為選擇欲使用的 APEX 核心。
若欲詳細檢視如何使用請至該 APEX-CV Kernel 的 *.h 檔進行查看。
如 s32v234_sdk/libs/apexcv_base/arithmetic/include/apexcv_base_arithmetic.h
Step 4 : 運行於 S32V234 開發版中
編寫完成代碼後,即可編譯並將執行檔傳送至 S32V234 開發版中,執行結果如下 :
3. APEX-CV 資料庫之運算能力探討 :
最後將探討 APEX-CV 與 OpenCV 運算能力。而 APEX-CV 即代表 APEX 架構的效能,OpenCV 即代表 ARM 架構的效能。
APEX-CV 運算能力之示意圖
如上圖所示,直方圖的藍色直條為 APEX-CV ,另外紅色為 OpenCV。左側則為算法所花費的時間,這裡則表示的是時間花費越少越好,故需觀察較低的那一方。而底部則是所測試的影像尺寸從 16x16 至 2048x2048 共 11 個尺寸。觀察比較示意圖後,可以發現於 96x96 的尺寸 ApexCV 效能開始優於 OpenCV 。到最後 2048x2048 的尺寸下,APEX 已經可以縮短原本的 93% 的運算時間。故可以得到以下結論…
總結 : APEX 架構,適合矩陣相關且尺寸較大的運算
ARM 架構,適合非矩陣相關且尺寸較小的運算
三. 參考文件
[2] VisionSDK_ProgrammingExamples.pdf
[3] VisionSDK_UserGuide.pdf
[4] VisionSDK_SUMat_UMat.pdf
[5] UG-10328-01-09_APEX-CV_Base_Library .pdf
[6] UG-10328-02-11_APEX-CV_Pro_Library.pdf
評論