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);
- 可选地,用户可以使用
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 节点,这些特性为计算机视觉应用的开发提供了更强大的支持和更便捷的操作方式。开发者可以根据具体需求选择合适的数据对象和节点,构建高效的计算机视觉处理流程。
超级会员免费看

53

被折叠的 条评论
为什么被折叠?



