28、OpenVX 1.3 版本的更新与应用

OpenVX 1.3 版本的更新与应用

1. OpenVX 1.3 的主要变化

1.1 节点功能调整

移除双向参数虽然消除了其导致的隐式循环,但给 OpenVX 的实现带来了优化高效实现的负担。例如,累积节点在“原地”对累积参数进行操作,为防止图中出现循环,用户在构建累积功能时必须创建一个单独的输出图像。而实现者需要检测计算是否可以原地进行并进行适当优化。

1.2 用户结构的新特性

OpenVX 标准一直有 vx_array 对象,用于保存数据结构集合。在之前的版本中,数组元素的数据类型受限。OpenVX 1.3 引入了“用户结构体”的概念,应用程序员可以创建自定义结构体。具体操作步骤如下:
1. 使用 vxRegisterUserStruct 函数注册结构体,并提供结构体的字节大小。该函数返回一个枚举值,可用于创建该用户结构体的数组。

// 示例代码
vx_enum user_struct_enum = vxRegisterUserStruct(context, struct_size);
  1. 可选地,用户可以使用 vxRegisterUserStructWithName 函数将结构体与名称关联,除了提供大小外,还需提供一个名称字符串。之后可以使用 vxGetUserStructNameByEnum vxGetUserStructEnumByName 函数在名称和枚举之间进行映射。
// 示例代码
vx_enum user_struct_enum = vxRegisterUserStructWithName(context, struct_size, "user_struct_name");
const char* struct_name = vxGetUserStructNameByEnum(context, user_struct_enum);
vx_enum enum_value = vxGetUserStructEnumByName(context, "user_struct_name");

1.3 新增函数

1.3.1 vxCreateTensorFromHandle

该函数类似于 vxCreateImageFromHandle ,用于从现有数据创建张量对象。其函数原型如下:

vx_tensor vxCreateTensorFromHandle(
    vx_context context,
    vx_size number_of_dims,
    const vx_size* dims,
    vx_enum data_type,
    vx_int8 fixed_point_position,
    const vx_size* stride,
    void* ptr,
    vx_enum memory_type);

还有与 vxSwapImageHandle 类似的 vxSwapTensorHandle 函数,以及之前章节描述的映射和取消映射张量的函数。

1.3.2 vxQueryMetaFormatAttribute

OpenVX 内核参数对象有各种特定于对象类型的元格式数据。之前的版本允许用户在核输出验证器中设置元格式值,但不能查询现有元格式值。OpenVX 1.3 通过新的 vxQueryMetaFormatAttribute 函数实现了查询功能。其函数原型如下:

vx_status vxQueryMetaFormatAttribute(
    vx_meta_format meta,
    vx_enum attribute,
    void* ptr,
    vx_size size);

2. OpenVX 数据对象及其属性

2.1 数据对象列表

以下是 OpenVX 数据对象及其属性的列表:
| 数据对象 | 属性 | 数据类型 | 读写权限 | 描述 |
| — | — | — | — | — |
| vx_array | VX_ARRAY_ITEMTYPE | vx_enum | 只读 | 数组元素的类型 |
| | VX_ARRAY_NUMITEMS | vx_size | 只读 | 数组中的元素数量 |
| | VX_ARRAY_CAPACITY | vx_size | 只读 | 数组可容纳的最大元素数量 |
| | VX_ARRAY_ITEMSIZE | vx_size | 只读 | 每个数组元素的字节大小 |
| vx_convolution | VX_CONVOLUTION_ROWS | vx_size | 只读 | 卷积矩阵的行数 |
| | VX_CONVOLUTION_COLUMNS | vx_size | 只读 | 卷积矩阵的列数 |
| | VX_CONVOLUTION_SCALE | vx_uint32 | 读写 | 卷积矩阵的缩放比例 |
| | VX_CONVOLUTION_SIZE | vx_size | 只读 | 卷积矩阵的总字节大小 |
| vx_delay | VX_DELAY_TYPE | vx_enum | 只读 | 延迟对象中存储的对象类型 |
| | VX_DELAY_SLOTS | vx_size | 只读 | 延迟对象中的项数 |
| vx_distribution | VX_DISTRIBUTION_DIMENSIONS | vx_size | 只读 | 分布的维度数 |
| | VX_DISTRIBUTION_OFFSET | vx_int32 | 只读 | 分布中使用的值的起始位置 |
| | VX_DISTRIBUTION_RANGE | vx_uint32 | 只读 | 分布区间的连续值总数 |
| | VX_DISTRIBUTION_BINS | vx_size | 只读 | 分布中的箱数 |
| | VX_DISTRIBUTION_WINDOW | vx_uint32 | 只读 | 每个箱的宽度 |
| | VX_DISTRIBUTION_SIZE | vx_size | 只读 | 分布的总字节大小 |
| vx_image | VX_IMAGE_WIDTH | vx_uint32 | 只读 | 图像宽度 |
| | VX_IMAGE_HEIGHT | vx_uint32 | 只读 | 图像高度 |
| | VX_IMAGE_FORMAT | vx_df_image | 只读 | 图像格式 |
| | VX_IMAGE_PLANES | vx_size | 只读 | 图像中的平面数 |
| | VX_IMAGE_SPACE | vx_enum | 读写 | 图像颜色空间 |
| | VX_IMAGE_RANGE | vx_enum | 只读 | 图像通道范围 |
| | VX_IMAGE_MEMORY_TYPE | vx_enum | 只读 | 图像内存类型 |
| | VX_IMAGE_IS_UNIFORM | vx_bool | 只读 | 检查图像是否均匀 |
| | VX_IMAGE_UNIFORM_VALUE | vx_pixel_value_t | 只读 | 均匀图像中每个像素的值 |
| vx_lut | VX_LUT_TYPE | vx_enum | 只读 | 查找表的值类型 |
| | VX_TYPE_COUNT | - | - | 查找表中的元素数量限制 |
| | VX_LUT_SIZE | vx_size | 只读 | 查找表的总字节大小 |
| | VX_LUT_OFFSET | - | - | 输入值为零的索引 |
| vx_matrix | VX_MATRIX_TYPE | vx_enum | 只读 | 矩阵元素的类型 |
| | VX_MATRIX_ROWS | vx_size | 只读 | 矩阵的行数 |
| | VX_MATRIX_COLUMNS | vx_size | 只读 | 矩阵的列数 |
| | VX_MATRIX_SIZE | vx_size | 只读 | 矩阵的总字节大小 |
| | VX_MATRIX_ORIGIN | vx_coordinates2d_t | 只读 | 矩阵的原点 |
| | VX_MATRIX_PATTERN | vx_enum | 只读 | 矩阵模式 |
| vx_pyramid | VX_PYRAMID_LEVELS | vx_size | 只读 | 金字塔的层数 |
| | VX_PYRAMID_SCALE | vx_float32 | 只读 | 金字塔后续层大小的缩放因子 |
| | VX_PYRAMID_WIDTH | vx_uint32 | 只读 | 金字塔最高层图像的宽度 |
| | VX_PYRAMID_HEIGHT | vx_uint32 | 只读 | 金字塔最高层图像的高度 |
| | VX_PYRAMID_FORMAT | vx_df_image | 只读 | 金字塔中每个图像的格式 |
| Remap | VX_REMAP_SOURCE_WIDTH | vx_uint32 | 只读 | 源图像宽度 |
| | VX_REMAP_SOURCE_HEIGHT | vx_uint32 | 只读 | 源图像高度 |
| | VX_REMAP_DESTINATION_WIDTH | vx_uint32 | 只读 | 目标图像宽度 |
| | VX_REMAP_DESTINATION_HEIGHT | vx_uint32 | 只读 | 目标图像高度 |
| vx_scalar | VX_SCALAR_TYPE | vx_enum | 只读 | 标量对象包含的原始数据类型 |
| vx_threshold | VX_THRESHOLD_TYPE | vx_enum | 只读 | 阈值函数的类型 |
| | VX_THRESHOLD_INPUT_FORMAT | vx_enum | 只读 | 阈值函数的输入图像格式 |
| | VX_THRESHOLD_OUTPUT_FORMAT | vx_enum | 只读 | 阈值函数的输出图像格式 |
| vx_object_array | VX_OBJECT_ARRAY_ITEMTYPE | vx_enum | 只读 | 对象数组中项的类型 |
| | VX_OBJECT_ARRAY_NUMITEMS | vx_size | 只读 | 对象数组中的元素数量 |
| vx_tensor | VX_TENSOR_NUMBER_OF_DIMS | vx_size | 只读 | 张量的维度数 |
| | VX_TENSOR_DIMS | vx_size* | - | 维度大小 |
| | VX_TENSOR_DATA_TYPE | vx_enum | 只读 | 张量元素的类型 |
| | VX_TENSOR_FIXED_POINT_POSITION | vx_int8 | 只读 | 用整数值表示浮点值的定点位置 |

下面是创建和查询这些数据对象属性的流程图:

graph TD;
    A[开始] --> B[创建数据对象];
    B --> C{是否需要查询属性};
    C -- 是 --> D[选择数据对象类型];
    D --> E[选择属性];
    E --> F[调用相应查询函数];
    F --> G[获取属性值];
    G --> H[结束];
    C -- 否 --> H[结束];

3. 计算机视觉图 API 节点

3.1 节点分类概述

计算机视觉图 API 节点按照功能可以分为多个类别,这些节点在实现各种计算机视觉任务中起着重要作用。以下是各个类别的详细介绍:

3.2 图像算术和控制流节点

节点名称 功能 使用示例
vxAbsDiffNode 计算两个图像的逐像素绝对差 参考“vx_bg.c”示例
vxAddNode 计算两个图像的逐像素和 参考“stitch.c”示例
vxSubtractNode 计算两个图像的逐像素减法 参考“stitch - multiband.c”示例
vxAndNode 计算两个图像的逐像素按位与 -
vxXorNode 计算两个图像的逐像素按位异或 -
vxOrNode 计算两个图像的逐像素按位或 参考“example4.c”示例
vxNotNode 计算图像的逐像素按位非 参考“graphFactory.c”示例
vxCopyNode 复制数据对象 参考“example4a.c”示例
vxSelectNode 根据条件选择两个数据对象之一 参考第 4 章
vxScalarOperationNode 用于控制流的标量操作 -
vxMagnitudeNode 计算两个图像(如 x 和 y 方向的图像梯度)的逐像素幅度 参考“houghLines.c”示例
vxPhaseNode 计算两个图像(如 x 和 y 方向的图像梯度)的逐像素相位 -
vxMax 计算两个图像的逐像素最大值 -
vxMin 计算两个图像的逐像素最小值 -
vxMultiplyNode 计算两个图像的逐像素乘法 参考“stitch.c”示例
vxTableLookupNode 对强度值进行逐像素任意映射 参考“stitch - multiband.c”示例
vxWeightedAverageNode 计算两个图像的加权平均值 -

3.3 图像格式转换节点

节点名称 功能 使用示例
vxChannelCombineNode 将多个单通道图像合并为多通道图像 参考“changeImage.c”和“houghLines.c”示例
vxChannelExtractNode 从多通道图像中提取单通道图像 参考“changeImage.c”和“houghLines.c”示例
vxColorConvertNode 转换图像的颜色空间 参考“changeImage.c”和“houghLines.c”示例
vxConvertDepthNode 将单通道图像转换为具有不同元素大小的图像(如 8 位无符号到 16 位有符号) 参考“example4a.c”和“stitch.c”示例

3.4 图像滤波和统计节点

节点名称 功能 使用示例
vxBilateralFilterNode 对图像进行双边滤波 -
vxBox3x3Node 使用 3×3 核进行盒滤波 -
vxConvolveNode 进行任意线性卷积 参考“filterImage.c”示例
vxDilate3x3Node 对图像进行膨胀操作 参考“houghLines.c”示例
vxErode3x3Node 对图像进行腐蚀操作 参考“vx_bg.c”示例
vxGaussian3x3Node 使用 3×3 高斯滤波器对图像进行滤波 参考“filterGaussImage.c”示例
vxLBPNode 计算局部二值模式图像 -
vxMeanStdDevNode 计算图像的均值和标准差 -
vxMedian3x3Node 对图像进行中值滤波 -
vxMinMaxLocNode 计算图像中的最大和最小像素强度以及相应的像素位置 -
vxNonLinearFilterNode 计算非线性滤波器(如窗口上的中值函数) -
vxSobel3x3Node 对图像进行 3×3 Sobel 滤波 参考“houghLines.c”示例
vxThresholdNode 进行阈值操作 参考“houghLines.c”示例

3.5 几何变换节点

节点名称 功能 使用示例
vxGaussianPyramidNode 从图像创建高斯金字塔 参考“stitch - multiband.c”示例
vxLaplacianPyramidNode 从图像创建拉普拉斯金字塔 参考“stitch - multiband.c”示例
vxLaplacianReconstructNode 从拉普拉斯金字塔重建图像 参考“stitch - multiband.c”示例
vxRemapNode 对图像进行任意几何变换 参考“undistort - remap.c”示例
vxHalfScaleGaussianNode 通过高斯模糊在每个方向上将图像缩放 2 倍 参考“stitch - multiband.c”示例
vxScaleImageNode 调整图像大小 参考“houghLines.c”示例
vxWarpAffineNode 对图像进行仿射变换 参考第 6 章
vxWarpPerspectiveNode 对图像进行透视变换 参考“birdsEyeView.c”示例

3.6 特征提取节点

节点名称 功能 使用示例
vxCannyEdgeDetectorNode 进行 Canny 边缘检测 参考“filterImageROIvxu.c”示例
vxFastCornerNode 进行快速特征检测 参考“example4a.c”示例
vxHOGCellsNode 对平均梯度幅度和梯度方向直方图进行单元计算 -
vxHOGFeaturesNode 在整个图像的滑动窗口中生成 HOG 特征 -
vxHarrisCornersNode 进行 Harris 角点检测 参考第 4 章
vxHistogramNode 计算图像直方图 -
vxEqualizeHistNode 均衡图像直方图 -
vxHoughLinesPNode 进行概率霍夫变换 参考“houghLines.c”示例
vxIntegralImageNode 计算积分图像 -
vxMatchTemplateNode 基于模板的对象检测 -
vxNonMaxSuppressionNode 进行非极大值抑制,用于与 vxHarriscornersNode 等节点配合使用 -
vxOpticalFlowPyrLKNode 对图像序列进行 Lukas - Kanade 光流计算 参考第 9 章

3.7 张量函数节点

节点名称 功能 使用示例
vxTensorAddNode 计算两个张量的逐元素和 -
vxTensorConvertDepthNode 将张量转换为具有不同元素大小的张量(如 8 位无符号到 16 位有符号) -
vxTensorMatrixMultiplyNode 广义矩阵乘法节点 -
vxTensorMultiplyNode 计算两个张量的逐元素乘法 -
vxTensorSubtractNode 从一个张量中逐元素减去另一个张量 -
vxTensorTableLookupNode 使用查找表对张量元素值进行逐元素变换 -
vxTensorTransposeNode 对输入张量进行转置变换 -

下面是使用这些计算机视觉图 API 节点构建图的流程图:

graph TD;
    A[开始] --> B[选择节点类别];
    B --> C[选择具体节点];
    C --> D[配置节点参数];
    D --> E[将节点添加到图中];
    E --> F{是否还有其他节点};
    F -- 是 --> B;
    F -- 否 --> G[编译图];
    G --> H[执行图];
    H --> I[结束];

综上所述,OpenVX 1.3 版本在节点功能、用户结构、新增函数等方面都有重要更新,同时提供了丰富的数据对象和计算机视觉图 API 节点,这些特性为计算机视觉应用的开发提供了更强大的支持和更便捷的操作方式。开发者可以根据具体需求选择合适的数据对象和节点,构建高效的计算机视觉处理流程。

内容概要:本文介绍了一个基于多传感器融合的定位系统设计方案,采用GPS、里程计和电子罗盘作为定位传感器,利用扩展卡尔曼滤波(EKF)算法对多源传感器数据进行融合处理,最终输出目标的滤波后位置信息,并提供了完整的Matlab代码实现。该方法有效提升了定位精度稳定性,尤其适用于存在单一传感器误差或信号丢失的复杂环境,如自动驾驶、移动采用GPS、里程计和电子罗盘作为定位传感器,EKF作为多传感器的融合算法,最终输出目标的滤波位置(Matlab代码实现)机器人导航等领域。文中详细阐述了各传感器的数据建模方式、状态转移观测方程构建,以及EKF算法的具体实现步骤,具有较强的工程实践价值。; 适合人群:具备一定Matlab编程基础,熟悉传感器原理和滤波算法的高校研究生、科研人员及从事自动驾驶、机器人导航等相关领域的工程技术人员。; 使用场景及目标:①学习和掌握多传感器融合的基本理论实现方法;②应用于移动机器人、无人车、无人机等系统的高精度定位导航开发;③作为EKF算法在实际工程中应用的教学案例或项目参考; 阅读建议:建议读者结合Matlab代码逐行理解算法实现过程,重点关注状态预测观测更新模块的设计逻辑,可尝试引入真实传感器数据或仿真噪声环境以验证算法鲁棒性,并进一步拓展至UKF、PF等更高级滤波算法的研究对比。
内容概要:文章围绕智能汽车新一代传感器的发展趋势,重点阐述了BEV(鸟瞰图视角)端到端感知融合架构如何成为智能驾驶感知系统的新范式。传统后融合前融合方案因信息丢失或算力需求过高难以满足高阶智驾需求,而基于Transformer的BEV融合方案通过统一坐标系下的多源传感器特征融合,在保证感知精度的同时兼顾算力可行性,显著提升复杂场景下的鲁棒性系统可靠性。此外,文章指出BEV模型落地面临大算力依赖高数据成本的挑战,提出“数据采集-模型训练-算法迭代-数据反哺”的高效数据闭环体系,通过自动化标注长尾数据反馈实现算法持续进化,降低对人工标注的依赖,提升数据利用效率。典型企业案例进一步验证了该路径的技术可行性经济价值。; 适合人群:从事汽车电子、智能驾驶感知算法研发的工程师,以及关注自动驾驶技术趋势的产品经理和技术管理者;具备一定自动驾驶基础知识,希望深入了解BEV架构数据闭环机制的专业人士。; 使用场景及目标:①理解BEV+Transformer为何成为当前感知融合的主流技术路线;②掌握数据闭环在BEV模型迭代中的关键作用及其工程实现逻辑;③为智能驾驶系统架构设计、传感器选型算法优化提供决策参考; 阅读建议:本文侧重技术趋势分析系统级思考,建议结合实际项目背景阅读,重点关注BEV融合逻辑数据闭环构建方法,并可延伸研究相关企业在舱泊一体等场景的应用实践。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值