应用笔记:Blob 分析#
您将学习如何在 VisualApplets 中将 Blob Analysis 算子与其他算子结合使用。这些示例展示了如何在 FPGA 内部使用 Blob Analysis 算子进行基本的 Object Detection 和分类。行式 applet 展示了 Blob Analysis 1D 算子的使用。此外,还提供了针对这些示例的 C++ SDK 项目,有助于理解如何在 PC 端解释 Blob Analysis 结果。(应用说明 SAN011)
以下设计示例阐释了 VisualApplets blob analysis 算子的使用:
- 包含用于对象可视化的 SDK 项目的简单 Blob Analysis 应用:此示例使用 Blob Analysis 进行基本的 Object Detection。所有检测到的对象都会传输到主控 PC。
- 使用 Blob Analysis 进行分类和 ROI 选择:此示例展示了如何在 FPGA 内部使用 Blob Analysis 进行 Object Detection 和分类。
- Blob Analysis 1D:此示例解释了如何将 Blob Analysis 1D 算子用于无尽的线扫描图像。
包含用于对象可视化的 SDK 项目的简单 Blob 分析应用#
第一个示例是一个基本的 Blob Analysis applet。首先对相机图像进行二值化。接下来,将二值图像发送至一个 DMA 通道,而在另一个通道上执行 Blob Analysis,并通过第二个 DMA 通道输出结果。
本示例中使用的二值化基于简单的阈值处理。Blob Analysis 将每个白色像素视为主体像素。图 2 显示了使用两个阈值选择前景值范围。这使得图像能够包含由暗像素组成的对象,或者与背景相比对象对比度更亮的图像。二值化完成后,会对图像进行缓存。图像从缓冲区传递到 Blob Analysis,并传输到主控 PC 以监视二值化图像。
Blob Analysis 参数的配置如下图所示:
在上图中,您可以看到 Blob Analysis 数据是如何合并到一个 link 中的。在本示例中,特征 Bounding Box 和 Area 被使用。首先,将每个 16Bits 的 bounding box link 合并在一起,从而产生 64 Bits 的 link 宽度。区域也扩展到 64Bits。使用 InsertPixel 算子,这两个链接会合并在一起。因此,生成的 DMA 传输将采用以下格式:
适用于 Simple Blob2D Applet 的 Blob DMA 字节顺序#
| 字节编号 | 对象特征 |
|---|---|
| 0 至 1 | 边界框 X0 |
| 2 至 3 | 边界框 X1 |
| 4 至 5 | 边界框 Y0 |
| 6 至 7 | 边界框 Y1 |
| 8 至 15 | 面积 |
请注意 PC 中不同的字节顺序。对象特征的 Bit Width 会被扩展。实际上,Bounding Box 仅使用 10Bits 来表示 0 到 1023 之间的值,而 Area 仅使用 21Bits。本 applet 附带一个小型 SDK C++ 项目以展示其功能。它与设计文件一起存放在以下文件夹中: Examples\Processing\BlobAnalysis\Blob2D 位于 VisualApplets 安装路径下。
使用 Blob 分析进行分类和 ROI 选择#
此示例展示了一种根据提取的对象特征来裁剪感兴趣区域 (ROI) 的方法。其目的是找到具有最大面积的对象,并提取该对象的重心以用于形成 ROI。
该示例展示了 VisualApplets 能够利用 Blob Analysis 结果在 applet 内部进行分类,从而显着增强采集卡内部的图像处理能力。图 1 显示了设计的屏幕截图。主要部分包括二值化、Blob Analysis、分类和 ROI 裁剪。这些部分将在下文中详细解释。
本示例中使用的二值化基于简单的阈值处理。Blob Analysis 将每个白色像素视为主体像素。图 2 显示了使用两个阈值选择前景值范围。这使得图像能够包含由暗像素组成的对象,或者与背景相比对象对比度更亮的图像。二值化完成后,会对图像进行缓存。图像从缓冲区传递到 Blob Analysis,并传输到主控 PC 以监视二值化图像。
Blob Analysis 在二值化之后执行。在此,仅使用 x 和 y 方向的重心以及面积这几个对象特征进行后续处理。本示例中未使用所有其他特征。
接下来,applet 对 Blob Analysis 结果进行分类(图 3)。首先,通过将重心值除以面积来对其进行归一化。这只需使用 DIV 算子即可轻松完成。同时,执行检测最大面积对象的任务。在此,使用算子 FrameMax 和寄存器。分类算法的核心思想是:抑制掉任何面积小于迄今为止所调查对象的对象。具体而言,Blob Analysis 会输出一个对象流。 FrameMax 算子用于检测当前对象是否大于迄今为止调查过的对象,并在其输出端 IsMax输出逻辑 1。该值用于寄存器的 Capture 输入端。如果当前对象大于先前的对象,则将重心坐标锁存至输出端。因此,该帧(即 blob 流)的最后一个输出代表具有最大面积的对象的重心坐标。图 3 展示了这一行为。
现在,分类模块会输出图像中找到的最大的对象的重心坐标。接下来,必须将坐标转换为 ROI 坐标 XOffset, XLength, YOffset 和 YLength。图 4 显示了此转换的设计。其中 XLength 和 YLength 设为常数,而重心坐标则减去 ROI 大小的一半。
现在使用这四个 ROI 值,通过 DynamicROI 算子从原始图像中裁剪出 ROI。如前所述,分类模块输出帧中最后一个值对应的最大面积对象。这很有利,因为 DynamicROI 算子仅考虑接收到的最后一组 ROI 坐标。因此,可以使用正确的坐标并从原始图像中裁剪出最大的对象。该 VisualApplets 项目的设计文件可在文件夹 Examples\Processing\BlobAnalysis\Blob2D_ROI_select 中找到,该文件夹位于 VisualApplets 安装路径中。该 applet 可以在 microDisplay 中运行,并且可以直接看到结果。此外,该示例中还添加了一个小型 SDK 项目。要使用该 SDK 项目,必须将 ROI 的 DMA 大小更改为模块 ROIsizeX 和 ROIsizeY。使用 display microDisplay 中的设置或 widht1 和 height1 参数来执行调整。
1D Blob 分析#
Blob Analysis 1D 示例阐释了在 VisualApplets 环境中一维 blob 算子的使用。
1D Blob Analysis 示例是一个基于线阵相机的简单小应用程序 (applet)。该相机仅与行触发器配合使用。因此,该 applet 基于真正的 1D 图像。对于 DMA 传输,原始图像被转换为连续的小行片段,从而形成一个 2D 图像。applet 的所有部件将在下文中进行详细说明。图 1 展示了设计的主图纸。
在采集方面,连接到 ImageBuffer 的线阵相机算子将被使用。该缓冲区允许对 1D 图像行进行缓冲。接下来,在层级框 Binarize 中,执行简单的阈值处理,将像素转换为前景像素和背景像素。选择器允许将原始图像和二值图像切换到图像输出路径。这可以通过 IF 算子和一个 CONST 算子轻松实现。 dynamic 算子的 CONST 参数允许修改 IF 算子的条件输入以切换其输入。因此,在运行时可以在原始灰度图像和二值化图像之间进行切换。
由于该 applet 的应用目的是可视化在原始图像中找到的对象,因此需要允许对 PC 中的两个 DMA 通道进行同步。行标记用于标记原始图像的每一行和每个 blob。因此,使用 Counter 来计算每一行。行 Counter 包含在层级框 1DBlobAnalysis 中,连同 blob 分析算子一起,行计数值通过上链接 O000 离开该框。Counter 的范围为 10 位。因此,当值达到 1024 时会发生溢出,并且 Counter 从零开始重新计数。
在 ReplaceFirstPixelByLineNo 一行的前四个像素被行号替换。为此,Parallelism 被更改,以便在 32 位粒度下进行操作。x 坐标为 count,并且每当 x 坐标为零时,就会转发线号(扩展为 32 位)而不是原始像素值。
除了行标记之外,还需要为 Blob Analysis 操作生成刷新条件。刷新可以实现为触发器输入,或者在本例中,每行生成一次刷新条件。因此,Blob Analysis 将每行最终确定(Eof)其输出。但是,只有通过使用参数 supres_empty_output_frames指定输出帧不为空时,Blob Analysis 才被配置为执行此行为。此外,Blob Analysis 配置的最大对象高度为 10 位(即 1024 像素)。算子的最大输出帧大小设置为 20。如果必须输出更多对象且没有发生刷新条件,算子将生成新帧。这些小的输出帧可以最大限度地减少检测到对象的时间以及在 PC 中对其进行分析的时间。
11 个 Blob Analysis 输出流合并为一个连接到 DMA 的流。这可以通过使用 MergePixel 和 InsertPixel 算子轻松完成。对象特征的顺序如表所示。
| 字节编号 | 对象特征 |
|---|---|
| 0 到 3 | Line Marker |
| 4 至 5 | 边界框 X0 |
| 6 至 7 | 边界框 X1 |
| 8 到 11 | Center of Gravity Y |
| 12 到 15 | Center of Gravity Y |
| 16 到 17 | 边界框 Y0 |
| 18 到 19 | 边界框 Y1 |
| 20 到 23 | 面积 |
| 24 到 25 | Contour Length Diagonal |
| 26 到 27 | Contour Length Orthogonal |
| 28 到 31 | Error Flags |
在硬件中运行此项目需要包含线阵相机和触发编码器系统的特殊硬件设置。设计文件可以在 VisualApplets 安装路径中的文件夹 Examples\Processing\BlobAnalysis\Blob1D 中找到。设计中添加了一个复杂的 SDK 项目,主要用于演示对象的显示。