1 图相关
1.2 构图示例
下面这个例子是从一个输入的模糊图像中获取图像梯度大小与相位的例子:
构图代码:
// 创建context
vx_context context = vxCreateContext();
// 创建image参数,需要对用户可见所以定义为image类型
vx_image images[] = {
vxCreateImage(context, 640, 480, VX_DF_IMAGE_UYVY),
vxCreateImage(context, 640, 480, VX_DF_IMAGE_S16),
vxCreateImage(context, 640, 480, VX_DF_IMAGE_U8),
};
// 创建图
vx_graph graph = vxCreateGraph(context);
//创建图内部使用参数
vx_image virts[] = {
vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT),
vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT),
vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT),
vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT),
};
//向图中添加节点
vxChannelExtractNode(graph, images[0], VX_CHANNEL_Y, virts[0]),
vxGaussian3x3Node(graph, virts[0], virts[1]),
vxSobel3x3Node(graph, virts[1], virts[2], virts[3]),
vxMagnitudeNode(graph, virts[2], virts[3], images[1]),
vxPhaseNode(graph, virts[2], virts[3], images[2]),
//图验证,会在此过程中完成节点的连接,之后才算构图成功
status = vxVerifyGraph(graph);
if (status == VX_SUCCESS)
{
status = vxProcessGraph(graph);
}
vxReleaseContext(&context); /* this will release everything */
最终经过verify之后,构造的图如下:
图验证 verification:
OpenVX中的图在执行之前必须经过严格的验证,这样可以减少运行时参数检查的开销,执行之前经过严格的验证可以保证图的安全执行。图验证过程中需要检查:
- 节点的每一个required( vx_parameter_state_e )的参数都要经过检查,如果存在optional的参数,也要进行检查;
- 节点的每一参数都要有正确的方向(in or out), vx_direction_e;
- 参数必须是正确的数据类型,支持类型见 vx_type_e;
- 必须验证每个参数的属性或值是否合理,如输入是标量,需要检查值得范围,若输入image,可能要检查大小;
- 图必须是有向无环图。
- 虚拟对象得解析,对于定义得虚拟数据,需要根据node进行对应得创建;
1.2 回调
上面构造的图必须等待其执行完毕之后用户才可以得到结果,这时想拿中间结果也要等图全部执行完,为了更灵活,可以使用vxAssignNodeCallback 将函数作为node得参数,之后在node执行完毕之后就会执行此回调函数而不必等到图执行完毕;这样做得好处是更灵活,用户可能只需要图中某一个节点得结果就可以执行对应得操作,只需要对对应得node注册回调函数即可;
1.3 自定义kernel
用户在使用的时候,经常会有一些自己的需求,这些可能openvx提供的kernel不满足需要,为应对这种场景,openvx支持用户自定义函数;用户自定义内核时需要遵循相关的命名规范:
//申请唯一的标识符
#define VX_KERNEL_NAME_KHR_XYZ "org.khronos.example.xyz"
//构建kernel对应lib的ID
/*! \brief The XYZ Example Library Set
* \ingroup group_xyz_ext
*/
#define VX_LIBRARY_XYZ (0x3) // assigned