3. 节点参数
节点创建函数的参数定义为原子类型,如vx_int32、vx_enum,或对象,如vx_scalar、vx_image。框架应将节点创建功能的原子变量转换为vx_scalar引用,供节点使用。vx_scalar类型的节点参数,可以在图形执行期间更改;而如果改变原子类型的节点参数(vx_int32等),则至少需要图重新验证。通过vxGetParameterByIndex检索对vx_parameter的引用,然后将其传递给vxQueryParameter,以检索对该对象的引用,可以修改所有节点参数对象。
vx_parameter param = vxGetParameterByIndex(node, p);
vx_reference ref;
vxQueryParameter(param, VX_PARAMETER_REF, &ref, sizeof(ref));
如果参数的类型未知,则可以使用相同的函数进行检索。
vx_enum type;
vxQueryParameter(param, VX_PARAMETER_TYPE, &type, sizeof(type));
/* 原子是vx_scalar,将ref强制转换为正确的vx_<type>。*/
4. 图形参数
图形上也可能存在参数。这些参数由Graph定义,每个Graph参数都使用vxAddParameterToGraph定义为Graph中节点的特定参数。图形参数向实现传达,在图形执行之间,存在可以由客户端修改的特定节点参数。此外,它们是客户端可以在不引用节点时设置的参数,但可以使用vxSetGraphParameterByIndex引用Graph。这允许图形开发者构建图形工厂。
5. 执行模型
图形必须在以下两种情况下执行:
1)同步阻塞模式(vxProcessGraph将阻塞,直到图形完成)。
2)每个参考模式异步单次发布(通过vxScheduleGraph和vxWaitGraph)。
在异步模式下,图形必须是每个引用的单个问题。给定一个构造的图引用G,它可以被调度多次,但仅相对于其自身按顺序执行。提供给异步图形接口的多个图形引用没有定义的行为,并且可以根据行为或供应商的实现,并行或串行执行。
6.图形式主义
要使用图,必须制定若干规则,以允许确定性地执行图。processGraph(G)调用的行为,由处理图G的结构决定。处理图是由一组节点N1…Nn和一组数据对象d1…di组成的二分图。图中的每条边(Nx,Dy)表示由节点Nx写入的数据对象Dy,每条边(Dx,Ny)表示被节点Ny读取的数据对象Dx。每条边e都有一个名称name(e),它给出了引用相应数据对象的节点的参数名称。每个节点参数在{INPUT,OUTPUT}中,也有一个类型type(Node,name)。有些数据对象是虚拟的,有些数据对象则是延迟的。延迟数据对象只是具有索引(如图像列表)和图中已知链接点的数据对象的集合。一个节点可以被分类为头节点,它不具有向后依赖性。节点可以是依赖节点,其对头部节点具有向后依赖性。此外,处理图有几个限制:
1)输出类型:每个输出边 都需要{Output}中 。
2)输入键入:每个输入边 都需要{Input}中 。
3)单个写入器:每个数据对象最多是一个输出边的目标。
4)断开的循环:G中的每个循环必须至少包含输入边 ,其中 是Delay。
5)虚拟图像源:如果 是虚拟的,则至少有一个输出边缘写入 。
6)延迟数据对象不应是虚拟的:如果 为延迟,则不应为虚拟的。
7)无法输出统一的图像。
每个节点的执行由一个原子操作(有时称为激发)组成,该操作消耗表示每个输入数据对象的数据,对其进行处理,并生成表示每个输出数据对象的信息。当节点的所有输入边都被标记为已知时,节点可以执行。在图形执行前,将使用以下初始标记。
1)标记来自非虚拟对象Dx的所有输入边 (必须设置参数)。
2)具有输出边缘 的所有输入边缘 都是未标记的。
3)标记Dx是延迟数据对象的所有输入边 。
处理节点导致取消标记所有对应的输入边,并标记其所有输出边;标记Dy不是延迟的输出边缘 导致标记所有输入边缘 。可以按如下方式静态调度图中的节点:构造一个优先图P,包括所有节点 ,以及每对边 和 的边 ,其中 不是延迟。然后根据P的任何拓扑类,无条件地激发每个节点。
应验证以下断言:
1)P是一个有向非循环图(DAG),由4及其构造方法表示。
2)每个数据对象在执行时都有一个值,由5、6、7和标记表示。
3)如果节点是确定性的,则执行是确定性的(隐含在3、4和标记中)。
4)每个节点只完成一次执行。
这里描述的执行模型只是一种形式主义。例如,允许在多个依赖的节点和边上进行独立处理,前提是结果与此处描述的执行模型保持不变。
7.重叠数据对象
图2-2中节点N1的输出参数和节点N2的输入参数所引用的两个不同数据对象会导致这两个节点之间的依赖关系:例如,金字塔及其级别图像、由vxCreateImageFromROI或vxCreateImageFromChannel创建的图像及其子图像,或相同图像的重叠子图像,或从外部分配的缓冲区创建的具有重叠的对象。如果图使用从外部分配的具有重叠的缓冲区创建的对象,则图验证和/或图执行的行为由实现定义。图2-2显示了这种依赖关系的示例。为了简化随后的定义和要求,施加了一个限制,即如果子图像I'是从图像I创建的,并且子图像I''是从I'创建的,则I''仍然被视为I的子图像,而不是I'的子图像。在这些情况下,尽管两个节点引用了两个不同的数据对象,但对一个数据对象的任何更改,都可能反映在另一个数据对象中。因此,在图的拓扑顺序中, 在 前。为了确保这一点,导入了节点与引用示例,分别是如图2-2与图2-3所示。
图2-2 金字塔节点与引用示例
图2-3 图像节点与引用示例
1)包含集-C(d),d的递归包含的数据对象集,命名为包含集,定义如下:
①
② 是由d直接包含的所有数据对象的集合:
如果d是图像,则从d的ROI或通道创建的所有图像,都直接包含在d中。
如果d是一个金字塔,则d的所有金字塔级别都直接包含在d中。
如果d是一个对象数组,则d的所有元素都直接包含在d中。
如果d是延迟对象,则d的所有槽都直接包含在d中。
③对于i>1, 是d以第 阶包含的所有数据对象的集合。
④ 是包含d本身的集合,d所包含的数据对象,d所含的数据对象所包含的这些数据对象,依此类推。
2) 是一个等于真值的谓词,当且仅当d是一个映象。
3)重叠关系。
重叠关系 是为图像定义的关系,如果 中的 和 , 是图像,则
为真,当且仅当 和 重叠,即 和 中都包含 的点 。这个关系是自反的和对称的,但不是传递的: 与 重叠, 与 重叠并不一定表示 与 重合,如图2-4所示。
图2-4 重叠关系示例
4)依赖关系
依赖关系 是为节点定义的关系。 意味着 取决于 ,然后意味着 必须在 完成后执行。
5) ,如果 写入数据对象 并且 从数据对象 读取。
如果输出边缘 的数据对象 与数据对象 重叠,则结果是实现定义的。
vxMagnitudeNode和vxPhaseNode是独立计算的,因为它们不依赖于另一个的输出。