【ATU Book-S32V系列】APEX-CV資料庫與使用方式

一.   概敘

前文回顧,從上一篇 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 架構,適合非矩陣相關且尺寸較小的運算

三.   參考文件

[1] NXP Official website : https://www.nxp.com/
[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 
如有任何相關 APEX 技術問題,歡迎至博文底下留言提問 !!
接下來還會分享更多 APEX 的技術文章 !! 敬請期待 ATU Book-S32V系列 !!


 

相關影片

【ATU Book-S32V系列】 APEX-CV 資料庫與使用方式

介紹 NXP S32V234 之 APEX -CV 資料庫使用方式。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論