让我们现在来看一下图(graph)模式。例子4可以看作是图模式的例子三,之后我们会通过比较两者,来帮助我们学习其是如何工作的。为了使他更容易的理解接下来发生变化,先对一些变换进行阐述:
1.函数makeInputImage()现在需要另外两个参数,指在图片当中矩形一半的宽度和一半的高度,所以这个制作图片十分简单。
2.一个新函数makeTestGrapg()创造了一个图实现了一种被称为例子3中main函数的vxu函数的功能
3.同样的一个新函数showResults()通过一个图片运行一个图和展示结果
4.一个新函数getGraphParameter()是通过简单的保重使openvx的库函数的使用更方便
5.新的main函数要简单的多,他通过两个图片运行图
然后,继续看更多细节
2.3.1 Creating the graph
在函数makeTestGraph()中,我们广泛的使用虚像,在这些图片中我们既不想读取数据,也不想写出数据。我们也不关心框架如何实现他们。我们只是使用它们连接和处理在图中的点,只是为了告知框架的拓扑结构。对于节点是以何顺序加入图,无关紧要,因为拓扑结构完全是由连接边定义的也就是数据对象。
在函数中,尽管数据对象是虚拟的但该实现可以通过节点合并在一起来自由的执行优化。
我们创建的输入图像不是虚拟的,但就像虚拟图像和其他临时对象,甚至那些包含输出数据的对象一样,我们在退出函数之前释放对它的引用。那怎么导入一个输入或者看输出。
答案就是i使用图参数,openvx的图参数一旦被做好他会给你一个简单的结构去改变输入和输出对象,而且这个结构允许图中的真实数据保持隐藏。图参数仅与一个节点的输入或输出相关联,因此,如果您希望一个对象是多个节点的输入,则可以使用Copy节点来隔离输入图参数。复制节点只需将其输入复制到其输出中,这当然是一个逻辑上的或概念上的操作。如果复制节点的输出是一个虚拟对象,则该实现将只“优化”该复制节点,所以在执行图时没有实际的开销。
请注意,我们的输入图像在例子3中是两个vux函数的输入,vxuWarpAffine() and vxuOr(),同样的我们通过图的创建实现了相同的功能。我们将相同的输入图像提供给两个节点,用这种方式来参数化两个图像是很不方便的。我们只想要一个输入,就可以去两个地方,所以我们介绍了复制节点,此提要的输出both vxWarpAffineNode() and vxOrNode(),我们能够只创建一个与复制节点的输入相关联的图形参数。
vxAddParameterToGraph(graph, vxGetParameterByIndex(vxCopyNode(graph, (vx_reference)input,(vx_reference)imagesU8[0]), 0));
需要注意的是,图形参数是按顺序添加的,由于我们先添加了这个,它将被索引值为零,而我们之后添加的输出参数将会有索引1和2。假设图的创建者将正确地记录它,以便任何使用它的人都将知道哪个参数是哪个参数。
请注意,我们在图形创建函数中没有太多的错误检查。这是因为在处理图形时,在创建所有对象和节点时出现的错误将被捕获,如果我们需要更多的细节,那么我们可以打开日志记录并看到框架的一些诊断输出,而不必测试每个函数调用结果。
2.3.2 Connecting to parameters and running the graph
看例子4的main函数,它也将在本节的后面进行复现。现在我们通过makeTestGraph()函数和一队矩形不同的图片创造图,所以我们可以说明用一个不同的输入参数调用图。运行图并表现结果,是新函数showResults()的功能,他调用了vx_graph and a vx_image作为参数。他设置图片作为图的输入参数,也就是你将记起通过首先将他加入到图来获取索引。
vxSetGraphParameterByIndex(graph, 0, (vx_reference)image);
接下来我们调用vxProcessGraph()运行图。开始运行,vxVerifyGraph()将在内部调用,任何发生的错误都会被发现。在这一点上,实现可以执行它认为必要的任何其他处理。一些实现可能积极优化图,利用任何虚拟对象,以便内核合并并将数据移动减少到最小。目前,Khronos示例实现并没有这样做,但来自硬件供应商的实现将这样做。
2.3.3 Running example 4
在例子4中给出两个输出集。第一个输出集应该与例子3相同,那是24个角,图片是相同的。第二个集合的结果给出了八个角,输入图片旋转九十度和叠加在身上仍然是正方体,所以你可以看见八个角,四个在里边,四个在外边。
本来刚开始看很难看懂,打算一边翻译一遍看,顺便记录下来,不过后续已经可以看懂了,就不再记录了。书如果没有的话,我放在我的资源里边