OpenVX框架:节点回调
框架:节点回调
允许客户端在特定节点完成后,接收回调执行。
不能保证在Node完成后立即调用回调。回调旨在使用vx_action_e返回值,为视觉图创建简单的早期退出条件。下面是设置回调的示例:
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]),
/// 其它节点
};
status = vxAssignNodeCallback(nodes[0], &analyze_brightness);
// 做其它事情
}
一旦图形被初始化并安装了回调,那么回调本身将在图形执行期间被调用。
#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;
}
这应该非常谨慎地使用,因为它会破坏图的功率/性能效率的优化。
1)回调必须返回一个vx_action代码,指示图形处理应如何进行。
2)如果返回VX_ACTION_CONINUE,则图形将继续执行,不做任何更改。
3)如果返回VX_ACTION_ABANDON,则未指定该节点作为支配者的所有节点的执行。作为此节。
点支配者的节点将已执行。未指定任何其他节点的执行。节点回调序列,如图3-2所示。

图3-2节点回调序列
类型定义
枚举
功能
1. 类型定义
vx_action
回调响应的正式typedef。
typedef vx_enum vx_action;
参阅: vx_action_e
vx_nodecomplete_f
在特定节点完成后,对客户端的回调。
typedef vx_action (*vx_nodecomplete_f)(vx_node node);
参数
[in] node - 回调附加到的节点。
返回:来自vx_action_e的操作代码。
2. 枚举类型
vx_action_e
执行期间vx_nodecomplete_f的返回代码枚举。
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_ACTION_CONTINUE- 继续执行图形,不做任何更改。
VX_ACTION_ABANDON- 停止执行图形。
3. 函数
vxAssignNodeCallback
将回调分配给节点。如果此节点中已经存在回调,则此函数必须返回错误,并且用户可以通过传递NULL指针,作为回调来清除回调。
vx_status vxAssignNodeCallback(
vx_node node,
vx_nodecomplete_f callback);
参数
[in] node - 对节点的引用。
[in] callback - 与此特定节点的完成相关联的回调。
警告
这必须非常谨慎地使用,因为它可能会破坏图的功率/性能效率优化。
返回:vx_status_e枚举。
返回值
VX_SUCCESS- 已分配回调,任何其他值都表示失败。
VX_ERROR_INVALID_REFERENCE- node 不是有效的vx_node引用。
vxRetrieveNodeCallback
检索节点上设置的当前节点,回调函数指针。
vx_nodecomplete_f vxRetrieveNodeCallback(
vx_node node);
参数
[in] node - 对vx_node对象的引用。
返回:vx_nodecomplete_f指向回调函数的指针。
返回值
NULL- 未设置回调。
节点回调函数。
4. 框架:性能测量
定义性能测量和报告接口。
在OpenVX中,vx_graph对象和vx_node对象都跟踪性能信息。客户端可以使用其各自的vxQuery<object>函数,及其属性枚举VX_<object>_PERFORMANCE,以及VX_perf_t结构来查询任一对象类型,以获得性能信息。
vx_perf_t perf;
vxQueryNode(node, VX_NODE_PERFORMANCE, &perf, sizeof(perf));
数据结构
5. 数据结构
vx_perf_t
性能衡量结构。时间或持续时间以纳秒为单位。
typedef struct _vx_perf_t {
vx_uint64 tmp;
vx_uint64 beg;
vx_uint64 end;
vx_uint64 sum;
vx_uint64 avg;
vx_uint64 min;
vx_uint64 num;
vx_uint64 max;
} vx_perf_t;
tmp - 保存上次测量值。
beg - 保存集合中的第一个测量值。
end - 保存集合中的最后一个测量值。
sum - 保存持续时间的总和。
avg - 保存持续时间的平均值。
min - 保留持续时间的最小值。
num - 保存测量值的次数。
max - 保存持续时间的最大值。
3.3.2 框架:日志
定义调试日志记录接口。
调试接口允许客户端接收OpenVX的重要调试信息,如图3-3所示。有关可能的错误列表,参考vx_status_e。

图3-3 日志消息只有在安装回调后才能接收
类型定义
功能
1. 类型定义
vx_log_callback_f
日志回调函数。
typedef void (*vx_log_callback_f)(
vx_context context,
vx_reference ref,
vx_status status,
const vx_char string[]);
2. 函数
vxAddLogEntry
向日志中添加一行。
void vxAddLogEntry(
vx_reference ref,
vx_status status,
const char* message,
...);
人工智能芯片与自动驾驶

浙公网安备 33010602011771号