算子 BlobDetector1D

Operator Library: Blob

BlobDetector1D 算子用于检测二进制图像中具有无限高度的对象,并确定其 Property。该算子的输出是多条数据流,分别表示每个对象的 Property。

该算子的功能可以在 VisualApplets 中进行完全模拟。

另请参阅 Library Blob 简介。

BoundingBox、Area 以及 Center of Gravity X 和 Y 特征

BlobDetector1D 提供了 BoundingBox、Area 以及 Center of Gravity X 和 Y 特征。

[注意] Center of Gravity X 和 Y 不是算子的直接输出

输出端口 CenterX 和 CenterY 实际上提供图像矩 M10 (CenterX) 和 M01 (CenterY)。要提取对象的重心,您 必须将这些矩除以提取的面积:

BlobDetector1D 算子专为无尽的一维图像而设计。通常,对于 1D blob 分析,Bounding Box 和 Center of Gravity Y 对象特征与对象的位置相关,原点位于图像左上角。由于无法为无限量的行编制索引,因此在操作的某个时刻会发生 Y 坐标溢出。发生 Y 坐标溢出的行由 参数 LineCountBits 控制。每 2^LineCountBits 行,Y 坐标就会重置为 0。例如,如果 LineCountBits = 10,则最大 Y 坐标为 1023(= 2^10-1)。下一行被分配给 Y 坐标 = 0。虽然此限制对于 Bounding Box、Area 和 Center of Gravity X 特征不是问题,但 Center of Gravity Y 值会受到 Y 坐标溢出的影响:如果对象延伸超出溢出限制,则 Center of Gravity Y 值将损坏,如下图所示。在该 图形中,前景带有颜色。

[注意] 无法自动检测损坏的 Center of Gravity Y 值

对于跨越 Y 坐标边界的对象,无法自动检测损坏的 Center of Gravity Y 值。

Y 坐标重置的影响

图 399. Y 坐标重置的影响


算子逐行处理输入图像。由于算子 无法预测未来,因此稍后连接的区域起初可能显示为独立区域。因此,本文中单行内的相连像素被称为 对象伪影。 BlobDetector1D 算子检查这些对象 伪影是否与下一行的其他对象伪影重叠。这是为了 确定对象是真正独立,还是属于更大对象的一部分。算子可处理的对象伪影的最大数量由 LabelCount 参数定义。如果 对象伪影的数量超过 LabelCount 的值,则数据将丢失,并且不再保证对象结果的完整性。这称为 上下文损坏。数据丢失的行标有 Line Error 虚拟对象,可通过 ErrorFlag 识别。受损上下文中的所有后续对象都将被标记为此类。一旦通过刷新 applet 或重新启动 applet 重置上下文,上下文损坏即告结束。所有错误标志都在“Output Ports”一节中列出。

在大多数情况下,防止上下文损坏所需的标签数量 等于单行中对象伪影的最大数量。对于 neighborhood = 4 和 neighborhood = 8,所需的精确标签数量 略有不同:

  • 对于 neighborhood = 4,防止上下文损坏所需的标签数量 等于行 N 位置 X 处的任意像素与行 N+1 位置 X 处的像素之间 的对象伪影的最大数量。

  • 对于 neighborhood = 8,防止上下文损坏所需的标签数量 等于行 N 位置 X 处的任意像素与行 N+1 位置 X+1 处的像素之间 的对象伪影的最大数量。

如果您不确定所选的标签数量是否足以满足您的 使用场景,请在模拟中进行检查。

在实例化 BlobDetector1D 模块时,您可以 定义要创建哪些输出端口。通过启用/禁用端口,相应的特征也会自动启用/禁用。确认 这些端口后,将无法再对其进行更改。如果需要其他输出端口,必须 实例化另一个 BlobDetector1D 模块。

边界框高度限制与溢出事件

虽然 2D 图像格式由于帧结束而具有用于输出对象的内置最大延迟,但 1D 图像中的对象可能会永远无法到达其末尾。由于可能需要在一定时间内对对象作出反应,因此您可以定义最大边界框高度以及在边界框高度或其他特征数据达到溢出时提前输出特征数据。这些输出称为 溢出事件,并由 ErrorFlagsO 链路指示。您可以在算子 Property 中启用或 禁用溢出事件。如果某个特征溢出(并且 其 OverflowEvent 参数已启用),则对象 将以其中间状态输出。该对象在内部仍在处理和继续;输出只是已给出的对象的中间结果。

下图直观地展示了溢出事件的处理:前景 颜色为蓝色,“>”符号表示检测到溢出事件的位置。由于 grayscale 在超出最大 BoundingBox 高度的瞬间被触发, 因此中间对象的实际高度为 MaxBoundingBoxHeight + 1。这就是为什么显示边界框的高度为 7,而对象的特征值给出的输出为 1。

溢出事件的行为

图 400. 溢出事件的行为


性能

斑点检测器算子属于少数几个处理速度(即带宽) 取决于图像内容的算子。这些算子在凝聚行内前景像素和背景像素变化较小的图像上 表现最佳。因此,多行中的噪声或大量对象伪影 会显著降低数据吞吐量。不过,这仅适用于包含 极强噪声的图像。

延迟

该算子通过逐行处理输入图像来以最小延迟工作。一旦对象的末尾变得明确,算子就会立即将对象特征作为输出提供。因此,对象的输出发生在它结束的同一行中。这使得能够在算子仍在处理后续上下文的同时对已完成的对象特征进行后处理。

请注意,DMA 和某些其他算子会等待帧结束信号,然后才报告完成。

资源消耗

算子的资源消耗取决于已启用的特性、 用于特性的位数以及所选的标签数量。因此, Basler 建议禁用不需要的特性,并在设置 LabelCount 参数时保持谨慎。

[注意] 部分禁用边界框端口不会节省资源

边界框具有多个输出端口,因此只有在 所有端口均被禁用时,该特性才会禁用。 部分禁用边界框端口不会节省资源。

[注意] 手动设置最大值可节省资源

为了节省资源并改善设计的处理,如果您知道 要检测的对象的最大值,Basler 建议 手动为链接设置 Bit Width。

输入端口

Blob 检测器的 ImageI 输入期望获得 二进制(像素 Bit Width 为 1)1D 图像。该算子支持在操作期间输入不同的行长度以及空行。

该算子假定前景值为 ONE,背景值为 ZERO。请确保在 预二值化过程中满足此要求。

BlobDetector1D 算子有一个与 ImageI 同步的附加输入链路 FlushI。FlushI 终止活动上下文,这意味着它类似于虚拟帧结束 (End of Frame)。如果 FlushI 端口的任何传入像素为“1”,则会触发此终止,并且该终止将发生在该行的末尾。刷新会重新开始 blob 检测,从下一行开始,这也会将 Y 坐标重置为 0。由于 Flush 命令而输出的所有对象都通过 ErrorFlagsO 链路的第 14 位进行了明确标记。除此之外, ContextTermination 对象作为发出刷新的那一行的最后一个对象输出(由 ErrorFlagsO 链路的第 15 位标记)。 ContextTermination 是一个不包含任何有用特征数据的虚拟对象。

BlobDetector1D 算子的行为 在下图中进行了演示。前台像素(“1”)显示为蓝色。“>”指示在哪个行中输出对象。对象的命名 对应于存在于输出链路 ErrorFlagsO 上的其设定标签。

BlobDetector1D 算子的刷新行为

图 401. BlobDetector1D 算子的刷新行为


Output Ports

输出以 VALT_LINE1D 图像格式表示。每个 输出端口代表一个对象特征 / 对象 Property。它们是同步的,并且共同描述一个单一对象。每个输出像素提供已完成对象或错误状态对象的值。此输出是提取的对象还是错误状态对象由 ErrorFlagsO 输出端口指示。表示对象的像素出现在对象完成的同一行中。它们按完成的顺序输出。例如,两个对象在第 10 行结束。对象 A 的最后一个像素具有 X 坐标 42,对象 B 的最后一个像素具有 X 坐标 97。因此,对象 A 是算子输出端口处的第一个像素,对象 B 是 第二个像素。未完成对象且未发生错误的行是空的。

输出端口的宽度会根据给定的输入格式自动调整, 以防止特征数据溢出。或者,您也可以手动 配置输出端口的宽度。如果您已在算子 属性中启用了 Area/ CenterX/ CenterY,则可以对其链接 bit width 进行手动配置。

ErrorFlagsO 端口输出用于 溢出或附加信息标签的多个错误标志。每个位都保留用于特定的标志。 您可以在硬件的运行时环境中或在 模拟中查看这些错误标志。要在模拟中查看这些错误标志:

  • 向 BlobDetector1D 的 ErrorFlagsO 端口添加仿真探针。

  • 向仿真中添加会导致溢出的图像。

  • 运行仿真。

  • 打开输出端口的 Simulation Probe View。

  • 滚动到要检查的像素,放大以查看像素值并将像素值设置为 十六进制:
    仿真探针查看器中的 Error Flag

    图 402. 仿真探针查看器中的错误标志


  • 十六进制值中的活动位表示有关斑点(Blob)对象的不同错误或状态信息。有关详细信息,请参阅下表。

您可以在下方的参数说明中找到错误标志的详细说明。下表总结了这些说明:

Bit # 描述 提示
0 面积溢出

在其处理历史记录的某个时刻,对象的 Area 值超过了提供的输出 Bit Width。

1 Area OverflowEvent

在处理过程中,对象的 Area 值超过了提供的输出 Bit Width。生成的对象会标记溢出发生在哪一行。

2 CenterX 溢出

在处理历史记录的某些点,对象的 CenterX 值(图像矩 M10)超出了提供的输出 Bit Width。

3 CenterX OverflowEvent

在处理过程中,对象的 CenterX 值(图像矩 M10)超过了提供的输出 Bit Width。生成的对象会标记溢出发生在哪一行。

4 CenterY 溢出

在处理历史记录的某些点,对象的 CenterY 值(图像矩 M01)超出了提供的输出 Bit Width。

5 CenterY OverflowEvent

在处理过程中,对象的 CenterY 值(图像矩 M01)超过了提供的输出 Bit Width。生成的对象会标记溢出发生在哪一行。

6 BoundingBox 高度违规

BoundingBox 的高度在处理历史的某些时候超过了您为对象配置的参数值 MaxBoundingBoxHeight。

7 BoundingBox 高度违规事件

BoundingBox 的高度在处理过程中超过了您为对象配置的参数值 MaxBoundingBoxHeight。生成的对象会标记检测到高度违规的行。

8-11 保留

保留以供将来扩展。

12 线错误

指示虚拟对象,它标记了一行,在该行中发生的对象伪影数量超过了所选标签数量所能处理的范围。可用内存不足,无法处理更多传入数据。

由于这是一个虚拟对象,其他端口处的特征数据值不包含任何有用的数据。虽然特征值在仿真中显示为 0,但在硬件中它们可以是任何值。由于较低的 ErrorBits 7-0 绑定到已启用的特征及其值,因此这些标志在硬件中也可能与仿真有所不同。

如果此错误标志存在,它始终是一行的第一个对象输出。

13 上下文损坏

发生的对象伪影数量超过了所选标签数量所能处理的范围。可用内存不足,无法处理所有传入数据。无法保证被标记对象的完整性。

随着上下文的结束(即由 flush 触发)或通过重新启动在其中打开从设计构建的 HAP 文件的应用程序,算子将恢复正常功能。随后,处理下一行上下文时将不受先前上下文损坏的影响。

14 FlushedLine

由于通过 flush 强制终止上下文,已标记的对象会被输出。

15 ContextTermination

表示一个虚拟对象,它标记了触发 flush 的那一行中上下文的结束。

由于这是一个虚拟对象,其他端口上的特征数据不包含任何有用数据。虽然特征值在仿真中显示为 0,但在硬件中它们可以是任意值。由于较低的 ErrorBits 7-0 绑定到启用的特征及其值,硬件中的这些标志也可能与仿真有所不同。

在该虚拟对象之后输出的任何对象都属于新的上下文。

表 36. Blob 错误标志说明


I/O Property

Property 值
Operator Type M
输入链路 ImageI,数据输入
FlushI,数据输入
Output Links BoundingX0O,数据输出
BoundingX1O,数据输出
BoundingY1O,数据输出
BoundingHeightO,数据输出
AreaO,数据输出
CenterXO,数据输出
CenterYO,数据输出
ErrorFlagsO,数据输出

Supported Link Format

Link Parameter 输入链接 ImageI 输入链接 FlushI 输出 Link BoundingX0O 输出 Link BoundingX1O 输出 Link BoundingY1O 输出链接 BoundingHeightO 输出 Link AreaO 输出 Link CenterXO 输出 Link CenterYO 输出 Link ErrorFlagsO
Bit Width 1 1 auto1 auto1 auto2 auto3 [1, 48] / auto4 [1, 48] / auto4 [1, 48] / auto4 16
Arithmetic unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned
Parallelism {64} 64 1 1 1 1 1 1 1 1
Kernel Columns 1 1 1 1 1 1 1 1 1 1
Kernel Rows 1 1 1 1 1 1 1 1 1 1
Img Protocol VALT_Line1D VALT_Line1D VALT_Line1D VALT_Line1D VALT_Line1D VALT_Line1D VALT_Line1D VALT_Line1D VALT_Line1D VALT_Line1D
Color Format VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY VAF_GRAY
Color Flavor FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE FL_NONE
Max. Img Width 2^16 同 ImageI auto5 auto5 auto5 auto5 auto5 auto5 auto5 auto5
Max. Img Height any 同 ImageI 1 1 1 1 1 1 1 1

1

Bit Width 基于 ImageI 链接传入的最大图像宽度。其计算方式为 ceil(log2(Max. Img Width)).

2

Bit Width 由参数 LineCountBits 定义。

3

Bit Width 派生自参数 MaxBoundingBoxHeight。其计算方式为 ceil(log2(MaxBoundingBoxHeight)).

4

通过参数 AreaBitWidthMode、CenterXBitWidthMode 和 CenterYBitWidthMode,您可以选择手动配置链接还是使用自动模式。如果手动编辑链接,允许的范围为 [1, 48]。

5

最大图像宽度等于参数 LabelCount + 2。

参数

LabelCount
键入 static 参数
默认 100
范围 [1, (max. Img Width(Input Link I) / 2 + 2]

为了在内部跟踪部分对象,此参数可设置可用标签的数量。它还会影响一行中可输出的对象的最大数量。请注意,Blob_Detector_1D 算子所需的资源取决于标签的数量。此参数的良好取值范围在 100 到 500 之间,这对于大多数应用来说应该足够了。

如果出现比所选标签更多的部分对象,则会丢失数据,并且帧上下文会损毁。在这种情况下,输出连接 ErrorFlagsO 的第 13 位为“1”,表示提供的数据不再可靠。当检测到数据丢失时,将设置该错误位,并通过刷新或重新启动采集将其重置。

Neighborhood
键入 static 参数
默认 EightConnected
范围 {FourConnected, EightConnected}

此参数选择对象检测所需的邻域。有关像素邻域的详细解释,请参见 'Definition'。

LineCountBits
键入 static 参数
默认 10
范围 [1, 24]

此参数定义用于传入行的内部索引的位数。Y 坐标在索引 2^LineCountBits处重置。因此,例如使用 LineCountBits=10时,最大 Y 坐标为 1023 (2^10-1)。Y 坐标的后续行索引从 0 重新开始。

MaxBoundingBoxHeight
键入 static 参数
默认 256
范围 [1, 2^24]

此参数定义对象边界框允许的最大高度,即边界框跨越的最大行数。当边界框的高度超过 MaxBoundingBoxHeight 值时,高度将从 1 重新开始,并且相应的对象会被标记上 HeightViolation 标签(即 ErrorFlagsO 的第 6 位)。

GenerateBoundingBoxHeightViolationEvents
键入 static 参数
默认 true
范围 {true, false}

当对象的边界框高度超过 MaxBoundingBoxHeight 参数的值时,该对象将以其中间状态输出。该对象在内部仍然会继续处理,但结果只是该对象已输出的中间结果。由于 HeightViolation 事件而输出的对象会带有 ErrorFlagsO 的第 7 位标记。

AreaBitWidthMode
键入 static 参数
默认 AutomaticContextMaximum
范围 {AutomaticContextMaximum, LinkManuallyEditable}

对象的面积由所有对象前景像素的总和定义。

如果 AutomaticContextMaximum 被选中时, 算子会自动设置对象最大大小的位数。由于 1D 图像没有真正的最大高度,因此假定最大高度为 2^LineCountBits 。位宽的计算 考虑了输入连接 I 处的最大行宽以及通过 LineCountBits 参数定义的索引行数。如果所有行的所有像素都由前景值组成(即一个作为大型对象的白色输入图像),则可以实现对象的理论最大面积。

如果已知可能的最大对象大小,或者只对特定大小的对象感兴趣,Basler 建议使用 LinkManuallyEditable 模式。这可以节省资源并缩短整个设计的构建时间。在 LinkManuallyEditable 模式下,您可以在 [1, 48] 的允许范围内编辑连接的 bit width 属性。连接的 bit width 直接转化为内部用于计算 Area 特征的 bit width,从而影响整体资源消耗。

如果 bit width 不足以满足对象的 Area 值, 将由 ErrorFlagO 连接(第 0 位)进行指示。

GenerateAreaOverflowEvents
键入 static 参数
默认 false
范围 {true, false}

当对象的 Area 值 超过 AreaO 连接的 bit width 时, 该对象将以中间状态输出。该对象在内部仍然会继续处理,但它是该对象已输出的中间结果。由于 AreaOverflowEvent 事件而输出的对象带有 ErrorFlagsO 的第 1 位标记。

CenterXBitWidthMode
键入 static 参数
默认 AutomaticContextMaximum
范围 {AutomaticContextMaximum, LinkManuallyEditable}

有关重心特征的解释,请参见 'Center of Gravity'。

请注意,输出是图像矩 M10。要获取重心 X 的像素坐标, 可以使用 DIV 算子,或者在目标主机上将该值除以面积。

如果将 AutomaticContextMaximum时, 算子会自动设置对象最大大小的位数。由于 1D 图像没有真正的最大高度,因此假定最大高度为 2^LineCountBits 假设为行。Bit Width 的计算取决于输入链路 I 上的最大行宽以及您通过 LineCountBits 参数配置的索引行数。当对象的所有行的所有像素都由前景值组成(即一个作为大型对象的白色输入图像)时,对象将达到理论上的最大值。如果您使用较大的输入宽度和较高的 LineCountBits值,则 CenterXO 链路的 Bit Width 可能会变得非常高。

请注意,即使在自动模式下,最大值也被限制为 48 位。这意味着,仅仅因为将其设置为 AutomaticContextMaximum,该值也不一定足以防止溢出。

如果最大可能的 CenterX(图像矩 M10)值已知,或者仅对特定 X 坐标的对象感兴趣,Basler 建议使用 LinkManuallyEditable 模式。这可以节省资源并缩短整个设计的生成时间。在 LinkManuallyEditable 模式下,您可以在允许的范围 [1, 48] 内编辑链接的 Bit Width Property。链接的 Bit Width 直接转化为内部用于计算 CenterX 特征所使用的 Bit Width,因此会影响整体资源消耗。

如果 Bit Width 对于对象的 CenterX 值而言不够大,则会由 ErrorFlagO 链路(位 2)进行指示。

GenerateCenterXOverflowEvents
键入 static 参数
默认 false
范围 {true, false}

当对象的 CenterX 值超过 CenterX 链路的 Bit Width 时,对象将以中间状态输出。该对象在内部仍然会被处理和继续,但输出的是该对象的中间结果。由于 CenterX OverflowEvent 而输出的对象会在 ErrorFlagsO 的位 3 中进行标记。

CenterYBitWidthMode
键入 static 参数
默认 AutomaticContextMaximum
范围 {AutomaticContextMaximum, LinkManuallyEditable}

有关重心特征的解释,请参见 'Center of Gravity'。

请注意,输出的是图像矩 M10。若要获取重心 Y 的像素坐标,请使用 DIV 运算符,或者在主机 PC 上将该值除以面积。

如果将 AutomaticContextMaximum时, 算子会自动设置对象最大大小的位数。由于 1D 图像没有真正的最大高度,因此假定最大高度为 2^LineCountBits 假设为行。Bit Width 的计算取决于输入链路 I 上的最大行宽以及您通过 LineCountBits 参数配置的索引行数。当对象的所有行的所有像素都由前景值组成(即一个作为大型对象的白色输入图像)时,对象将达到理论上的最大值。如果您使用较大的输入宽度和较高的 LineCountBits值,则 CenterYO 链路的 Bit Width 可能会变得非常高。

请注意,即使在自动模式下,最大值也被限制为 48 位。这意味着,仅仅因为将其设置为 AutomaticContextMaximum,该值也不一定足以防止溢出。

如果最大可能的 CenterY(图像矩 M10)值已知,或者仅对特定 Y 坐标的对象感兴趣,Basler 建议使用 LinkManuallyEditable 模式。这可以节省资源并缩短整个设计的生成时间。在 LinkManuallyEditable 模式下,您可以在允许的范围 [1, 48] 内编辑链接的 Bit Width Property。链接的 Bit Width 直接转化为内部用于计算 Area 特征所使用的 Bit Width,因此会影响整体资源消耗。

如果 Bit Width 对于对象的 CenterY 值而言不够大,则会由 ErrorFlagO 链路(位 4)进行指示。

GenerateCenterYOverflowEvents
键入 static 参数
默认 false
范围 {true, false}

当对象的 CenterY 值超过 CenterY 链路的 Bit Width 时,对象将以中间状态输出。该对象在内部仍然会被处理和继续,但输出的是该对象的中间结果。由于 CenterY OverflowEvent 而输出的对象会在 ErrorFlagsO 的位 5 中进行标记。

使用示例

以下示例展示了 BlobDetector1D 运算符的使用方法:

  • 'BlobDetector1D'

    示例 - 展示了运算符 BlobDetector1D 在线扫描应用中的使用方法。