如何将自定义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
相关产品推荐
相关产品推荐

