openvx 4: 数据结构

这篇博客深入解析OpenVX中的关键对象,包括vx_reference、Context、Graph和Node。Context是所有对象的域,Graph由节点组成,节点则是内核实例。理解这些数据结构对于掌握OpenVX框架至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇主要整理了常见的几个对象,官方文档说明更详细,建议直接去看原文;

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_
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值