You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义BoundingBox结构体转为vx_array并提取打印(OpenVX)

自定义结构体转OpenVX vx_array及元素提取打印实现

一、修正后的自定义结构体定义

注意:C语言中结构体成员不能直接在定义时初始化,需移除=0.f这类C++风格写法,确保OpenVX C环境兼容

typedef struct _FloatRectangle_T
{
    float32_t fStartX;
    float32_t fStartY;
    float32_t fEndX;
    float32_t fEndY;
} FloatRectangle_T;

typedef struct _BoundingBoxData_T
{
    FloatRectangle_T rec;
    float conf;
} BoundingBoxData_T;

二、结构体对象初始化

假设创建一个可容纳10个bounding box的数组并初始化指定元素:

BoundingBoxData_T bboxData[10];
int index = 0; // 示例操作索引
bboxData[index].rec.fStartX = 100.0f;
bboxData[index].rec.fStartY = 200.0f;
bboxData[index].rec.fEndX = 300.0f;
bboxData[index].rec.fEndY = 400.0f;
bboxData[index].conf = 1.0f;

三、转换为vx_array的正确实现

修正原代码中vxAddArrayItems的使用错误(该函数返回状态码而非数组对象),完整实现如下:

// 创建OpenVX上下文
vx_context m_vxContext = vxCreateContext();
if (m_vxContext == NULL) {
    // 上下文创建失败处理逻辑
    return -1;
}

// 注册自定义结构体类型
vx_enum e_vxBB = vxRegisterUserStruct(m_vxContext, sizeof(BoundingBoxData_T));
if (e_vxBB == VX_ERROR_INVALID_ENUM) {
    // 类型注册失败处理
    vxReleaseContext(&m_vxContext);
    return -1;
}

// 创建可容纳10个元素的vx_array
vx_array m_vxBB = vxCreateArray(m_vxContext, e_vxBB, 10);
if (m_vxBB == NULL) {
    // 数组创建失败处理
    vxReleaseContext(&m_vxContext);
    return -1;
}

// 向数组添加单个元素
vx_status status = vxAddArrayItems(m_vxBB, 1, &bboxData[index], sizeof(BoundingBoxData_T));
if (status != VX_SUCCESS) {
    // 添加元素失败处理
    vxReleaseArray(&m_vxBB);
    vxReleaseContext(&m_vxContext);
    return -1;
}

四、提取vx_array元素并打印

通过vxQueryArray获取元素数量,再用vxGetArrayItems提取元素并打印:

// 查询数组中已有的元素数量
vx_size itemCount;
status = vxQueryArray(m_vxBB, VX_ARRAY_ATTRIBUTE_NUMITEMS, &itemCount, sizeof(itemCount));
if (status != VX_SUCCESS) {
    // 查询失败处理
    vxReleaseArray(&m_vxBB);
    vxReleaseContext(&m_vxContext);
    return -1;
}

// 分配内存存储提取的元素
BoundingBoxData_T *extractedBBs = (BoundingBoxData_T*)malloc(itemCount * sizeof(BoundingBoxData_T));
if (extractedBBs == NULL) {
    // 内存分配失败处理
    vxReleaseArray(&m_vxBB);
    vxReleaseContext(&m_vxContext);
    return -1;
}

// 从vx_array中提取所有元素
status = vxGetArrayItems(m_vxBB, 0, itemCount, extractedBBs, sizeof(BoundingBoxData_T));
if (status != VX_SUCCESS) {
    // 提取失败处理
    free(extractedBBs);
    vxReleaseArray(&m_vxBB);
    vxReleaseContext(&m_vxContext);
    return -1;
}

// 打印提取的每个bounding box信息
for (vx_size i = 0; i < itemCount; i++) {
    printf("BoundingBox %zu:\n", i);
    printf("  起始坐标: (%.2f, %.2f)\n", extractedBBs[i].rec.fStartX, extractedBBs[i].rec.fStartY);
    printf("  结束坐标: (%.2f, %.2f)\n", extractedBBs[i].rec.fEndX, extractedBBs[i].rec.fEndY);
    printf("  置信度: %.2f\n", extractedBBs[i].conf);
}

// 释放所有资源
free(extractedBBs);
vxReleaseArray(&m_vxBB);
vxReleaseContext(&m_vxContext);

内容的提问来源于stack exchange,提问作者BraGa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:43:32