应用笔记:Blob Analysis#
您将学习如何将 Blob 分析运算符与其他运算符结合使用。 VisualApplets这些示例使用 Blob 分析算子在 FPGA 内部进行基本目标检测和分类。一个线条小程序演示了 Blob 分析一维算子的用法。此外,还提供了这些示例的 C++ SDK 项目,帮助理解如何在 PC 端解读 Blob 分析结果。(应用笔记 SAN011)
以下设计示例说明了如何使用VisualApplets 斑点分析运算符:
- 包含用于对象可视化的 SDK 项目的简易 Blob 分析应用程序:本示例使用 Blob 分析进行基本对象检测。所有检测到的对象都会传输到主机。
- 使用斑点分析进行分类和 ROI 选择:此示例展示了在 FPGA 内部使用斑点分析进行目标检测和分类。
- 1D 斑点分析:本示例解释了 1D 斑点分析运算符在无限线扫描图像中的应用。
包含用于对象可视化的 SDK 项目的 Simple Blob Analysis 应用#
第一个例子是一个基本的斑点分析小程序。首先,将相机图像二值化。然后,将二值图像发送到一条路径上的 DMA,并在另一条路径上执行斑点分析,并将结果通过第二个 DMA 通道输出。
本示例中使用的二值化方法基于简单的阈值分割。斑点分析假设每个白色像素都是一个对象像素。图 2 显示了使用两个阈值选择前景值范围的过程。这使得我们可以处理对象由暗像素构成或对象相对于背景更亮的图像。二值化完成后,图像会被缓存。然后,图像从缓存中传递给斑点分析,并传输到主机以监控二值化后的图像。
Blob 分析参数的配置如下图所示:
上图展示了如何将 Blob 分析数据合并到一个链接中。在本例中,这些特征 Bounding Box 和 Area 首先,将每个 16 位边界框链接合并在一起,得到 64 位链接宽度。区域也扩展到 64 位。使用 InsertPixel 操作员将两条链路合并在一起。因此,生成的DMA传输格式如下:
针对 Simple Blob2D Applet 的 Blob DMA Byte Order#
| 字节编号 | 对象特征 |
|---|---|
| 0 到 1 | Bounding Box X0 |
| 2 到 3 | Bounding Box X1 |
| 4 到 5 | Bounding Box Y0 |
| 6 到 7 | Bounding Box Y1 |
| 8 到 15 | Area |
请注意 PC 中不同的字节顺序。对象特征 bit widths 进行了扩展。实际上,Bounding Box 仅使用 10Bits 来表示 0 到 1023 之间的值,而 Area 仅使用 21Bits。此 Applet 附带了一个小型 SDK C++ 项目以展示其功能。它与设计文件一起位于以下文件夹中: Examples\Processing\BlobAnalysis\Blob2D VisualApplets 安装路径的。
使用 Blob Analysis 进行分类和 ROI 选择#
此示例展示了一种根据提取的对象特征来裁切感兴趣区域(ROI)的方法。其目的是找到面积最大的对象,并提取该对象的重心来形成 ROI。
该示例展示了 VisualApplets 在 Applet 内部使用 Blob Analysis 结果进行分类的能力,这大大增强了帧采集卡内部的图像处理可能性。图 1 显示了设计的截图。主要部分包括二值化、Blob Analysis、分类以及 ROI 裁切。这些部分将在下文中进行详细解释。
本示例中使用的二值化方法基于简单的阈值分割。斑点分析假设每个白色像素都是一个对象像素。图 2 显示了使用两个阈值选择前景值范围的过程。这使得我们可以处理对象由暗像素构成或对象相对于背景更亮的图像。二值化完成后,图像会被缓存。然后,图像从缓存中传递给斑点分析,并传输到主机以监控二值化后的图像。
Blob Analysis 在二值化之后执行。在这里,仅使用 x 和 y 方向的重心以及面积这几个对象特征进行后续处理。本示例中不使用所有其他特征。
接下来,Applet 对 Blob Analysis 结果进行分类(图 3)。首先,通过将重心值除以面积来进行归一化。这只需使用 DIV 运算符即可完成。同时,执行检测最大面积对象的任务。在这里,运算符 FrameMax 和寄存器(Registers)被使用。该分类算法的思路是抑制面积小于迄今为止所调查对象的每个对象。具体来说,Blob Analysis 输出一个对象流。 FrameMax 运算符用于检测当前对象是否比迄大为止所调查的对象更大,并在其输出端输出逻辑 1 IsMax。该值用于 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 大小更改为模块设置的 DMA 大小 ROIsizeX 和 ROIsizeY。使用 显示 microDisplay 中的设置或 widht1 和 height1 SDK 项目中的参数来执行调整。
Blob Analysis 1D#
Blob Analysis 1D 示例展示了如何在 VisualApplets 环境中使用 1D blob 算子。
1D Blob Analysis 示例是一个基于基准线相机的简单小应用程序(applet)。该相机仅配合行触发器使用。因此,该小应用程序基于真实的 1D 图像。为了进行 DMA 传输,原始图像被转换为由连续小行片段组成的 2D 图像。小应用程序的所有部分将在下文中详细解释。图 1 显示了该设计的主图纸(sheet)。
对于采集,连接至 ImageBuffer 的行相机算子将被使用。该缓冲区允许对 1D 图像行进行缓冲。接下来,在分层框(Hierarchical Box) Binarize 中,执行简单的阈值处理,将像素转换为前景和背景像素。选择器(selector)允许将原始图像和二值图像切换到图像输出路径。这只需通过一个 IF 算子即可实现,并且 CONST 操作员。 dynamic 参数 CONST 算子允许修改 IF 算子的条件输入以切换其输入。因此,在运行时可以在原始灰度图像和二值化图像之间进行切换。
由于该小应用程序的应用目的是可视化在原始图像中找到的对象,因此需要实现 PC 中两个 DMA 通道的同步。行标记(line marker)用于标记原始图像的每一行以及每一个 blob。因此,使用一个 Counter 来对每一行进行计数。行 Counter 包含在分层框 1DBlobAnalysis 中,与 blob 分析算子一起,行计数值通过上部链接 O000 离开该框。该 Counter 的范围为 10 位。因此,当达到值 1024 时会发生溢出,并且 Counter 从零重新开始。
在 ReplaceFirstPixelByLineNo 一行的前四个像素被行号替换。为此,Parallelism 被更改,以便在 32 位的粒度下进行操作。x 坐标为计数,并且每当 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 | Bounding Box X0 |
| 6 到 7 | Bounding Box X1 |
| 8 到 11 | Center of Gravity Y |
| 12 到 15 | Center of Gravity Y |
| 16 到 17 | Bounding Box Y0 |
| 18 到 19 | Bounding Box Y1 |
| 20 到 23 | Area |
| 24 到 25 | Contour Length Diagonal |
| 26 到 27 | Contour Length Orthogonal |
| 28 到 31 | Error Flags |
在硬件中运行此项目需要包含行相机和触发编码器系统的特殊硬件设置。设计文件可以在 Visual Applets 安装路径中的文件夹 Examples\Processing\BlobAnalysis\Blob1D 中找到。设计中添加了一个复杂的 SDK 项目,主要演示了对象的显示。