OpenVX基本原理
OpenVX 是一个低级编程框架域,用于支持软件开发人员,可高效访问计算机视觉硬件加速功能和性能的可移植性。OpenVX 旨在支持现代硬件架构,例如,移动和嵌入式 SoC 以及桌面系统。其中许多系统是并行和异构的:多个处理器类型包括多核 CPU、DSP 子系统、GPU、专用视觉计算结构,以及硬连线功能。此外,视觉系统内存层次结构通常具有复杂、分布式、不连贯性。OpenVX 旨在最大限度地提高功能和性能的可移植性,这些不同的硬件平台,提供了一个计算机视觉框架,并对应用程序的产生极小的负面冲击。
OpenVX 包含以下几个内容。
1)预定义和可定制的视觉功能库。
2)基于图形的执行模型,用于组合功能,使任务和与数据无关的执行。
3)一组抽象物理内存的内存对象。
OpenVX 定义了一个 C 应用程序编程接口(API),用于构建验证和协调图形执行,以及访问内存对象。图形抽象使 OpenVX 实现者,能够优化执行底层加速架构的图表。
OpenVX还定义了vxu实用程序库,该库将每个OpenVX预定义函数共享为可直接调用的C函数,而无需首先创建图形。使用vxu库构建的应用程序,不会从图形所启用的优化中受益;然而,vxu库可作使用OpenVX的最简单方法,并作为移植现有视觉应用程序的第一步。
由于计算机视觉领域仍在快速发展,OpenVX 提供了扩展性机制,使开发人员定义的函数,能够添加到应用程序图。
版本/变更历史
OpenVX 1.0 Provisional - 2013 年 11 月
OpenVX 1.0 临时 V2 - 2014 年 6 月
OpenVX 1.0 - 2014 年 9 月
OpenVX 1.0.1 - 2015 年 4 月
OpenVX 1.1 - 2016 年 5 月
OpenVX 1.2 - 2017 年 5 月
OpenVX 1.2.1 - 2018 年 5 月
OpenVX 1.3 - 2019 年 6 月
OpenVX 1.3.1 - 内核模块注册 API - 2021 年 10 月
演变过程中被弃用的某些项目将删除。兼容性头文件中列出的项目仅为临时项目,当这些项目不再支持向后兼容性时,这些项目将被永久删除。
规范约定
OpenVX中使用了以下规范约定。
在OpenVX中,给出的代码示例突出显示了 特定问题使用如下所示的格式:
/* 示例代码部分 */
int main(int argc, char *argv[])
{
return 0;
}
命名约定
OpenVX中使用了以下命名约定。
不透明对象和原子被命名为vx_object,例如vx_image或vx_uint8,并用下划线将对象名称与vx前缀隔开。
定义的结构被命名为vx_struct_t,例如vx_imagepatch_addressing_t,下划线将结构与vx前缀分隔开,并用t表示它是一个结构。
定义的枚举被命名为vx_enum_e,例如vx_type_e,下划线将枚举与vx前缀分隔开,并用e表示它是一个枚举值。
应用程序编程接口使用骆驼风格大小写,命名为vxsomeFunction(),以小写字母开头,没有下划线,例如vxCreateContext()。
视觉函数还具有遵循类似于Java包的小写、反点层次结构的命名约定,例如,
org.khronos.openvx.color_convert
这最大限度地减少了名称冲突的可能性,并促进了排序和查询可用视觉函数的命名空间时的可读性。每个视觉函数都应具有唯一的虚线名称:tld.vendor.library.function。这种视觉函数命名空间的层次结构是在子域org.khronos,但它们确实遵循现有的国际标准。对于 OpenVX 指定的视觉函数,将唯一名称不使用骆驼风格大小写,而是使用下划线分隔单词。
供应商命名约定
以下命名约定将用于特定于供应商的扩展。
不透明对象和原子被命名为vx_object_vendor,例如vx_ref_array_acme,并用下划线将供应商名称与对象名称隔开。
定义的结构命名为vx_struct_vendor_t,例如vx_mdview_acme_t,下划线将供应商与结构名称隔开,t表示它是一个结构。
定义的枚举被命名为vx_enum_销售方_e,例如vx_convolution _name_acme_e,下划线将供应商与枚举名称隔开,e表示它是枚举值。
定义的枚举值命名为VX_ENUMVALUE_销售方,例如VX_PARAM_STRUCT_ATTRIBUTE_SIZE_ACME,仅使用以vx前缀开头的大写字母和分隔单词的下划线。
应用程序编程接口使用驼色大小写命名为vxSomeFunctionVendor(),以小写字母开头,没有下划线,例如vxCreateRefArrayAcme()。
词汇表和缩略语
原子
原子意味着C基元数据类型。具有额外的用法,如原子操作。
应用程序接口
应用程序编程接口,指定软件组件如何与另一个组件交互。
引擎
一种特定用途的软件抽象,可由用户进行调整。
框架
一种通用软件抽象,其中用户可以产生特定应用程序的功能。
内核
OpenVX使用术语内核来表示抽象的计算机视觉功能,而不是操作系统内核。内核也可以指一些计算机视觉的卷积系数(例如,Sobel内核)。OpenVX不使用此含义。OpenCL使用内核(特别是cl_kernel)来限定用cl编写的函数,OpenCL可以直接调用该函数。这接近OpenVX使用的含义;然而,OpenVX并没有定义一种语言。
运行时
程序的执行阶段。
实现定义
OpenVX API 未指定所述条件下的实现行为,实现开发人员自主开发。
禁止
应用程序应确保未使用所描述的条件。