這篇主要整理了常見的幾個物件,官方檔案說明更詳細,建議直接去看原文;
1 Object
openvx中的基本物件,所有物件都可以從vx_reference派生,能夠在同一個context中使用;
1.1 vx_reference
參考物件,openvx中的所有物件都可以安全的轉回reference型別;
每個reference對應的有一個列舉,可以獲得參考計數、參考的型別及名字:
enum vx_reference_attribute_e {
VX_REFERENCE_COUNT = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_REFERENCE) + 0x0,
VX_REFERENCE_TYPE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_REFERENCE) + 0x1,
VX_REFERENCE_NAME = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_REFERENCE) + 0x2,
};
和reference關聯的函式有:
| vx_status vxGetStatus( vx_reference reference) | 判斷是否有效 |
| vx_context vxGetContext( vx_reference reference) | 獲得ref的context |
| vx_status vxQueryReference(vx_reference ref, vx_enum attribute, void* ptr, vx_size size); | 查詢ref的屬性 attribute:要查的屬性 ptr:結果存放的位置 size: ptr所表示結果的大小 |
| vx_status vxReleaseReference(vx_reference* ref_ptr); | release ref |
| vx_status vxRetainReference(vx_reference ref); | 增加ref的參考計數 |
| vx_status vxSetReferenceName(vx_reference ref, const vx_char* name); | 設定ref的name |
1.2 Context
context是所有openvx物件的物件域,所有資料物件以及所有的框架物件都存在與背景關系中,openvx context中保持對所有物件的參考計數,在析構的時候要釋放對應的參考;openvx中的資料物件都是私有的,只能在同一個context中被訪問;
和context相關的列舉有:
-
vx_accessor_e:記憶體訪問模式,用于框架本身使用,用作系統關于快取操作或編組操作中的提示;
enum vx_accessor_e { VX_READ_ONLY = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_ACCESSOR) + 0x1, VX_WRITE_ONLY = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_ACCESSOR) + 0x2, VX_READ_AND_WRITE = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_ACCESSOR) + 0x3, }; -
vx_context_attribute_e:
enum vx_context_attribute_e { //供應商的ID VX_CONTEXT_VENDOR_ID = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x0, //Openvx的版本號 VX_CONTEXT_VERSION = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x1, //唯一內核的數量 VX_CONTEXT_UNIQUE_KERNELS = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x2, //注冊過的模塊數量 VX_CONTEXT_MODULES = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x3, //注冊過的reference的數量 VX_CONTEXT_REFERENCES = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x4, //實作的名稱 VX_CONTEXT_IMPLEMENTATION = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x5, //查詢擴展中字串的長度 VX_CONTEXT_EXTENSIONS_SIZE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x6, //拓展中的字串 VX_CONTEXT_EXTENSIONS = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x7, //卷積的最大寬度和高度 VX_CONTEXT_CONVOLUTION_MAX_DIMENSION = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x8, //金字塔核的最大尺寸 VX_CONTEXT_OPTICAL_FLOW_MAX_WINDOW_DIMENSION = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0x9, //立即模式 VX_CONTEXT_IMMEDIATE_BORDER = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0xA, //存放所有kernel的表 VX_CONTEXT_UNIQUE_KERNEL_TABLE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0xB, //不受支持的運行策略 VX_CONTEXT_IMMEDIATE_BORDER_POLICY = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0xC, //非線性濾波器的最大維度 VX_CONTEXT_NONLINEAR_MAX_DIMENSION = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0xd, //tensor的最大維度 VX_CONTEXT_MAX_TENSOR_DIMS = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_CONTEXT) + 0xE, }; - vx_memory_type_e:記憶體匯入的型別
enum vx_memory_type_e {
//opencv 自己分的記憶體
VX_MEMORY_TYPE_NONE = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_MEMORY_TYPE) + 0x0,
//主機分配的記憶體(系統malloc)
VX_MEMORY_TYPE_HOST = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_MEMORY_TYPE) + 0x1,
};
- vx_termination_criteria_e: 終止條件
enum vx_termination_criteria_e {
//在設定的迭代次數之后終止
VX_TERM_CRITERIA_ITERATIONS = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_TERM_CRITERIA) + 0x0,
//與提供給函式的eplison值匹配后終止
VX_TERM_CRITERIA_EPSILON = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_TERM_CRITERIA) + 0x1,
//同時采用1 2 兩種方法
VX_TERM_CRITERIA_BOTH = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_TERM_CRITERIA) + 0x2,
};
和context相關的函式:
| vx_context vxCreateContext(void); | 創建 |
| vx_status vxQueryContext( vx_context context, vx_enum attribute, void* ptr, vx_size size); | 查詢屬性,可以查詢內容見attribute列舉 |
| vx_status vxReleaseContext(vx_context* context); | release |
| vx_status vxSetContextAttribute( vx_context context, vx_enum attribute, const void* ptr, vx_size size); | 設定屬性,見attribute中可配置的屬性 |
| vx_status vxSetImmediateModeTarget( vx_context context, vx_enum target_enum, const char* target_string); | 設定立即運行模式的target,對于此context的后續運行將在其target |
1.3 Graph
圖是以有向無環的方式連接的一組節點,下圖顯示了graph狀態轉換圖:
?
涉及的列舉:
- vx_graph_attributes:
-
enum vx_graph_attribute_e { //圖中的節點數 VX_GRAPH_NUMNODES = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_GRAPH) + 0x0, //graph的整體性能 VX_GRAPH_PERFORMANCE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_GRAPH) + 0x2, //圖引數的個數 VX_GRAPH_NUMPARAMETERS = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_GRAPH) + 0x3, //圖的狀態 VX_GRAPH_STATE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_GRAPH) + 0x4, }; //圖狀態 enum vx_graph_state_e { VX_GRAPH_STATE_UNVERIFIED = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_GRAPH_STATE) + 0x0, VX_GRAPH_STATE_VERIFIED = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_GRAPH_STATE) + 0x1, VX_GRAPH_STATE_RUNNING = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_GRAPH_STATE) + 0x2, VX_GRAPH_STATE_ABANDONED = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_GRAPH_STATE) + 0x3, VX_GRAPH_STATE_COMPLETED = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_GRAPH_STATE) + 0x4, };
-
相關函式:
| vx_graph vxCreateGraph(vx_context context); | 創建 |
| vx_bool vxIsGraphVerified(vx_graph graph); | 驗證 |
| vx_status vxProcessGraph(vx_graph graph); | 處理,同步介面;若graph未驗證,驗證后執行;阻塞至完成回傳 |
| vx_status vxQueryGraph(vx_graph graph, vx_enum attribute, void* ptr, vx_size size); | 查詢圖的屬性,可查詢狀態見stat_e |
| vx_status vxRegisterAutoAging(vx_graph graph, vx_delay delay); | 注冊aging, 作用暫時未理解 |
| vx_status vxReleaseGraph(vx_graph* graph); | 析構 |
| vx_status vxScheduleGraph(vx_graph graph); | 調度,執行圖(適用于auto模式) |
| vx_status vxSetGraphAttribute( vx_graph graph, vx_enum attribute, const void* ptr, vx_size size); | 設定屬性,可配置見stat_e |
| vx_status vxVerifyGraph(vx_graph graph); | 圖驗證 |
| vx_status vxWaitGraph(vx_graph graph); | 等待特定圖執行完成 |
1.4 node
節點是內核的一個實體,其與一組特定的reference引數配對;結點僅在單個圖中創建并在此圖內可見;
屬性列舉:
enum vx_node_attribute_e {
//節點執行狀態
VX_NODE_STATUS = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x0,
//節點執行性能,需要啟用性能跟蹤
VX_NODE_PERFORMANCE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x1,
//節點的邊界模式
VX_NODE_BORDER = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x2,
//kernel的記憶體占用
VX_NODE_LOCAL_DATA_SIZE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x3,
//本地記憶體的地址
VX_NODE_LOCAL_DATA_PTR = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x4,
//節點引數的個數
VX_NODE_PARAMETERS = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x5,
//節點是否被復制
VX_NODE_IS_REPLICATED = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x6,
//復制的引數
VX_NODE_REPLICATE_FLAGS = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x7,
//是否存在有效框
VX_NODE_VALID_RECT_RESET = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x8,
};
相關函式:
| vx_status vxQueryNode( vx_node node, vx_enum attribute, void* ptr, vx_size size); | 查詢屬性 |
| vx_status vxReleaseNode(vx_node* node); | 析構 |
| vx_status vxRemoveNode(vx_node* node); | 從圖中移出節點 |
| vx_status vxReplicateNode( vx_graph graph, vx_node first_node, vx_bool replicate[], vx_uint32 number_of_parameters); | 創建一個節點的復制,如處理pyramid時可以用到;復制的節點不可訪問,析構基節點之后會洗掉所有拷貝節點 |
| vx_status vxSetNodeAttribute( vx_node node, vx_enum attribute, const void* ptr, vx_size size); | 設定屬性 |
| vx_status vxSetNodeTarget( vx_node node, vx_enum target_enum, const char* target_string); | 設定node運行的target |
1.5 Others
其他型別的物件包括: Object: Array,Object: Convolution, Object: Distribution, Object: Image, Object: LUT,Object: Matrix,Object: Pyramid,Object: Remap,Object: Scalar,Object: Threshold,Object: ObjectArray,Object: Tensor;
基本用法都類似,可以查詢及設定屬性,更多內容可以在使用程序中查詢;
2 基本feature
主要包括這幾個部分:
Modules (模塊)
-
Object 物件
Data Structures (資料結構)
-
vx_coordinates2d_t:
二維坐標 -
typedef struct _vx_coordinates2d_t { vx_uint32 x; vx_uint32 y; } vx_coordinates2d_t; -
vx_coordinates3d_t:3d坐標typedef struct _vx_coordinates3d_t { vx_uint32 x; vx_uint32 y; vx_uint32 z; } vx_coordinates3d_t; -
vx_keypoint_ttypedef struct _vx_keypoint_t { vx_int32 x; vx_int32 y; vx_float32 strength; //The strength of the keypoint. vx_float32 scale; vx_float32 orientation; vx_int32 tracking_status; //A zero indicates a lost point. vx_float32 error; //A tracking method specific error. } vx_keypoint_t; -
vx_line2d_ttypedef struct _vx_line2d_t { vx_float32 start_x; vx_float32 start_y; vx_float32 end_x; vx_float32 end_y; } vx_line2d_t; -
vx_rectangle_ttypedef struct _vx_rectangle_t { vx_uint32 start_x; vx_uint32 start_y; vx_uint32 end_x; vx_uint32 end_y; } vx_rectangle_t;
Macros (宏)
-
VX_ATTRIBUTE_BASE:結合用戶ID獲取列舉基類 -
VX_ATTRIBUTE_ID_MASK:物件的屬性,[0, 2^8-1]范圍內 -
VX_DF_IMAGE:四個字符轉為uint32_t;#define VX_ATTRIBUTE_ID_MASK (0x000000FF) -
VX_ENUM_BASE -
VX_ENUM_MASK -
VX_ENUM_TYPE -
VX_ENUM_TYPE_MASK -
VX_FMT_REF: debug openvx所用的值 -
VX_FMT_SIZE -
VX_KERNEL_BASE:kernel的基值; -
VX_KERNEL_MASK -
VX_LIBRARY -
VX_LIBRARY_MASK -
VX_MAX_LOG_MESSAGE_LEN: 日志訊息緩沖區的長度 -
VX_SCALE_UNITY -
VX_TYPE -
VX_TYPE_MASK -
VX_VENDOR -
VX_VENDOR_MASK -
VX_VERSION -
VX_VERSION_1_0 -
VX_VERSION_1_1 -
VX_VERSION_1_2 -
VX_VERSION_1_3 -
VX_VERSION_MAJOR -
VX_VERSION_MINOR
型別定義
-
vx_bool -
vx_char -
用于保存vx_df_image:描述像素格式和顏色空間的代碼,VX_DF_IMAGE -
vx_enum -
vx_float32 -
vx_float64 -
vx_int16 -
vx_int32 -
vx_int64 -
vx_int8 -
vx_size -
vx_status -
vx_uint16 -
vx_uint32 -
vx_uint64 -
vx_uint8
Enumerations
-
vx_bool_e -
vx_channel_e -
vx_convert_policy_e -
vx_df_image_e -
vx_enum_e -
影像重采樣操作支持的影像重建濾波器,vx_interpolation_type_e:enum vx_interpolation_type_e { VX_INTERPOLATION_NEAREST_NEIGHBOR = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_INTERPOLATION) + 0x0, VX_INTERPOLATION_BILINEAR = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_INTERPOLATION) + 0x1, VX_INTERPOLATION_AREA = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_INTERPOLATION) + 0x2, }; -
非線性濾波器函式的列舉,vx_non_linear_filter_e: -
矩陣模式的列舉vx_pattern_e: -
vx_status_e -
目標列舉vx_target_e:enum vx_target_e { VX_TARGET_ANY = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_TARGET) + 0x0000, VX_TARGET_STRING = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_TARGET) + 0x0001, VX_TARGET_VENDOR_BEGIN = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_TARGET) + 0x1000, }; -
vx_type_e -
vx_vendor_id_e
3 總結
其實這里主要理解context、graph、node、kernel之間的關系即可;包含關系node∈graph∈context;
注:邊界模式是指影像使用的像素在不在影像邊界之內;像素在影像邊界之外使用的是VX_BORDER_UNDEFINED 模式;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/385915.html
標籤:其他
