主要是一些被认为是高级操作的api介绍,包括:
1 Framework:Node Callbacks(节点回调)
允许在特定节点执行完毕后去调用回调函数;无法保证节点完成后立即执行回调,回调旨在使用返回值为视觉图创建简单的提前退出条件;设置回调的示例如下:
vx_graph graph = vxCreateGraph(context);
status = vxGetStatus((vx_reference)graph);
if (status == VX_SUCCESS) {
vx_uint8 lmin = 0, lmax = 0;
vx_uint32 minCount = 0, maxCount = 0;
vx_scalar scalars[] = {
vxCreateScalar(context, VX_TYPE_UINT8, &lmin),
vxCreateScalar(context, VX_TYPE_UINT8, &lmax),
vxCreateScalar(context, VX_TYPE_UINT32, &minCount),
vxCreateScalar(context, VX_TYPE_UINT32, &maxCount),
};
vx_array arrays[] = {
vxCreateArray(context, VX_TYPE_COORDINATES2D, 1),
vxCreateArray(context, VX_TYPE_COORDINATES2D, 1)
};
vx_node nodes[] = {
vxMinMaxLocNode(graph, input, scalars[0], scalars[1], arrays[0], arrays[1], scalars[2], scalars[3]),
/// other nodes
};
status = vxAssignNodeCallback(nodes[0], &analyze_brightness);
// do other
}
若像上面这样建图时注册了回调,那么回调函数将会在图执行期间被调用。
#define MY_DESIRED_THRESHOLD (10)
vx_action analyze_brightness(vx_node node) {
// extract the max value
vx_action action = VX_ACTION_ABANDON;
vx_parameter pmax = vxGetParameterByIndex(node, 2); // Max Value
if (pmax) {
vx_scalar smax = 0;
vxQueryParameter(pmax, VX_PARAMETER_REF, &smax, sizeof(smax));
if (smax) {
vx_uint8 value = 0u;
vxCopyScalar(smax, &value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
if (value >= MY_DESIRED_THRESHOLD) {
action = VX_ACTION_CONTINUE;
}
vxReleaseScalar(&smax);
}
vxReleaseParameter(&pmax);
}
return action;
}
回调必须返回一个vx_action,图会依据此返回值进行相应的操作:
-
如果
VX_ACTION_CONTINUE
返回,则图将无任何变换的继续执行 -
如果
VX_ACTION_ABANDON
返回,然后停止图的执行。仅执行将该节点作为支配者的节点(原文为:“execution is unspecified for all nodes for which this node is a dominator. Nodes that are dominators of this node will have executed. Execution of any other node is
unspecified.” 感觉像是仅继续执行这个node的copy)
带回调的执行序列如图:
很明显看到,就是特定节点执行之后会调用回调,只有回调执行完毕之后,才会依据返回值的类型继续执行图;
相关的枚举:
enum vx_action_e {
//继续执行
VX_ACTION_CONTINUE = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_ACTION) + 0x0,
//停止图执行
VX_ACTION_ABANDON = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_ACTION) + 0x1,
};
相关函数:
vx_status vxAssignNodeCallback( vx_node node, vx_nodecomplete_f callback); |
将回调函数分配特定的节点,若已经有回调,返回错误;可以通过传递NULL清除已分配的回调 |
vx_nodecomplete_f vxRetrieveNodeCallback( vx_node node); |
检索当前在节点上设置的回调函数的指针 |
注:必须回调执行完毕之后才能继续执行图,图的性能可能会受到影响,所以必须谨慎的使用回调。
2 Framework: Performance Measurement(性能评估)
用来进行性能测试和报告的接口;在openvx中,vx_graph和vx_node对象都有对应的性能信息,可以通过查询函数来获得vx_per_t中的任意一个性能:
vx_perf_t perf;
vxQueryNode(node, VX_NODE_PERFORMANCE, &perf, sizeof(perf));
统计的性能包含:
typedef struct _vx_perf_t {
//最后一次测量时间
vx_uint64 tmp;
//一组测量中的开始时间
vx_uint64 beg;
//一组测量中的结束时间
vx_uint64 end;
//执行时间的总和
vx_uint64 sum;
//执行时间的平