【OPENVX】对象基本使用之vx_node

#include <iostream>
#include <iomanip>
#include <VX/vx.h>

vx_image make_image(vx_context context, vx_int32 half_w, vx_int32 half_h)
{
    vx_image image = vxCreateImage(context, 100U, 100U, VX_DF_IMAGE_U8);

    vx_rectangle_t rect = {.start_x = 50U - half_w, .start_y = 50U - half_h, .end_x = 0U + half_w, .end_y = 50U + half_h};
    vx_image roi = vxCreateImageFromROI(image, &rect);

    vx_pixel_value_t pixel_white, pixel_black;
    pixel_white.U8 = 255;
    pixel_black.U8 = 0;

    vxSetImagePixelValues(roi, &pixel_white);

    return image;
}

int main(int argc, char *argv[])
{
    vx_status status = VX_SUCCESS;

    vx_context context = vxCreateContext();
    vx_graph graph = vxCreateGraph(context);

    vx_image input_image = vxCreateImage(context, 100U, 100U, VX_DF_IMAGE_U8);

    vx_float32 strength_thresh_value = 128.0f;
    vx_scalar strength_thresh = vxCreateScalar(context, VX_TYPE_FLOAT32, &strength_thresh_value);

    vx_array corners = vxCreateArray(context, VX_TYPE_KEYPOINT, 100);

    vx_size num_corners_value = 0;
    vx_scalar num_corners = vxCreateScalar(context, VX_TYPE_SIZE, &num_corners_value);

    vx_node node = vxFastCornersNode(graph, input_image, strength_thresh, vx_true_e, corners, num_corners);

    // 查询属性
    {
        vx_status node_state;
        vxQueryNode(node, (vx_enum)VX_NODE_STATUS, &node_state, sizeof(node_state));

        vx_directive_e performance;
        vxQueryNode(node, (vx_enum)VX_NODE_PERFORMANCE, &performance, sizeof(performance));

        vx_border_t border_mode;
        vxQueryNode(node, (vx_enum)VX_NODE_BORDER, &border_mode, sizeof(border_mode));

        // 指示kernel中局部内存的大小
        vx_size data_size;
        vxQueryNode(node, (vx_enum)VX_NODE_LOCAL_DATA_SIZE, &data_size, sizeof(data_size));

        // 指示kernel中局部内存的地址
        void *data_ptr;
        vxQueryNode(node, (vx_enum)VX_NODE_LOCAL_DATA_PTR, &data_ptr, sizeof(data_ptr));

        vx_uint32 num_params;
        vxQueryNode(node, (vx_enum)VX_NODE_PARAMETERS, &num_params, sizeof(num_params));

        vx_bool replicated;
        vxQueryNode(node, (vx_enum)VX_NODE_IS_REPLICATED, &replicated, sizeof(replicated));

        vx_bool *replicated_flags;
        vxQueryNode(node, (vx_enum)VX_NODE_REPLICATE_FLAGS, &replicated_flags, sizeof(replicated_flags));

        vx_bool rect_reset;
        vxQueryNode(node, (vx_enum)VX_NODE_VALID_RECT_RESET, &rect_reset, sizeof(rect_reset));
    }

    // 设置属性
    {
        vx_pixel_value_t pixel_value{.U8 = 128U};
        vx_border_t border_mode{.mode = VX_BORDER_CONSTANT, .constant_value = pixel_value};
        vxSetNodeAttribute(node, (vx_enum)VX_NODE_BORDER, &border_mode, sizeof(border_mode));
    }

    // 复制节点,用于处理存储在 vx_pyramid 或者 vx_object_array 中的对象集合
    // 指定节点 first_node 需要具有能够处理 vx_pyramid 第0层的参数或者 vx_object_array 中索引为 0 的对象的参数。
    // 复制的节点不能通过任何方式进行访问。
    // 当移除 first_node 时,所有的复制节点都被移除
    // first_node 节点的参数或属性发生变化,复制节点同步变化。
    // vxVerifyGraph 强制所有的复制节点具有相同的参数
    {
        vx_bool replicate[5]{vx_true_e, vx_true_e, vx_true_e, vx_true_e, vx_true_e};
        vxReplicateNode(graph, node, replicate, 5);
    }

    // 设置节点目标。运行成功后,使得节点所属的图失效。目前不知如何使用
    // vx_status vxSetNodeTarget(vx_node node, vx_enum target_enum, const char *target_string);

    // 从 graph 中移除节点,同时释放节点
    vxRemoveNode(&node);

    if (node != NULL)
        vxReleaseNode(&node);
    vxReleaseImage(&input_image);
    vxReleaseArray(&corners);
    vxReleaseScalar(&num_corners);
    vxReleaseScalar(&strength_thresh);

    vxReleaseGraph(&graph);
    vxReleaseContext(&context);
    return EXIT_SUCCESS;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhy29563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值