28、OpenVX 1.3 新特性及相关对象与节点介绍

OpenVX 1.3 新特性及相关对象与节点介绍

1. OpenVX 1.3 主要变化

OpenVX 1.3 有诸多显著变化,下面为你详细介绍:
- 双向参数移除 :移除双向参数消除了其引发的隐式循环,但给 OpenVX 实现的优化带来了一定负担。例如,累加节点原本在“原地”对累加参数进行操作,无需为输出图像创建单独的图像对象。为防止图中出现循环,用户在构建累加功能时必须创建一个单独的输出图像。而实现时,需要检测计算是否可以原地进行并进行适当优化。
- 用户结构 :OpenVX 标准一直有 vx_array 对象,用于存储数据结构集合。在之前版本中,数组元素的数据类型受限。而 OpenVX 1.3 引入了“用户结构体”概念,应用程序员可以创建自定义结构体。具体操作步骤如下:
1. 使用 vxRegisterUserStruct 函数注册结构体,并提供结构体的字节大小。
c vx_enum vxRegisterUserStruct(vx_context context, vx_size size);
2. 该注册函数会返回一个枚举值,可用于创建该用户结构体的数组。
3. 可选地,用户可以使用 vxRegisterUserStructWithName 函数将结构体与名称关联,除了提供大小外,还需提供一个名称字符串。
c vx_enum vxRegisterUserStructWithName(vx_context context, vx_size size, const char* name);
4. 之后可以使用 vxGetUserStructNameByEnum vxGetUserStructEnumByName 函数在名称和枚举值之间进行映射。
- 其他杂项更改 :OpenVX 1.3 还有一些小的更改,包括一些小的澄清和拼写错误的修正。此外,有两个新函数值得关注:
- vxCreateTensorFromHandle :类似于 vxCreateImageFromHandle ,可从现有数据创建张量对象。函数原型如下:
c 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);
- vxQueryMetaFormatAttribute :OpenVX 内核参数对象有各种元格式数据,之前版本允许用户在核输出验证器中设置元格式值,但不能查询现有元格式值。OpenVX 1.3 通过该新函数实现查询功能。函数原型如下:
c vx_status vxQueryMetaFormatAttribute( vx_meta_format meta, vx_enum attribute, void* ptr, vx_size size);

2. OpenVX 数据对象及其属性

OpenVX 包含多种数据对象,每种对象都有其特定属性,以下是部分常见数据对象及其属性的介绍:
| 数据对象 | 属性 | 数据类型 | 读写权限 | 说明 |
| — | — | — | — | — |
| vx_array | VX_ARRAY_ITEMTYPE | vx_enum | 只读 | 数组元素类型,使用 vx_type_e 枚举,如 VX_TYPE_FLOAT32 VX_TYPE_KEYPOINT |
| | 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 | 读写 | 卷积矩阵的缩放比例,使用 vxSetConvolutionAttribute 函数设置值,OpenVX 1.0 仅支持 2 的幂次方值,最大到 231 |
| | VX_CONVOLUTION_SIZE | vx_size | 只读 | 卷积矩阵的总字节大小 |
| vx_delay | VX_DELAY_TYPE | vx_enum | 只读 | 延迟对象中存储的对象类型,使用 vx_type_e 枚举 |
| | VX_DELAY_SLOTS | vx_size | 只读 | 延迟对象中的项数 |
| vx_distribution | VX_DISTRIBUTION_DIMENSIONS | vx_size | 只读 | 分布的维度数 |
| | VX_DISTRIBUTION_OFFSET | vx_int32 | 只读 | 分布中使用的值的起始值, vxHistogramNode 函数在计算要递增的 bin 之前会从像素强度中减去该属性值,强度低于此值的像素将被忽略 |
| | VX_DISTRIBUTION_RANGE | vx_uint32 | 只读 | 分布区间的连续值总数, vxHistogramNode 函数仅考虑强度低于 VX_DISTRIBUTION_OFFSET + VX_DISTRIBUTION_RANGE 的像素 |
| | VX_DISTRIBUTION_BINS | vx_size | 只读 | 分布中的 bin 数量 |
| | VX_DISTRIBUTION_WINDOW | vx_uint32 | 只读 | 分布中每个 bin 的宽度,等于 VX_DISTRIBUTION_RANGE 除以 VX_DISTRIBUTION_BINS |
| | 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 | 读写 | 图像颜色空间,使用 vxSetImageAttribute 函数更改值 |
| | VX_IMAGE_RANGE | vx_enum | 只读 | 图像通道范围 |
| | VX_IMAGE_MEMORY_TYPE | vx_enum | 只读 | 图像内存类型,仅用于通过 vxCreateImageFromHandle 函数创建的图像 |
| | VX_IMAGE_IS_UNIFORM | vx_bool | 只读 | 用于检查图像是否均匀,即所有像素值是否相同 |
| | VX_IMAGE_UNIFORM_VALUE | vx_pixel_value_t | 只读 | 均匀图像中每个像素的值 |

下面是一个简单的 mermaid 流程图,展示创建用户结构体数组的流程:

graph TD;
    A[开始] --> B[使用 vxRegisterUserStruct 注册结构体];
    B --> C[获取枚举值];
    C --> D[使用枚举值创建数组];
    D --> E[结束];

以上就是 OpenVX 1.3 的部分重要特性以及常见数据对象及其属性的介绍,下部分将继续介绍计算机视觉图 API 节点相关内容。

OpenVX 1.3 新特性及相关对象与节点介绍

3. 计算机视觉图 API 节点

OpenVX 包含丰富的计算机视觉图 API 节点,下面按类别为你详细介绍:

3.1 图像算术和控制流
节点名称 功能 使用示例
vxAbsDiffNode 计算两个图像的逐像素绝对差值 参考相关示例代码“vx_bg.c”
vxAddNode 计算两个图像的逐像素和 参考“stitch.c”示例
vxSubtractNode 计算两个图像的逐像素差 参考“stitch - multiband.c”示例
vxAndNode 计算两个图像的逐像素按位与 -
vxXorNode 计算两个图像的逐像素按位异或 -
vxOrNode 计算两个图像的逐像素按位或 参考“example4.c”示例
vxNotNode 计算图像的逐像素按位取反 参考“graphFactory.c”示例
vxCopyNode 复制一个数据对象 参考“example4a.c”示例
vxSelectNode 根据条件选择两个数据对象之一 -
vxScalarOperationNode 用于控制流的标量操作 -
vxMagnitudeNode 计算两个图像(如 x 和 y 方向的图像梯度)的逐像素幅值 参考“houghLines.c”示例
vxPhaseNode 计算两个图像(如 x 和 y 方向的图像梯度)的逐像素相位 -
vxMax 计算两个图像的逐像素最大值 -
vxMin 计算两个图像的逐像素最小值 -
vxMultiplyNode 计算两个图像的逐像素乘法 参考“stitch.c”示例
vxTableLookupNode 对图像的强度值进行逐像素任意映射 参考“stitch - multiband.c”示例
vxWeightedAverageNode 计算两个图像的加权平均值 -
3.2 图像格式转换
节点名称 功能 使用示例
vxChannelCombineNode 将多个单通道图像合并为一个多通道图像 参考“changeImage.c”和“houghLines.c”示例
vxChannelExtractNode 从多通道图像中提取单通道图像 参考“changeImage.c”和“houghLines.c”示例
vxColorConvertNode 转换图像的颜色空间 参考“changeImage.c”和“houghLines.c”示例
vxConvertDepthNode 将单通道图像转换为具有不同元素大小的图像(如 8 位无符号到 16 位有符号) 参考“example4a.c”和“stitch.c”示例
3.3 图像滤波和统计
节点名称 功能 使用示例
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”示例

下面是一个 mermaid 流程图,展示图像滤波操作的基本流程:

graph TD;
    A[输入图像] --> B[选择滤波节点];
    B --> C{是否有参数设置};
    C -- 是 --> D[设置参数];
    C -- 否 --> E[执行滤波操作];
    D --> E;
    E --> F[输出滤波后图像];
3.4 几何变换
节点名称 功能 使用示例
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 对图像进行仿射变换 -
vxWarpPerspectiveNode 对图像进行透视变换 参考“birdsEyeView.c”示例
3.5 特征提取
节点名称 功能 使用示例
vxCannyEdgeDetectorNode 进行 Canny 边缘检测 参考“filterImageROIvxu.c”示例
vxFastCornerNode 进行快速特征检测 参考“example4a.c”示例
vxHOGCellsNode 对平均梯度幅值和梯度方向直方图进行单元计算 -
vxHOGFeaturesNode 在整个图像上的滑动窗口中生成 HOG 特征 -
vxHarrisCornersNode 进行 Harris 角点检测 -
vxHistogramNode 计算图像直方图 -
vxEqualizeHistNode 对图像直方图进行均衡化 -
vxHoughLinesPNode 进行概率霍夫变换 参考“houghLines.c”示例
vxIntegralImageNode 计算积分图像 -
vxMatchTemplateNode 基于模板进行对象检测 -
vxNonMaxSuppressionNode 进行非极大值抑制,通常与 vxHarriscornersNode 等节点配合使用 -
vxOpticalFlowPyrLKNode 对图像序列进行 Lukas - Kanade 光流计算 -
3.6 张量函数
节点名称 功能 使用示例
vxTensorAddNode 计算两个张量的逐元素和 -
vxTensorConvertDepthNode 将张量转换为具有不同元素大小的张量(如 8 位无符号到 16 位有符号) -
vxTensorMatrixMultiplyNode 进行广义矩阵乘法 -
vxTensorMultiplyNode 计算两个张量的逐元素乘法 -
vxTensorSubtractNode 从一个张量中逐元素减去另一个张量 -
vxTensorTableLookupNode 使用查找表对张量元素值进行逐元素变换 -
vxTensorTransposeNode 对输入张量进行转置变换 -

综上所述,OpenVX 1.3 在功能上有了显著的提升,无论是新特性的引入,还是丰富的计算机视觉图 API 节点,都为计算机视觉开发提供了更强大的支持。开发者可以根据具体需求灵活运用这些特性和节点,实现高效的计算机视觉应用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值