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 节点,都为计算机视觉开发提供了更强大的支持。开发者可以根据具体需求灵活运用这些特性和节点,实现高效的计算机视觉应用。
超级会员免费看
1901

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



