tiovx学习

转载于
Openvx & Tiovx
TIOVX 学习笔记
TIOVX (TI OpenVX)简介及例程

定义

  1. Framework Object(框架对象)
  • Context(上下文):OpenVX context是OpenVX所有对象运行的对象域。所有数据对象以及所有框架对象都在context中运行。
  • Kernel(核):OpenVX中的内核是计算机视觉功能的抽象表示。
  • Parameter(参数):传递给计算机视觉功能的抽象输入或输出数据对象。该对象包含内核描述中该参数使用的签名。
  • Node(节点):节点是内核的一个实例,它将与一组特定的引用(参数)配对。节点仅从单个图创建并与单个图相关联。
  • Graph(图):一组以有向(仅单向)非循环(不循环)方式连接的节点。图可能具有与同一图中的其他节点集未连接的节点集。
  1. Data Object(数据对象)数据对象是由节点中的图形处理的对象
  • Array(数组):一个不透明的数组对象,可以是原始数据类型数组或结构数组。
  • Convolution(卷积):一个不透明的对象,包含米× Nvx_int16值矩阵。还包含用于归一化的缩放因子。专门与vxuConvolve和 一起使用vxConvolveNode。
  • Delay(延迟):一个不透明的对象,包含手动控制的、时间延迟的对象列表。
  • Distribution(分布):包含频率分布(例如,直方图)的不透明对象。
  • Image(图像):一个不透明的图像对象,可能是vx_df_image_e.
  • LUT(查找表):与vxTableLookupNode和 一起使用的不透明查找表对象vxuTableLookup。
  • Matrix(矩阵):一个不透明的对象,包含米× N 一些标量值的矩阵。
  • Pyramid(金字塔):包含多级缩放vx_image对象的不透明对象。
  • Remap(重映射):一个不透明的对象,其中包含用于转换图像的源点到目标点的映射。
  • Scalar(标量):包含单一原始数据类型的不透明对象。
  • Threshold(阈值):包含阈值配置的不透明对象。
  • ObjectArray(数组对象):一个不透明的数组对象,可以是 OpenVX 的任何数据对象(非数据类型)的数组,但 Delay 和 ObjectArray 对象除外。
  1. TI拓展api
  • Target:TI Soc上的CPU、DSP、HWA等,负责创建图的是host,负责运行节点的是target,可以为同一个unit
  • Target Kernel:在Target上运行的Kernel
  • Obj Desc(Object Descriptor):通过描述符连接沟通target和host端

执行流程

执行的过程就是节点的连接,只要在定义节点的时候明确输入和输出,ovx会自动寻找满足所有输入条件的节点并执行。
因此节点不存在锁的概念,但是唯一不可以:一个节点的某一个输出给到多个节点的输入

节点与kernel

Openvx的节点会对应绑定一个kernel,调用时则是按照调用结构体成员函数的方式使用。

struct __vx_kernel {
    vx_kernel_f              processFun;	//执行
    vx_kernel_validate_f     validateFun;	//验证
    vx_kernel_initialize_f   initFun;		//初始化
    vx_kernel_deinitialize_f deinitFun;		//析构
    /* 其它成员略 */
};

struct __vx_node {
    struct __vx_kernel* kernel;
    /* 其它成员略 */
};

typedef struct __vx_kernel* vx_kernel;
typedef struct __vx_node* vx_node;

ovx自定义 Kernel 的流程

如果要自定义,可以按照如下流程和上述型式。

  1. 为自定义 Kernel 分配唯一名称及枚举值。
  2. 根据自定义 Kernel 的功能,实现上述的四个函数,即初始化函数、析构函数、验证函数、执行函数。
  3. 调用 vxAddUserKernel() 函数在 Context 上注册。
  4. 为 Kernel 的参数设定“签名”(Signature)。
  5. 调用 vxFinalizeKernel() 函数完成自定义。
  6. 封装 API 方便生成对应的节点<可选>。

注册自定义的kernel

  1. host端
    vxAllocateUserKernelId()
    vxAddUserKernel()
    tivxAddKernelTarget()
    vxFinalizeKernel()
    此外 Tiovx 提供 tivxCreateNodeByKernelEnum() 函数及 tivxCreateNodeByKernelName() 函数,以快速通过 Kernel 对象的枚举值或名称生成对应的节点对象并与数据对象进行绑定。
  2. target端
    实现 Target Kernel Instance 对象的初始化函数。初始化函数主要负责申请必要的动态内存。
    实现 Target Kernel Instance 对象的析构函数。析构函数主要负责释放初始化函数申请的动态内存。
    实现 Target Kernel Instance 对象的执行函数。
    调用 tivxAddTargetKernel() 函数或 tivxAddTargetKernelByName() 函数完成注册。(二选一,建议选前者。)
    调用 tivxRemoveTargetKernel() 函数注销已注册的 Target Kernel 对象。
    不用考虑 Target Kernel Instance 对象如何创建或执行,Tiovx 框架会自动完成这些工作。
posted @ 2022-05-05 09:53  月的光景  阅读(375)  评论(0编辑  收藏  举报