Operator FrameBufferMultiRoiDyn

操作员Library: Memory

该算子在 frame grabber RAM (DRAM) 中对输入图像数据进行缓冲,并为每个缓冲的图像读出多个动态感兴趣区域 (ROI)。要读出的 ROI 坐标是通过使用附加的输入链路来定义的。下图显示了该算子针对一个输入帧和四个 ROI 的行为概览。

需要一个类型为 RAM 的 VisualApplets 资源(参见 “分配设备资源”)。多个类型为 RAM 的资源会通过 “共享内存概念” 使用相同的物理 RAM。有关如何使用共享内存的文档,请参见 应用说明:共享内存。

所有 ROI 均作为单个图像按顺序读取:ROI 0、ROI 1、ROI 2... 直至 ROI N-1。N 是为一个输入帧要读出的 ROI 数量,即坐标输入端上的图像尺寸。只要不超过最大输入帧尺寸,就支持所有可能的矩形区域,换句话说,单个像素、单行、单列、矩形区域或完整帧都可以定义为 ROI。

不同的 ROI 不需要具有相同的尺寸。

每个 ROI 都可以单独定义。

ROI 之间可以相互重叠。

如果 ROI 图像为空(即不包含任何像素),算子将在其输出端提供一个空图像。空图像不包含任何像素。

负的 ROI 宽度 (XTopLeft > XBottomRight) 或 ROI 高度 (YTopLeft > YBottomRight) 也会导致输出端产生一个空的 ROI。 支持的最大 ROI 数量由 XTopLeft 输入链路上每幅图像的最大像素数决定:XTopLeft.MaxImageWidth * XTopLeft.MaxImageHeight 。

ROI 坐标通过四个独立的坐标输入链路以包含 ROI 坐标的图像形式提供: XTopLeft、YTopLeft、 XBottomRight、 YBottomRight。算子将这些图像中的每个像素都视为一组有效的 ROI 坐标。因此,ROI 输入图像的尺寸决定了输出 ROI 的数量。EoL(行结束)和不同的行长度可以使用,但会被忽略,因为对于算子的 ROI 输入,仅评估有效像素和 EoF (帧结束)。对于输入链路 I 上的每个输入图像,都需要一组新的 ROI 坐标图像。ROI 由左上角的 X、Y 坐标以及右下角的 X、Y 坐标定义。

请注意,ROI X 坐标经过转换以满足由其 Parallelism 定义的输入链路 I 的 X 粒度,即算子 FrameBufferMultiRoiDyn 只能以 Parallelism 的粒度进行切割。当寻址的像素不是 XTopLeft 并行分量的第一个像素,或不是 XBottomRight 并行分量的最后一个像素时,坐标会被向上或向下取整,并且生成的 ROI 仍将包含并行分量的所有像素。

以下部分通过一个示例来解释该算子的行为:

在此示例中,输入链路 I 上的 Parallelism = 4。

因此,XTopLeft 会被向下取整到并行分量的第一个像素:0、4、8、12、...,而 XBottomRight 会被向上取整到并行分量的最后一个像素:3、7、11、15、...

例如,对于 ROI X 坐标 3 和 7,ROI 的第一列是输入图像的第 3 列,最后一列是第 7 列。算子将 XTopLeft 向下取整为 0; XBottomRight 保持为 7。因此,宽度变为 8。ROI 高度不依赖于 Parallelism,因此可以为任何合法值。

[注意] 公式:

XTopLeft* = floor(XTopLeft / Parallelism) * Parallelism

XBottomRight* = ceil((XBottomRight + 1) / Parallelism) * Parallelism - 1

[注意] 例如:

在输入链路 I 上的 Parallelism 为 4 的情况下:

  • 112 到 551 变为 112 到 551。因此,宽度变为 = 551 - 112 + 1 = 440
  • 101 到 540 变为 100 到 543。因此,宽度变为 = 543 - 100 + 1 = 444

所有 4 个 ROI 输入彼此同步,即这些链路上的图像必须具有相同的尺寸并同时同步提供。当它们通过任意的 O 型模块网络由同一个 M 型模块提供源时,情况通常如此。有关更多信息,请参见“具有多个输入的 M 型算子”一节。

ROI 坐标与输入链路 I 异步。您可以使用 CreateBlankImage 算子来生成 ROI 坐标。

一旦完全缓冲了对应的输入帧(即接收到输入帧的 EoF(帧结束)信号),并且接收到每个 ROI 图像定义输入链路 XTopLeft、YTopLeft、 XBottomRight、YBottomRight 上的第一个像素,算子就会在其输出端提供 ROI 图像。如果 DRAM 中有足够空间,则可以在读取 ROI 的同时将后续输入帧写入 DRAM。RAM 带宽在写入和读取之间共享,但读取只能在写入对应的输入帧之后才能开始。在读取完输入帧的最后一个 ROI(由 ROI 图像定义输入链路上的最后一个像素定义,即接收到 ROI 图像的 EoF(帧结束))后,当前帧将被丢弃,并且下一个 ROI 图像将寻址下一个输入帧。有关算子延迟的信息,请参见表 46“Library Memory 中算子的各个延迟”。

该算子支持将图像数据缓冲到 DRAM 的两种模式,您可以通过参数 MaxFrameSizeMode 进行配置:

  • 对于 MaxFrameSizeMode = AUTO,DRAM 会缓冲具有最大图像尺寸的图像,即 I.MaxImgWidth * I.MaxImgHeight。

    小于最大图像尺寸的图像在缓冲时不会被修改。不过,读取 ROI 总是基于具有最大可能图像尺寸的缓冲帧进行。在这种情况下,缺失的帧像素会用随机数据 Fill,在后续处理中应被视为未定义。

  • 对于 MaxFrameSizeMode = CUSTOM,缓冲输入帧的最大尺寸由参数 MaxFrameWidth 和 MaxFrameHeight 定义。即使实际输入帧更大,超出指定参数尺寸的数据也会被丢弃(类似于没有偏移量的 ROI)。在这种情况下,DRAM 会为帧大小 MaxFrameWidth * MaxFrameHeight 保留 Memory。

在这两种情况下,都不会检查输入链接 ROI 坐标是否位于输入图像内。因为坐标可以设置为最大输入帧的任意像素。如果它们位于实际输入图像数据之外,算子会读取随机的虚拟值,但 ROI 大小不会改变。

该算子支持所有输入链接上的空帧、空行以及可变行长。

使用 InfiniteSource 的溢出管理

在 InfiniteSource 模式下,图像可能会丢失或损坏。发生这种情况的原因要么是 RAM 已满且无法接受任何更多数据,要么是输入带宽对于共享 Memory 接口而言过高。一旦算子达到溢出状态,所有传入数据都将被丢弃。这会导致帧丢失或损坏。只有在输入带宽过高的情况下才会出现损坏的图像,因为填充水平是按完整实体计算的。当图像的一部分已经写入 RAM,但由于输入带宽过高且 RAM 无法足够快地接受写入数据而导致图像的一部分被丢弃时,就会出现损坏的图像。因此,读取损坏的图像会导致未定义的输出数据。一旦 RAM 中有足够空间且共享 Memory 接口允许再次向 RAM 写入数据,算子就会从溢出中恢复并停止丢弃输入数据。Overflow 参数指示何时发生了溢出。通过 OverflowClearMode 参数,您可以定义是在溢出恢复后立即重置 Overflow 还是手动重置溢出。Overflow 和 OverflowClearMode 参数仅当 InfiniteSource 参数设置为 ENABLED 时方可使用。

算子限制

  • 输入链接的 Parallelism 必须是 2 的幂。

  • 该算子支持输入链接 I 上的空帧,但该帧的输出 ROI 会用随机虚拟值进行 Fill。

  • 如果输入图像小于写入 DRAM 的帧,则不会检查 ROI 坐标是否在输入图像内部。在这种情况下,算子会从 Memory 中读取随机虚拟值。

  • 最大链接 Property 因算子的使用情况而异。有关详细信息,请参阅下文的 Supported Link Format 一节。

带宽优化

为获得最佳性能,所使用的数据位数应尽可能与模块参数 RamDataWidth 中提供的值相匹配。当 bit width、kernel size 和 Parallelism 的乘积等于内部 RAM 端口宽度 RamDataWidth 时,穿过算子的最大带宽即告达到。请注意,内部 bit width 可能会因使用 kernel 而增加,但完整的 kernel 仍将作为单个像素寻址。

为了使算子能够处理超出 RAM 可用最大带宽的大量突发写入数据,请启用 WritePriority 参数。建议将此功能用于无限数据源,例如相机(InfiniteSource = ENABLED)。如果启用了 WritePriority 参数,则由于写入突发导致超出 RAM 可用带宽时,读取将被抑制。这允许对 RAM 进行临时更频繁的写入访问。如果相机产生写入突发,则预计该突发之后写入数据会出现间隙(否则会超出可用 RAM 带宽),然后该间隙可用于临时提高读取带宽。

I/O Properties

财产 值
操作员类型 M
输入链接 I,图像数据输入
XTopLeft,坐标数据输入
YTopLeft,坐标数据输入
XBottomRight,坐标数据输入
YBottomRight,坐标数据输入
输出链接 O,数据输出

Synchronous and Asynchronous Inputs

  • 4 个 ROI 坐标输入 XTopLeft、YTopLeft、XBottomRight 和 YBottomRight 彼此同步。
  • ROI 坐标输入 XTopLeft、YTopLeft、XBottomRight 和 YBottomRight 与输入链接 I 异步。

Supported Link Format

链接参数 输入链路 I 输入链路 XTopLeft 输入链路 YTopLeft 输入链路 XBottomRight 输入链路 YBottomRight 输出链路 O
Bit Width [1, 64]12 auto3 auto4 auto3 auto4 as I
Arithmetic {unsigned, signed} 未签名 未签名 未签名 未签名 as I
Parallelism 2^N,其中 N = {0,1,2...}2 1 1 1 1 as I
内核列 [1, RamDataWidth / Bit Width / Parallelism / KernelRows]2 1 1 1 1 as I
内核行 [1, RamDataWidth / Bit Width / Parallelism / KernelColumns]2 1 1 1 1 as I
图像协议 VALT_IMAGE2D VALT_IMAGE2D VALT_IMAGE2D VALT_IMAGE2D VALT_IMAGE2D as I
Color Format 任何 VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY as I
颜色口味 任何 FL_NONE FL_NONE FL_NONE FL_NONE as I
Max. Img Width 2^31 - 15 2^31 - 1 同 XTopLeft 同 XTopLeft 同 XTopLeft as I
Max. Img Height 2^RamAddressWidth5 2^31 - 1 同 XTopLeft 同 XTopLeft 同 XTopLeft as I

1

The range of the input bit width is:

  • For unsigned inputs: [1, 64]

  • 对于有符号输入:[2, 64]

  • 对于无符号彩色输入:[3, 63]

  • 对于有符号彩色输入:[6, 63]。

输入 bit width 不得超过原生 RAM 数据宽度 RamDataWidth。

2

bit width、Parallelism 和 kernel size 的乘积不得超过原生 RAM 数据宽度。

3

X 坐标输入的 bit width 为:

4

Y 坐标输入的 bit width 为:

5

输入链接 I 的最大图像宽度和图像高度因算子用途而异:

  • 对于 MaxFrameSizeMode = AUTO,I.MaxImageWidth 和 I.MaxImageHeight 的乘积必须适合可用的 RAM 大小。

  • 当 MaxFrameSizeMode = CUSTOM 时,I.MaxImageWidth 和 I.MaxImageHeight 均受最大 RAM 大小的限制。该产品可以超出总 RAM 大小,因为只有由参数 MaxFrameWidth 和 MaxFrameHeight 选择的子图像才会写入 RAM 中。

    由于每个 RAM 向量写入 I.Parallelism 个像素,因此 I.MaxImageWidth 可以超过 2^RamAddressWidth,但绝不能大于 2^31 - 1。

    I.MaxImageWidth 和 I.MaxImageHeight 的 bit widths 之和必须小于 48 bit。

参数

RamDataWidth
键入 静态写入参数
默认 不适用
范围 整数

此参数提供可在 RAM 中使用的最大数据宽度。

RamAddressWidth
键入 静态写入参数
默认 不适用
范围 整数

此参数提供可使用的地址位数。可用 RAM 插槽的数量由 2^RamAddressWidth 定义。当前 RamAddressWidth 取决于硬件平台以及设计中当前的内存算子(即使用 RAM 类型资源的算子)数量。

MaxFrameSizeMode
键入 动态写入参数
默认 Auto
范围 {Auto, Custom}

此参数用于定义参数 MaxFrameWidth 和 MaxFrameHeight 是应自动跟随输入 I 处的最大图像尺寸(mode=Auto),还是可以进行调整(mode=Custom)。Custom 模式允许设置针对应用程序定制的最大帧尺寸,该尺寸可能远小于输入链路定义的限制。通过这种方式,可以在 RAM 中存储更多帧。在 Auto 模式下,I 的链路属性(Max.Img Width 和 Max.Img Height)所定义的的最大图像不得大于内存中可用插槽的数量(2^RamAddressWidth)。如果 I 的链路属性 Max.Img Width 和 Max.Img Height 定义的最大图像大于可用内存空间,且您处于 Custom 模式,则在将输入链路上的最大图像定义得更小之前,将无法编辑 MaxFrameSizeMode 参数。采集运行期间无法写入此参数。

MaxFrameWidth
键入 动态写入参数
默认 1024
范围 [1, Max. Image Width at I]

此参数用于设置当前图像处理配置的最大图像宽度。超出此限制的输入帧行将被裁剪至 MaxFrameWidth。将此数字减小到最大图像宽度以下可节省内存空间并允许存储更多帧。仅当 MaxFrameSizeMode 设置为 Custom 时才能编辑此参数。MaxFrameHeight 与 MaxFrameWidth 的乘积不得大于可用内存插槽数 2^RamAddressWidth 乘以输入 Parallelism。采集运行期间无法编辑此参数。

MaxFrameHeight
键入 动态写入参数
默认 1024
范围 [1, Max. Image Height at I]

此参数用于设置当前图像处理配置的最大图像高度。超出此高度限制的输入帧将被裁剪至 MaxFrameHeight。将此数字减小到最大图像高度以下可节省内存空间并允许存储更多帧。仅当 MaxFrameSizeMode 设置为 Custom 时才能编辑此参数。MaxFrameHeight 与 MaxFrameWidth 的乘积不得大于可用内存插槽数 2^RamAddressWidth 乘以输入 Parallelism。采集运行期间不能编辑此参数。

FillLevel
键入 动态读取参数
默认 0
范围 [0%, 100%]

此参数提供 DRAM 的填充率(以百分比表示)。

MaxFrameCount
键入 动态读取参数
默认 2^RamAddressWidth / (MaxFrameHeight * (MaxFrameWidth / I.Parallelism))
范围 [1, 2^RamAddressWidth]

此参数提供当前适合内存的最大帧数。适合内存的最大帧数取决于参数 RamAddressWidth、MaxFrameHeight、I.Parallelism 和 MaxFrameWidth。

MaxFrameCount = 2^RamAddressWidth / (MaxFrameHeight * (MaxFrameWidth / I.Parallelism))

FrameCount
键入 动态读取参数
默认 0
范围 [0, MaxFrameCount]

此参数提供内存中的当前帧数。

InfiniteSource
键入 静态写入参数
默认 DISABLED
范围 {ENABLED, DISABLED}

该算子可以直接放置在设计中相机算子的正后方。在这种情况下,InfiniteSource 参数必须设置为 ENABLED。随后,该算子将执行主动溢出管理,并确保算子能够从溢出中正确恢复。当算子后方的的数据接收端停止或暂停传输且缓冲区填充水平达到最大值时,或者当输入带宽过高以致于写入数据无法传输到外部 RAM 时,均可能会发生溢出。当 InfiniteSource 设置为 DISABLED 时,如果缓冲区填充水平或输入带宽变得过高,将会生成一个禁止信号,以阻止后续算子传输数据。

建议在将任何算子与 InfiniteSource 配合使用时启用写入优先。因此,当 InfiniteSource 参数设置为 ENABLED 时,建议将 WritePriority 参数设置为 ENABLED。

更多信息请参见 'Infinite Sources / Connecting Cameras'。

WritePriority
键入 静态写入参数
默认 DISABLED
范围 {ENABLED, DISABLED}

' Shared Memory Concept ' 概念通常在所有连接的 memory 算子(即所有使用 RAM 类型资源的算子)之间平均分配带宽。如果 WritePriority 参数为 DISABLED,则 FrameBufferMultiRoiDyn 算子会为读取和写入分配相同的优先级。通过将 WritePriority 设置为 ENABLED,FrameBufferMultiRoiDyn 算子会优先处理写入而非读取,但仅在临时 memory 数据速率高于可用带宽时才会如此。临时优先处理写入数据会导致读取过程暂时变慢。因此,平均带宽不得超过 FrameBufferMultiRoiDyn 算子的可用带宽。建议在将任何算子与设置为 ENABLED 的 InfiniteSource 参数配合使用时启用写入优先。当将写入优先与可停止的源配合使用时,请确保写入带宽不会持续保持很高,否则将停止从 FrameBufferMultiRoiDyn 算子读取,直到缓冲区充满。由于写入优先是个别算子的配置,因此写入优先的影响会随着设计中增加更多的 memory 算子而减弱。

Overflow
键入 动态读取参数
默认 0
范围 [0, 3]

该参数指示缓冲区溢出。它是一个 2 位位图,其中每一位指示不同类型的溢出。位 0 表示填充水平溢出,位 1 表示写入带宽溢出。Overflow 的显示时间取决于所选的 OverflowClearMode。

仅当 InfiniteSource 参数设置为 ENABLED 时,Overflow 参数才处于活动状态

OverflowClearMode
键入 动态写入参数
默认 AutoClear
范围 {AutoClear, ManualClear, ClearAfterRead, ClearWithProcessReset}

OverflowClearMode 决定了当算子从溢出中恢复时如何清除 Overflow 参数。只有在算子不再处于溢出状态时,您才能使用此参数重置溢出状态。

清除模式:

  • AutoClear:当算子从溢出中恢复时,Overflow 参数会自动重置。

  • ManualClear:当算子从溢出中恢复时,Overflow 参数仍会显示溢出,直到通过将 ManualClear 写入 OverflowClearMode 参数进行手动重置。在此模式下,进程重置(例如 Acquisition Stop)不会清除 Overflow 参数,这意味着在 Acquisition Stop 后溢出仍然可见。

  • ClearAfterRead:当算子从溢出中恢复时,Overflow 参数仍会显示溢出,直到读取 Overflow 参数或发生进程重置(例如 Acquisition Stop 时)。

  • ClearWithProcessReset:当算子从溢出中恢复时,Overflow 参数仍会显示溢出,直到发生重置(例如 Acquisition Stop 时)。

仅当 InfiniteSource 参数设置为 ENABLED 时,OverflowClearMode 参数才处于活动状态