VPI - Vision Programming Interface

3.2 版本

混合通道

概述

混合通道操作是从一组输入通道到一组输出通道的复制操作。输入和输出集合可以由任意数量的输入和输出图像给出,其中每个图像可以有一个或多个通道。

从输入到输出的通道映射由两个数组给出,一个包含输入通道的索引,另一个包含输出中相应的通道索引。

通道索引从零开始枚举,并在数组中提供的所有图像的所有通道中单调递增。例如,给定一个包含 3 个 RGB 图像的数组,索引 5 对应于第二个图像的 B 通道。

下表显示了混合通道用法的两个示例。左侧示例将 RGB 图像的每个通道提取到三个 RGB 图像中,分别位于对应的红色、绿色和蓝色通道中。其余通道保持不变。

输入参数输出
输入: [RGB8]
输出: [RGB8, RGB8, RGB8]
MappingIn: [0, 1, 2] MappingOut: [0, 4, 8]

实现

该算法实现为逐像素复制函数,它读取每个输入通道并将其写入相应的输出通道。该算法期望输入和输出图像平面大小匹配,即,它不会进行色度上/下采样。此外,该算法不会在输入和输出格式之间进行任何颜色或像素范围转换。但是,它会进行整数值和浮点值之间的转换。下溢和溢出按照 C 语言对此类类型转换的规则进行处理。有关图像格式转换(包括正确的颜色转换),请参阅 转换图像格式

所有输入和输出图像必须在调用混合通道操作之前分配。

下图显示了一些可能的通道混合示例。每个蓝色框代表一个通道,成组的框代表一个图像。通道框内的数字表示相对于图像的通道索引,框外的数字表示要在通道映射数组中使用的相应通道索引。请注意,同一个输入通道可以复制到多个输出通道,而未写入的输出通道保持其原始内容。

C API 函数

有关实现该算法的限制、约束和后端列表,请查阅以下函数的参考文档

函数描述
vpiSubmitMixChannels 向流提交 混合通道 操作。

用法

语言
  1. 导入 VPI 模块
    import vpi
  2. 从输入图像创建输出图像列表,所有图像都具有与输入相同的尺寸和格式。假设输入的格式为 vpi.Format.RGB8。
    outputs = [ vpi.Image(input.size, vpi.Format.RGB8),
    vpi.Image(input.size, vpi.Format.RGB8),
    vpi.Image(input.size, vpi.Format.RGB8) ]
  3. 运行混合通道算法。每个输入通道 (RGB) 都映射到 3 个输出图像中对应的通道,即,第一个图像的 R 通道接收输入的 R 通道,第二个图像的 G 通道接收输入的 G 通道,依此类推。其他输出通道保持不变,并保持其原始内容,在本例中,全部为零。结果是 3 个彩色图像,分别显示输入图像的红色、绿色和蓝色通道。
    with vpi.Backend.CPU
    vpi.mixchannels([input], outputs, [0, 1, 2], [0, 4, 8])
  1. 初始化阶段
    1. 包含定义混合通道算法函数的头文件。
      声明实现混合通道支持的函数。
    2. 定义输入图像,即一个 RGB8 图像。
      VPIImage input = /*...*/;
      struct VPIImageImpl * VPIImage
      图像句柄。
      定义: Types.h:256
    3. 创建输出图像,即三个与输入图像大小相同的 RGB8 图像。
      int32_t w, h;
      vpiImageGetSize(input, &w, &h);
      VPIImage outputs[3];
      for (int i = 0; i < 3; ++i)
      {
      vpiImageCreate(w, h, VPI_IMAGE_FORMAT_RGB8, 0, &outputs[i]);
      }
      #define VPI_IMAGE_FORMAT_RGB8
      具有交错 RGB 8 位通道的单平面。
      VPIStatus vpiImageCreate(int32_t width, int32_t height, VPIImageFormat fmt, uint64_t flags, VPIImage *img)
      使用指定的标志创建空的图像实例。
      VPIStatus vpiImageGetSize(VPIImage img, int32_t *width, int32_t *height)
      获取图像尺寸(以像素为单位)。
    4. 创建将在其中提交算法以执行的流。
      VPIStream stream;
      vpiStreamCreate(0, &stream);
      struct VPIStreamImpl * VPIStream
      流的句柄。
      定义: Types.h:250
      VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
      创建流实例。
  2. 处理阶段
    1. 初始化输入和输出映射数组,以便将每个输入通道 (RGB) 映射到 3 个输出图像中对应的通道,即,第一个图像的 R 通道接收输入的 R 通道,第二个图像的 G 通道接收输入的 G 通道,依此类推。其他输出通道保持不变,并保持其原始内容,在本例中,全部为零。结果是 3 个彩色图像,分别显示输入图像的红色、绿色和蓝色通道。
      int mappingIn[3] = {0, 1, 2};
      int mappingOut[3] = {0, 4, 8};
    2. 将算法及其参数提交到流。它将由 CPU 后端执行。在此示例中,有一个输入图像、三个输出图像和 3 个通道的映射。
      vpiSubmitMixChannels(stream, VPI_BACKEND_CPU, &input, 1, outputs, 3, mappingIn, mappingOut, 3);
      VPIStatus vpiSubmitMixChannels(VPIStream stream, uint64_t backend, VPIImage *inputs, int numInputs, VPIImage *outputs, int numOutputs, const int *inMapping, const int *outMapping, int numMapping)
      向流提交混合通道操作。
      @ VPI_BACKEND_CPU
      CPU 后端。
      定义: Types.h:92
    3. (可选)等待直到处理完成。
      vpiStreamSync(stream);
      VPIStatus vpiStreamSync(VPIStream stream)
      阻塞调用线程,直到此流队列中所有提交的命令完成(队列为空)。
  3. 清理阶段
    1. 释放流、输入图像和三个输出图像所持有的资源。
      for (int i = 0; i < 3; ++i)
      {
      vpiImageDestroy(outputs[i]);
      }
      void vpiImageDestroy(VPIImage img)
      销毁图像实例。
      void vpiStreamDestroy(VPIStream stream)
      销毁流实例并释放所有硬件资源。

有关更多信息,请参阅 VPI - 视觉编程接口 的“C API 参考”部分中的 混合通道

性能

有关如何使用下表中的性能信息,请参阅 算法性能表
在比较测量结果之前,请查阅 比较算法运行时间
有关性能基准测试方式的更多信息,请参阅 性能基准

 -