设计目标
OpenVX被设计为标准化计算机视觉功能的框架,能够在各种平台上运行,并可能通过供应商在该平台上的实施来加速。OpenVX可以通过提供常用视觉函数的抽象和函数聚合的抽象图,提高视觉应用程序的性能和效率,从而为实现者提供最小化运行时开销的机会。
OpenVX中的功能旨在涵盖许多视觉应用程序所需的通用功能。
1. 硬件优化
OpenVX在其实现中,没有说明可以使用哪种加速方法或技术。供应商可以选择任意数量的实现方法,例如并行和/或专用硬件卸载技术。OpenVX也没有对性能级别做出任何声明或要求,因为可能因平台和用例而异。
2.硬件限制
OpenVX专注于视觉功能,这些功能可以通过不同的硬件显著加速。当这些功能的硬件加速变得实用时,OpenVX的未来版本可能会将额外的视觉功能纳入核心标准。
2.2.3假设
1.便携性
OpenVX的设计旨在尽可能最大限度地提高功能和性能的可移植性,同时认识到API旨在用于具有特定限制和特性的各种设备。可对可移植性进行权衡。例如,使用此API构建的可移植图形,应适用于任何OpenVX实现,并在OpenVX一致性测试定义的精度范围内返回类似的结果。
在OpenVX中被确定为实现定义时,可移植性可能会受到损害。
2.不透明性
OpenVX旨在解决非常广泛的设备和平台,从深度嵌入式系统到台式机和分布式计算架构。OpenVX API通过对大多数程序数据使用不透明对象,解决了这一范围的可能实现,而不会将硬件特定需求强加给任何特定的实现。
除了面向客户端的结构之外,所有数据都是不透明的,并且隐藏在引用后面,该引用可能与实现所需的一样薄或一样厚。每个实现都提供了访问数据的标准化接口,这些接口考虑了专门的硬件、平台或分配要求。从其他API导入或共享的内存不包含在OpenVX中,并且仍然由创建者维护和访问。
OpenVX没有规定对内存分配方法或不透明内存对象布局的任何要求,也没有规定体系结构上结构的字节封装或对齐。
2.2.4.面向对象的行为
对于安全关键应用程序,OpenVX对象在编译时是强类型的,对于动态应用程序,在运行时也是强类型的。在vx_type_e列表中,每个对象都有其typedefd类型及其相关的枚举值。任何对象都可以安全地向下转换为vx_reference,以便在需要的函数中使用,特别是vxQueryReference,可以用于使用vx_enum获取vx_type_e值。
2.2.5. OpenVX 框架对象
OpenVX定义了以下OpenVX框架对象。
1)Object: Context:上下文-OpenVX上下文是所有OpenVX对象的对象域。所有数据对象以及所有框架对象,都存在于上下文中。OpenVX上下文保留所有对象的引用计数,并且必须在解析构建过程中进行垃圾收集,以释放丢失的引用。虽然多个客户端可以连接到OpenVX上下文,但所有数据都是私有的,因为数据对象的引用,只提供给创建方。在不同上下文中创建的数据对象上,调用OpenVX函数的结果是实现定义的。
2)Object: Kernel:内核-OpenVX中的内核是计算机视觉函数的抽象表示,如Sobel梯度或Lucas Kanade特征跟踪。视觉功能可以实现许多与其他功能相似或相同的功能,但只要它由相同的字符串和枚举命名,并且符合OpenVX指定的结果,它仍然被视为一个唯一的内核,内核类似于函数签名。
3)Object: Parameter:参数-传递给计算机视觉函数的抽象输入或输出数据对象。该对象包含内核描述参数用法的签名。这些信息包括:
(1)签名索引:签名中参数的编号索引。
(2)目标类型:例如VX_Type_IMAGE、VX_Type_ARRAY或VX_Type_e中的其他目标类型。
(3)使用模型:例如VX_INPUT或VX_OUTPUT。
(4)当前状态:例如VX_PARAMETER_State_REQUIRED或
VX_PARAMETER_State_OPTIONAL。
4)Object: Node:节点-节点是内核的一个实例,它将与一组特定的引用(参数)配对。节点仅从单个图形创建并与之关联。从节点提取vx_parameter时,可以访问其他属性。
引用-从节点创建功能(例如vxSobel3x3Node)分配给该参数索引的vx_Reference。
5)Object: Graph:图-以有向(仅单向)非循环(不循环)方式连接的一组节点。一个Graph可能具有未连接到同一Graph中其他的节点集。
OpenVX 数据对象
数据对象是由节点中的图处理的对象。
1)Object: Array
不透明的数组对象,可以是基元数据类型或结构的数组。
2)Object: Convolution
包含vx_int16值的M×N矩阵的不透明对象。还包含用于规范化的缩放因子。专门
用于vxuConvolve和vxConvolveNode。
3)Object: Delay
一个不透明的对象,包含手动控制的、临时延迟的对象列表。
4)Object: Distribution
包含频率分布(例如直方图)的不透明对象。
5)Object: Image
一个不透明的图像对象,可能是vx_df_image_e中的某种格式。
6)Object: LUT
与vxTableLookupNode和vxuTableLookup一起使用的不透明查找表对象。
7)Object: Matrix
一个不透明的对象,包含一些标量值的M×N矩阵。
8)Object: Pyramid
一个不透明的对象,包含多个级别的缩放vx_image对象。
9)Object: Remap
一个不透明对象,包含用于变换图像的源点到目标点的映射。
10)Object: Scalar
包含单个基元数据类型的不透明对象。
11)Object: Threshold
包含阈值设置的不透明对象。
12)Object: ObjectArray
一个不透明的数组对象,可以是OpenVX的任何数据对象(非数据类型)的数组,
Delay和ObjectArray对象除外。
13)Object: Tensor
不透明的多维数据对象。用于vxHOGFeaturesNode、vxHOGCellsNode和神经网络
扩展等功能。
错误对象
错误对象是可能从其他对象返回的专用对象,当发生严重的平台问题(即内存不足或无法控制)。可能从其他对象创建者函数返回的专用对象。这些可以在创建这些对象时进行检查,但检查也可能延迟到其他API中使用或验证,实现必须返回适当的错误,以指示使用了无效的对象类型。
vx_<object> obj = vxCreate<Object>(context, ...);
vx_status status = vxGetStatus((vx_reference)obj);
if (status == VX_SUCCESS) {
// 目标是好的
}