OpenVX™双向参数扩展

OpenVX™双向参数扩展
1.OpenVX V1.3.1中支持双向参数的扩展
1.1. 意图
双向参数最初在OpenVX中指定,但由于在指定节点调度时存在困难和不明确,因此被删除。这个扩展是针对OpenVX V1.3.1的,并试图将它们添加回来,同时对它们的使用规则和图形形式进行修订。
在本文件中,要求标记如下:[REQ BPnn],其中nn表示编号
扩展的一个可选添加是包含根据OpenVX V1.1指定的累加内核。
与此扩展的一致性可以分为两个级别:
1)基本的,用户节点正确支持双向参数。
2)完全的,支持累加内核和相应的API(vxAccumulateImageNode、vxAccumulateSquareImageNodeX和vxAccumulate WeightedImageNodeX)。请注意,不需要支持即时节点API(vxuAccumulateImage等)。
1.2. 用例示例
问题:修改YUV图像的Y通道。
1.2.1. 无双向参数
一种方法是在图中使用两个节点,如下所示:
使用vxCreateImageFromChannel将图像分离为Y、U、V分量处理Y通道创建新图像
将这3个图像组合回一个新的YUV图像(vxChannelCombineNode)
输出是一个需要新数据缓冲区的新图像,在所有平面上每个像素都有额外的读写功能。
 
这需要:
1)Y平面上每个像素2次读取和2次写入;
2)U和V平面上每个像素1次读取和1次写入;
3)额外一个Y缓冲区和一个YUV缓冲区。
1.2.2. 具有双向参数
1)在使用vxCreateImageFromChannel创建的单个图像上操作时,图中只需要一个节点;
2)双向参数允许就地修改数据;
3)输出占用相同的数据缓冲区,只需要对一个平面中的每个像素进行一次读取和一次写入;
4)在3个平面上保存每个像素的一次读取和一次写入。
 
2.要求
2.1. Parameter对象的枚举类型文档
枚举vx_direction_e被扩展为(再次)包括vx_BIDIRECTIONAL,例如:
enum vx_direction_e {
    VX_INPUT = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_DIRECTION) + 0x0,
    VX_OUTPUT = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_DIRECTION) + 0x1,
    VX_BIDIRECTIONAL = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_DIRECTION) + 0x2,
};
2.2. 图形形式主义
关于双向参数,最多一个写入器,最多一个修改器的新规则,对于导出合理的图执行顺序是必要的。这在这里没有作为单独的要求进行说明,而是产生了稍后说明的要求。
如果图中需要两个节点修改一个对象,则可以使用复制节点来分隔这些节点。通过使用虚拟对象,可以通过删除复制节点来优化实现,这纯粹是为了建立修改节点的执行顺序。
此示例用于说明后面给出的执行顺序要求的推理;修改节点必须在读取节点(在这种情况下是复制节点)之前执行,否则该技巧将不起作用。执行顺序是先写入(仅一次),然后修改(仅一个),最后读取。
2.3. 用户内核
OpenVX V1.3.1的API vxAddParameterToKernel的第三个参数(方向)(内核、索引、方向、数据类型、状态)通常可以是VX_BIDIRECTIONAL、VX_INPUT或VX_OUTPUT。
2.4. 对象与参数的连接
非虚拟对象可以附加到最多一个输出参数、最多一个双向参数和任意数量的输入参数。
 
仅当虚拟对象还附加到第二节点的输出参数和第三节点的输入参数时,虚拟对象才可以附加到图中节点的最多一个双向参数。它也可以连接到任何数量的其他输入参数。推理:
由于它是一个虚拟对象,它需要由图节点初始化,因为数据在图之外是不可访问的,因此需要连接到输出
由于它是一个虚拟对象,(修改的)数据在图之外是不可访问的,因此要想有任何用途,它必须连接到图节点的输入。
 
1)一个对象,无论是虚拟的还是非虚拟的,都不能同时连接到一个节点的双向参数和同一节点的另一个参数(任何类型),否则将存在单个节点循环。
2)诸如统一图像之类的只读对象可以不连接到双向参数。
2.5. 涉及双向参数的节点的执行顺序
1)如果对象连接到节点N1的输出参数和节点N2的双向参数,则在N1完成执行之前,N2不能执行。
2)如果对象连接到节点N2的双向参数和节点N3的输入参数,则N3不能执行,直到N2完成执行为止。
对象所附着的节点的执行顺序如下:
1)作为输出附加到的节点(如果有)
2)作为双向连接的节点(如果有)
3)作为输入附加到的任何节点
 
2.6. 双向参数的循环连接
当解析图以检测循环时,双向参数被视为输入和输出。
某些连接组合是不允许的,例如:
如果对象1双向连接到节点A并输入到节点B,并且对象2双向连接到结点B并输入到结点A,则存在循环。
如果对象1作为输入连接到节点A,作为双向连接到节点B,并且节点A的输出作为另一输入连接到结点B,则存在循环。
 
2.7. 延误
对于将对象连接为双向参数的延迟的使用没有额外的限制。
2.8. 图形参数
可以添加双向参数作为图形参数。在这种情况下,参数的有效方向取决于图配置和确定节点执行顺序的规则:
边连接在一个节点A的输出参数、另一节点B的双向参数和任意数量的输入之间。在这种情况下,图形参数实际上是一个输出,在节点B执行后变为写入。无论图形参数是创建为附加到节点A还是节点B,都是这种情况。如果这令人困惑,请使用复制节点以清晰明了,并理解节点的执行顺序。
边不连接到任何输出参数,而是连接到节点B的一个双向参数和其他节点的任何数量的输入。在这种情况下,图形参数是真正双向的,最初是节点B的输入,在节点B执行后变为写入。
 
2.9. 管道
双向参数,无论是有效的输出还是真正的双向(见上文),在其连接的所有节点都已执行之前,都不会准备好退出队列。
2.10. 复制的节点
OpenVX V1.3.1:描述vxReplicateNode()的参数三,vx_bool的一个数组,其值为vx_true_e,表示应该迭代的参数(应该是对vx_pyramid或vx_object_array的引用),vx_false_e表示在复制节点之间应该相同的参数和未使用的可选参数。对于所有输出和双向参数,应为vx_true_e。
3.可选标准节点
可选地,可以实现类似于OpenVX V1.1规范中定义的累积API。
该规范与V1.1规范相似,有以下重要修改:
虚拟对象可以作为任何参数连接到内核
新vxAccumulateSquareImageNodeX函数的shift参数类型为vx_uint32,而在vxAccumulate SquareImageNode中,它是一个包含vx_uint 32的标量。
新vxAccumulateWeightedImageNodeX函数的alpha参数类型为vx_float32,其中与vxAccumulate WeightedImageNode一样,它是包含vx_float的标量。
最后两点解决了一个异常,即在V1.1中,参数被指定为vx_scalar类型,这意味着这些值可能在图形执行过程中发生变化(例如,标量可以从用户节点输出),但描述性文本的含义是,它们在图形验证时是固定的(这也是示例实现的工作方式),因为标量值有限制,如果在运行时这些值不在这些限制范围内,则没有给出如何进行的指导。(请注意,一旦验证,就可以保证图形继续进行)。
3.1. 累积图像节点
将输入图像累积为输出图像。累计计算公式如下:
accum(x,y) = accum(x,y) + input(x,y)
使用的溢出策略是VX_CONVERT_policy_STATURATE。
API:
vx_node VX_API_CALL vxAccumulateImageNode (vx_graph graph, vx_image input, vx_image accum);
3.1.1. 参数

方向

名称

描述

in

graph

对图形的有效引用

in

input

VX_DF_image_U8格式的输入图像

in,out

accum

VX_DF_image_S16格式的累积图像

3.1.2. 返回值

类型

描述

错误

vx_node

节点引用

可以使用vxGetStatus()检查阻止成功创建的任何可能错误

3.2. 累加矩形图像节点

将输入图像的平方值累加到输出图像。累加平方的计算公式为:
accum(x,y) = saturateint16( (uint16)accum(x,y) + (( (uint16)( input(x,y) * input(x,y) )) >> shift ))
其中,0 < = shift < =15
使用的溢出策略是VX_CONVERT_policy_STATURATE。
API:
vx_node VX_API_CALL vxAccumulateSquareImageNodeX (vx_graph graph, vx_image input, vx_uint32 shift, vx_image accum);
3.2.1. 参数

方向

名称

描述

in

graph

对图形的有效引用。

in

shift

该值必须介于0到15之间(包括0到15)。

in

input

VX_DF_image_U8格式的输入图像。

in,out

accum

VX_DF_image_S16格式的累积图像。

3.2.2. 返回值

类型

描述

错误

vx_node

 节点参考

可以使用vxGetStatus()检查阻止成功创建的任何可能错误

3.3. 累加加权图像节点
将加权值从输入图像累积到输出图像。加权累加计算公式如下:
accum(x,y) = (1 - a) * accum(x,y) + a * input(x,y)
其中0<=a<=1
从概念上讲,四舍五入的定义为:
output(x,y) = uint8( (1 - a) * float32(int32(output(x,y))) + a * float32(int32(input(x,y))) )
API:
vx_node VX_API_CALL vxAccumulateWeightedImageNodeX (vx_graph graph, vx_image input, vx_float32 alpha, vx_image accum);
3.3.1. 参数

方向

名称

描述

in

graph

对图形的有效引用。

in

input

VX_DF_image_U8格式的输入图像。

in

alpha

该值必须在0.1到1.0之间(包括0.1到1.0)

in,out

accum

VX_DF_image_U8格式的累积图像。

3.3.2. 返回值

类型

描述

错误

vx_node

节点引用

可以使用vxGetStatus()检查阻止成功创建的任何可能错误

 
 
 
参考文献链接
https://registry.khronos.org/OpenVX/extensions/vx_khr_bidirectional_parameters/vx_khr_bidirectional_parameters_1_3_1.html
posted @ 2024-06-01 05:05  吴建明wujianming  阅读(21)  评论(0编辑  收藏  举报