Operator Library: Blob
Blob_Analysis_1D 算子用于检测无限高度的二值图像中的对象并确定其属性。该算子的输出是多个代表每个对象属性的数据流。
![]() |
Blob_Analysis_1D 是一个旧版算子 |
|---|---|
|
Blob_Analysis_1D 算子是一个旧版算子,仅出于向后兼容的原因保留。在新设计中,请改用 BlobDetector1D。 |
![]() |
您可能需要的是 2D 算子 |
|---|---|
|
Blob_Analysis_1D 算子适用于对象位于任意位置的采集。如果在您的线扫描应用中,可以通过图像触发确定对象位置,请改用 Blob_Analysis_2D 算子。 |
本算子参考手册包含以下信息:
- 算子功能说明
- 1D 应用的时序模型
- 在 VisualApplets 高级仿真中使用算子
- 算子输入和输出端口
- I/O Property
- 支持的链接格式
- 参数
- 使用示例
有关斑点分析算子的总体介绍,必须阅读 Library Blob 中的介绍。
Blob Analysis 1D 算子专为无休止的一维图像而设计。通常,对于 2D Blob Analysis,对象特征与对象在帧中的位置相关,坐标原点是图像的左上角。对于无限高度的 1D 图像,这是不可能的。对象不能与 y 坐标相关联,因为该值会无限增长或导致溢出。
VisualApplets Blob Analysis 1D 算子允许使用对象可能处于任何位置的无休止图像。该算子扩展了一个参考输入“LineMarkerI”,对象与之相关联。例如,这可以是外部编码器和触发脉冲控制的 Counter 值。使用此方法,可以将通过斑点分析确定的每个对象分配到正确的参考位置。
输入链接“FlushI”用于刷新输出,即完成输出帧。例如,完成 DMA 传输需要执行此操作。
下图说明了 Blob Analysis 1D 算子的行为。它显示了算子输入端的示例数据以及生成的输出。左侧显示了由斑点分析处理的二值无休止图像。第二列表示 LineMarkerI 输入。在此,Counter 用于用参考值标记对象。为了更好地进行可视化,仅打印感兴趣的值。假设线标记输入的 Bit Width 为九位。因此,会在值 512 处发生溢出。第三列显示了刷新输入。在本示例中,只有一个刷新条件。右列表示斑点分析算子的输出。通过观察示例可以看出,图像连同线标记会在斑点分析期间进行处理。一旦某个对象完成,就会将其输出。所有对象的最终对象属性都标记有与相应对象的第一行图像一起设置的线标记。边界框坐标 X0 和 X1 类似于 Blob Analysis 2D 对象特征,而 Y1 坐标是对象的高度。Y0 坐标由 Blob Analysis 1D 算子的内部计数器产生。它从零开始,其最大值等于在算子 Property 对话框中设置的对象的最大高度。刷新条件会导致输出端出现帧结束标志。
与 2D 算子类似,Blob Analysis 1D 算子属于“M”类型,所有输出都是同步的。与 2D 相比,1D 算子具有三个输入。前两个输入“ImageI”和“LineMarkerI”是同步的,必须由同一个 M 型算子提供源。输入链接“FlushI”与图像异步,因此不需要任何同步。下图阐述了一种可能的配置(在众多配置中)。
如上所述,刷新用于完成输出帧,即生成帧结束标志。根据刷新输入的时序和图像中的对象,可能会生成空帧以及包含大量数据的输出帧。为了控制此行为,可以使用参数 output_frame_size_overflow_handling 和 suppress_empty_output_frames(参见下文参数说明)。以下波形图显示了参数设置、数据和刷新输入的各种组合的草图。“Blob Data”表示输出时序。
第一个示例显示了在达到最大帧大小后新帧的生成。斑点算子在输出完成输出帧的最后一个斑点之后生成帧结束。刷新信号将生成额外的帧结束:
下一个示例显示了对空输出帧的抑制。如您所见,第一次刷新被忽略。第二次刷新被延迟,直到有可用于输出的斑点。通过这种方式,算子可以延迟刷新输出:
在第三个示例中,我们可以看到 flush 输入端常数 1 的行为。由于 suppress_empty_output_frame 设置为 "yes",该算子将在每个 blob 输出之后生成一个帧结束信号。警告:如果 suppress_empty_output_frame 意外设置为 "no",常数 1 可能会导致数百万个帧结束信号。如果此输出连接到 VisualApplets 输出(DMA 算子),可能会导致 PC 过载!
最后一个示例展示了对象的丢弃情况,因为参数 "output_frame_size_overflow_handling" 被设置为 "discard_exceeding_objects"。
请注意,输出时序取决于输出流水线。如果数据无法被处理,即 blob 算子后面的后续算子阻塞了处理,则可能会丢失 flush 信号。
VisualApplets blob 分析算子是极少数处理速度(即带宽)取决于图像内容的算子之一。图像中的许多对象会导致庞大的对象列表,这可能会导致算子输入速度变慢。这仅适用于包含极强噪声的图像。在受控条件下,该算子的速度应该足够快。
该算子的设计旨在将延迟降至最低。输入图像逐行传输到 Blob Analysis。如果某个对象完全传输到算子中,一旦算子检测到其完成,就会立即输出该对象的特征。因此,Blob Analysis 会在对象完全传输到算子后立即将其输出。在仍在处理图像本身的同时,就可以开始对对象特征进行后处理。
请注意,DMA 和某些其他算子会等待帧结束信号,然后才会报告完成。请查阅 flush 输入的说明,了解 Blob_Analysis_1D 算子中的帧结束生成机制。
![]() |
谨慎使用 Blob_Analysis_1D 仿真 |
|---|---|
|
Blob 1D 仿真具有某些局限性。请务必谨慎使用仿真功能。 |
即使图像协议是 1D,VisualApplets 也使用普通的 2D 图像。因此,在仿真算子时,我们使用普通图像。每幅图像都是单独处理的。
算子的仿真与硬件行为不完全相同。存在两处差异:
-
对象特征输出的顺序在硬件和软件中可能有所不同。这是因为硬件输出取决于无法在 VisualApplets 中进行仿真的数据的时序。
-
第二个(也是最重要的)差异是 Flush 条件的行为。FlushI 输入与图像数据输入完全异步。FlushI 用于完成输出帧,即它会在输出流中插入帧结束标记。(参见上文以及下方的参数说明。)由于 flush 相对于图像数据是异步的,因此无法仿真出与硬件完全相同的行为。因此,VisualApplets 仿真使用了一种替代仿真模型。由于无法复制硬件的行为,因此故意将仿真模型实现得与硬件不同。它具有以下 Property:
-
仿真尝试通过对两个输入的像素进行计数,来比较数据输入和 flush 输入之间的相关性。因此,如果数据输入和 flush 输入具有相同的图像尺寸,则相关性与像素位置保持 1:1。但是,如果 flush 输入的像素较少(例如每行 1 个像素),则只有仿真会比较像素位置。
-
与硬件中根据对象的完成情况进行输出不同,flush 条件将根据对象的 Y0 坐标输出一个对象。
-
在输出图像的最后一个对象之后,所有后续的 flush 信号都将被忽略。因此在仿真中,输入端的 flush 信号数量与帧输出数量并不相关。
由于此行为,应谨慎使用仿真。
以下图形显示了微型图像上的一些示例,解释了在仿真中使用 flush 信号的一些特殊条件。
-
Blob Analysis 的 ImageI 输入由一个二值一维图像表示,即具有 1 bit 的 Bit Width、指定的宽度和无限高度的图像。最多可选择 32 像素的 Parallelism。前景值假定为 ONE,而背景值必须为 ZERO。在二值化过程中必须考虑这一点。
由于 LineMarkerI 输入与图像数据输入同步,因此这些连接必须具有相同的图像尺寸和 Parallelism。但是,该连接可以具有任意 Bit Width。每条图像线的 LineMarker 值必须保持恒定。
输入连接“FlushI”与其它输入连接异步。它可以具有任意 Bit Width、Parallelism 和图像尺寸。如果任何并行组件的输入位之一被置位,则 Blob Analysis 输出将被冲洗。
每个输出端口代表一个对象特征 / 对象 Property。这些端口上的每个输出值代表一个对象。因此,对象 Property 会产生数据流。输出数据流的长度等于图像中找到的对象数量,并且可以中断为几个子帧。每个输出端口的高度为 1 像素,并具有特定的长度。它们表示为灰度 2D 图像。
输出端口通过使用算子参数和输入的 Property 进行配置。直接更改连接 Property 是不可能的。
ErrorFlagsO 端口输出多个溢出错误标志。每个 bit 都保留用于一个特殊的标志。详细说明可以在下方的参数描述中找到。下表进行了总结:
| Bit # | 描述 | 对象相关 | 提示 |
|---|---|---|---|
| 0, 1 | 标签溢出 | 没有 |
Blob Analysis 检测到的对象太多,无法全部存储在 Memory 中。要增加两行图像内的最大对象数,可以更改算子参数“LabelBits”。 该标志在检测到时一直置位,直到数据输出帧结束。到目前为止输出的所有对象属性都是有效的。 对于 Blob Analysis 1D 算子,该标志仅在下一个有效数据输出时处于高电平状态一个时钟周期。 置位该标志后,blob 分析的输出可能会导致错误的对象属性。如果可用足够的对象标签,算子将恢复正常功能。 |
| 2 | 输出被截断 | 是 |
图像中的对象数量超过了在算子参数对话框中设置的最大输出宽度。该标志与适合输出宽度的最后一个对象一起置位。 |
| 3 | 对象大小超过最大值 | 是 |
如果 1D Blob Analysis 的对象超过其最大高度,则会置位该标志。算子会将该超限对象切割为较小的对象。连续的对象会带有该标志,以便检测切割情况。 对于 2D Blob Analysis,该标志位被设置为常数零。 |
| 4 | 面积被截断 | 是 |
对象的面积与错误标志超出了面积位所允许的范围。 |
| 5 | 重心 X 被截断 | 是 |
X 方向的重心超出了位数所允许的范围。 |
| 6 | 重心 Y 被截断 | 是 |
Y 方向的重心超出了位数所允许的范围。 |
| 7 | 轮廓长度溢出 | 是 |
轮廓长度超出了为该算子配置的位数所允许的范围。 |
表 38. Blob 错误标志说明
| Property | 值 |
|---|---|
| Operator Type | M |
| 输入链路 | ImageI,图像数据输入 LineMarkerI,数据输入 FlushI,数据输入 |
| Output Links | LineMarkerO,数据输出 BoundingX0O,数据输出 BoundingX1O,数据输出 BoundingY0O,数据输出 BoundingY1O,数据输出 AreaO,数据输出 CenterXO,数据输出 CenterYO,数据输出 ContourOrthoO,数据输出 ContourDiaO,数据输出 ErrorFlagsO,数据输出 |
同步和异步输入
- 同步组:ImageI、LineMarkerI
- FlushI 与该组异步。
| label_bits | |
|---|---|
| 键入 | static 参数 |
| 默认 | 7 |
| 范围 | [5, 31] |
|
此参数用于设置内部标记对象时所使用的位数。它还会影响由 2^label_bits 决定的两行图像中可能共存的最大对象数。请注意,Blob 分析所需的 Memory 资源几乎每增加一位就会翻倍。该参数的一个良好取值范围在 7 到 9 位之间,这对于几乎所有应用来说都应该足够了。 如果检测到此地址空间的溢出,运算符将在端口 "ErrorFlagsO" 的位 0 和位 1 上输出错误标志。这些标志在检测到溢出时置位,并在输出帧结束时清零。 |
|
| neighborhood | |
|---|---|
| 键入 | static 参数 |
| 默认 | eight_connected |
| 范围 | {four_connected, eight_connected} |
|
选择 Object Detection 所需的邻域。有关像素邻域的详细说明,请参阅 'Definition'。 |
|
| max_object_height_bits | |
|---|---|
| 键入 | static 参数 |
| 默认 | 10 |
| 范围 | [3, 31] |
|
需要此参数来指定对象的最大高度。例如,10 bit 的高度将不允许对象超过 1024 个图像线的高度。 如果对象超过此限制,它将被分割为两个或多个分离的对象。如果发生这种情况,ErrorFlagsO 端口的第 3 位处的错误标志将与恢复的对象一起置位。 |
|
| max_output_frame_size | |
|---|---|
| 键入 | static 参数 |
| 默认 | 65536 |
| 范围 | [1, 67108864] |
|
选择最大输出帧大小,即一个输出帧中的最大对象数。 |
|
| output_frame_size_overflow_handling | |
|---|---|
| 键入 | static 参数 |
| 默认 | generate_new_frame |
| 范围 | {generate_new_frame, discard_exceeding_objects} |
|
最大输出帧大小由参数 "max_output_frame_size" 指定。如果对象数量超过此大小,算子可以生成新帧或丢弃超出的对象。生成新帧会导致帧结束,即该帧已完成。如果丢弃对象,算子将在 ErrorFlagsO 端口的位编号 2 处输出一个错误标志,并伴随该帧的最后一个有效对象。 请注意,通过 flush 输入也会生成新帧。 |
|
| suppress_empty_output_frames | |
|---|---|
| 键入 | static 参数 |
| 默认 | 是 |
| 范围 | {yes, no} |
|
该参数用于抑制由 flush 条件且无对象数据引起的空输出帧。 详细的时序图可以在 'Generation of Output Frames - Flush, Empty Frames, Discarding Data' 中找到。 |
|
| line_marker | |
|---|---|
| 键入 | static 参数 |
| 默认 | used |
| 范围 | {used, not_used} |
|
每个对象的 "line_marker" 在 "LineMarkerO" 处输出。Bit Width 由输入 LineMarkerI 输入链路决定。如果未使用线标记,则 Bit Width 设置为 1,其输出为恒定的零。 |
|
| bounding_box_x0 | |
|---|---|
| 键入 | static 参数 |
| 默认 | used |
| 范围 | {used, not_used} |
|
边界框表示包围对象的最小轴平行矩形。每个坐标值均相对于图像的左上角。Bounding box X0 表示每个对象的最低 x 坐标。它在 "BoundingX0O" 处输出。Bit Width 由输入图像决定。如果未使用边界框,则 Bit Width 设置为一位,其输出为常数零。 |
|
| bounding_box_x1 | |
|---|---|
| 键入 | static 参数 |
| 默认 | used |
| 范围 | {used, not_used} |
|
边界框表示包围对象的最小轴平行矩形。每个坐标值均相对于图像的左上角。Bounding box X1 表示每个对象的最高 x 坐标。它在 "BoundingX1O" 处输出。Bit Width 由输入图像决定。如果未使用边界框,则 Bit Width 设置为一位,其输出为常数零。 |
|
| bounding_box_y0 | |
|---|---|
| 键入 | static 参数 |
| 默认 | used |
| 范围 | {used, not_used} |
|
边界框 y0 表示每个对象的最低 y 坐标。此坐标基于算子的内部 Counter。它从处理的第一行图像开始计数。其最大值等于通过参数 max_object_height_bits 设置的最大高度。发生溢出后,Counter 将重新从零开始。 此功能可以替代线标记使用。然而,线标记提供了更多的可能性并允许进行复杂的配置。 该功能在 "BoundingY0O" 处输出。Bit Width 由输入图像决定。如果未使用边界框,则 Bit Width 设置为 1,其输出为恒定的零。 |
|
| bounding_box_y1 | |
|---|---|
| 键入 | static 参数 |
| 默认 | used |
| 范围 | {used, not_used} |
|
对于 1D 算子(与 2D 算子相反),边界框 y1 表示对象的高度。它在 "BoundingY1O" 处输出。Bit Width 由输入图像决定。如果未使用边界框,则 Bit Width 设置为 1,其输出为恒定的零。 |
|
| area_mode | |
|---|---|
| 键入 | static 参数 |
| 默认 | use_area_with_maximum_required_bits |
| 范围 | {area_not_used, use_area_with_maximum_required_bits, use_area_with_specified_bits} |
|
对象的面积定义为所有对象前景像素的总和。此参数用于选择所需的面积模式。如果选择了 "use_area_with_maximum_required_bits",运算符将自动确定对象最大可能尺寸所需的 Bit Width。对象最大可能尺寸取决于输入链路 I 上的最大宽度和高度。如果图像的所有像素都由前景值组成(即由一个大对象组成的白色输入图像),则可达到对象的理论最大值。 如果用户可以确保对象不会超过指定的面积大小,则可以对此进行参数化设置。如果已知最大对象大小,请选择“use_area_with_specified_bits”。使用参数“area_bits”指定位数。如果完全不需要面积,请选择“area_not_used”。在“area_not_used”模式下,Bit Width 设置为 1,且输出端始终为常量零。 |
|
| area_bits | |
|---|---|
| 键入 | static 参数 |
| 默认 | not_used |
| 范围 | {not_used, used} |
|
仅当参数“area_mode”设置为“use_area_with_specified_bits”时,此参数才处于启用状态。如果对象的面积大于所选位数允许的范围,斑点分析将在输出链路“ErrorFlagsO”的第 4 位输出溢出标志。 |
|
| center_of_gravity_x_mode | |
|---|---|
| 键入 | static 参数 |
| 默认 | use_cX_with_maximum_required_bits |
| 范围 | {cX_not_used, use_cX_with_maximum_required_bits, use_cX_with_specified_bits} |
|
有关重心的说明,请参阅 'Center of Gravity'。 请注意,为了获得正确的结果,在斑点分析之后,必须将输出除以面积。 如果该参数设置为“use_cX_width_maximum_required_bits”,算子将自动确定输出 Bit Width。如果使用较大的输入图像,所需的 Bit Width 可能会非常高。 如果参数值使用“use_cX_with_specified_bits”,则 Bit Width 是可调节的。 如果不需要 x 方向的重心,可以通过选择“cX_not_used”将其关闭。 |
|
| center_of_gravity_x_bits | |
|---|---|
| 键入 | static 参数 |
| 默认 | 29 |
| 范围 | [2, auto] |
|
如果“center_of_gravity_x_mode”设置为“use_cX_with_specified_bits”,则可以在此处更改 Bit Width。否则,该参数将被禁用。 |
|
| center_of_gravity_x_overflow_flag | |
|---|---|
| 键入 | static 参数 |
| 默认 | not_used |
| 范围 | {not_used, used} |
|
如果手动设置 x 方向重心的 Bit Width,则此参数将被激活并可设置为“used”。如果检测到溢出,算子随后将在输出链路“ErrorFlagsO”的第 5 位输出 1。 |
|
| center_of_gravity_y_mode | |
|---|---|
| 键入 | static 参数 |
| 默认 | use_cY_with_maximum_required_bits |
| 范围 | {cY_not_used, use_cY_with_maximum_required_bits, use_cY_with_specified_bits} |
|
有关重心的说明,请参阅 'Center of Gravity'。 请注意,为了获得正确的结果,在斑点分析之后,必须将输出除以面积。 如果该参数设置为“use_cY_width_maximum_required_bits”,算子将自动确定输出 Bit Width。如果使用较大的输入图像,所需的 Bit Width 可能会非常高。 如果参数值使用“use_cY_with_specified_bits”,则 Bit Width 是可调节的。 如果不需要 y 方向的重心,可以通过选择“cY_not_used”将其关闭。 |
|
| center_of_gravity_y_bits | |
|---|---|
| 键入 | static 参数 |
| 默认 | 29 |
| 范围 | [2, auto] |
|
如果在 "center_of_gravity_y_mode" 中设置了 "use_cY_with_specified_bits",则可以在此处更改 bit 数。否则,该参数将被禁用。 |
|
| center_of_gravity_y_overflow_flag | |
|---|---|
| 键入 | static 参数 |
| 默认 | not_used |
| 范围 | {not_used, used} |
|
如果手动设置 y 方向重心的 bit 数,此参数将被激活并可设置为 "used"。如果检测到溢出,算子随后将在输出连接 "ErrorFlagsO" 的第 6 个 bit 上输出数字 1。 |
|
| contour_length_mode | |
|---|---|
| 键入 | static 参数 |
| 默认 | contour_length_not_used |
| 范围 | {contour_length_not_used, contour_length_used} |
|
对象的轮廓长度包括所有边缘,甚至包括孔洞处的边缘。详细解释请参见 'Contour Length'。 如果选择了此功能,可以根据所选的邻域,通过参数 "contour_length_bits_orthogonal_connected" 和 "contour_length_bits_diagonal_connected" 来选择所需的位数。如果选择了 4 邻域,则只能在正交方向上确定轮廓长度。如果选择了 8 邻域,则在正交和对角方向上确定轮廓长度。 |
|
| contour_length_bits_orthogonal_connected | |
|---|---|
| 键入 | static 参数 |
| 默认 | 16 |
| 范围 | [1, 31] |
|
如果将 "contour_length_mode" 设置为 "contour_length_used",则可在此处选择表示正交连接像素的轮廓长度所需的位数。 |
|
| contour_length_bits_diagonal_connected | |
|---|---|
| 键入 | static 参数 |
| 默认 | 16 |
| 范围 | [1, 31] |
|
如果将 "contour_length_mode" 设置为 "contour_length_used",则可在此处选择表示对角连接像素的轮廓长度所需的位数。只有在选择了 8 邻域时才可能这样做。否则,此参数将被禁用。 |
|
| contour_length_overflow_flag | |
|---|---|
| 键入 | static 参数 |
| 默认 | not_used |
| 范围 | {not_used, used} |
|
轮廓长度可能会导致溢出。如果使用了该标志,一旦发生溢出,就会在端口 "ErrorFlagsO" 的第 7 个 bit 上设置一个错误标志。 |
|
以下示例展示了 Blob_Analysis_1D 算子的使用方法:
-
示例 - 展示了运算符 Blob_Analysis_1D 在线扫描应用中的用法。

![[注意]](../common/images/admon/note.png)






![[警告]](../common/images/admon/warning.png)

























上一页

