ZHDA249 July   2026 TDA4VE-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2了解 OpenVX 内核架构
    1. 2.1 OpenVX 节点执行流程
    2. 2.2 主机和目标内核
    3. 2.3 A72 目标执行模型
  6. 3创建自定义内核包
    1. 3.1 包结构
    2. 3.2 定义内核接口
  7. 4为 A72 内核开发定制 OpenVX 节点:阈值示例
    1. 4.1 实现主机内核
    2. 4.2 实现 A72 目标内核
    3. 4.3 访问 A72 内核上的图像缓冲区
    4. 4.4 实现阈值算法
    5. 4.5 注册内核包
  8. 5将自定义节点集成到 vision_apps 中
    1. 5.1 实现 app_custom_threshold 示例
    2. 5.2 执行日志示例
  9. 6总结
  10. 7参考资料

实现主机内核

主机内核定义了暴露给应用的 OpenVX 用户内核。与执行实际图像处理的目标内核不同,主机内核负责描述 OpenVX 框架的内核接口。这包括定义内核名称、参数类型、验证回调、初始化回调和支持的执行目标。

主机内核实现位于以下源文件中。

vision_apps/kernels/custom_threshold/host/vx_custom_threshold_host.c

该文件中的主要函数是 tivxAddKernelCustomThreshold(),它执行自定义内核的完整注册。注册过程包括四个主要步骤:

• 创建 OpenVX 用户内核。

• 定义所需的输入和输出参数。

• 注册支持的执行目标。

• 完成内核注册。

/* Create the OpenVX user kernel and associate the callback functions */
kernel = vxAddUserKernel(context, TIVX_KERNEL_CUSTOM_THRESHOLD_NAME, kernel_id,
            tivxAddKernelCustomThresholdValidate, tivxAddKernelCustomThresholdInitialize, NULL);

/* Define the input image parameter */
vxAddParameterToKernel(kernel,  0, VX_INPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED);

/* Define the input threshold value */
vxAddParameterToKernel(kernel, 1, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED);

/* Define the output image parameter */
vxAddParameterToKernel(kernel, 2, VX_OUTPUT, VX_TYPE_IMAGE, VX_PARAMETER_STATE_REQUIRED);

/* Register the kernel for execution on the A72 target */
tivxAddKernelTarget(kernel, TIVX_TARGET_MPU_0);

/* Complete the kernel registration */
vxFinalizeKernel(kernel);

vxAddUserKernel() 创建一个新的 OpenVX 用户定义内核,并将其与将由框架调用的回调函数相关联。在本例中,验证回调会验证提供的参数是否满足内核要求,而初始化回调在执行图形之前配置有效的映像区域。

vxAddParameterToKernel() 的三个调用定义了暴露给应用的内核接口。该阈值示例需要一个输入图像、一个标量阈值和一个输出图像。为每个参数分配一个索引,该索引必须与创建节点时使用的参数顺序相匹配。

调用 tivxAddKernelTarget() 指定该内核在 A72 内核 (TIVX_TARGET_MPU_0) 上执行。如果有多个实现可用,则可以注册其他目标。

最后,vxFinalizeKernel() 完成注册过程,并使内核可用于图形验证和执行。

在图形验证期间,OpenVX 框架会调用验证回调,以在执行图形之前验证参数配置。验证回调会检查输入图像格式和标量类型是否符合内核要求。它还配置输出映像的元数据,以便框架可以在执行图形之前分配正确的图像对象。简化实现如下所示。

/* Query the input image format */
vxQueryImage(input, VX_IMAGE_FORMAT, &format, sizeof(format));

/* Query the scalar type */
vxQueryScalar(threshold, VX_SCALAR_TYPE, &type, sizeof(type));

/* Configure the output image metadata */
vxSetMetaFormatAttribute(meta, VX_IMAGE_WIDTH, &width, sizeof(width));
vxSetMetaFormatAttribute(meta, VX_IMAGE_HEIGHT, &height, sizeof(height));
vxSetMetaFormatAttribute(meta, VX_IMAGE_FORMAT, &format, sizeof(format));

初始化回调在成功验证后和开始执行图形之前执行。对于此阈值示例,回调配置有效矩形,以便输出映像与输入映像具有相同的有效区域。该操作会在不更改图像尺寸的情况下执行一对一像素变换,因此无需额外的初始化。