大多数 VisualApplets 应用都需要采集相机图像,通过图像处理算法处理图像,并将结果输出到主控 PC。 除此之外,用户还希望监控原始监控图像。 因此我们需要两个图像输出。 即原始监控图像和算法实现的已处理结果。 接下来,我们将实现一个符合以下规范的 VisualApplets 设计:
- 使用 Base 配置模式下的 Camera Link 相机拍摄灰度图像
- 最大分辨率 = 1024 x 1024 像素 @ 8Bit/像素
- 缓冲图像并将每采集的第 10 幅图像转发到主控 PC(用于监控)
- 使用阈值处理对每幅采集的图像进行二值化,并将结果图像输出到主控 PC
- 二值化输出图像的格式必须为:0 = 黑色,白色 = 255(8Bit/像素)
根据该规范,我们可以生成一个方框图。
正如我们所见,图像被抓取并进行缓冲。 缓冲之后,处理管线将分为两条路径。 第一条路径负责输出每第 10 幅图像用于监控。 第二条路径包含二值化以及二值图像的输出。
大多数 VisualApplets 实现都遵循相同的原则: 首先进行图像采集和缓冲。 缓冲之后便是图像处理逻辑。 在 'Data Flow ' 中,您可以找到有关 VisualApplets 处理管线以及设计基本设置的更多信息。 接下来,我们将逐步通过实现一个符合规范的 VisualApplets 设计来了解整个过程。 除了 VisualApplets 实现之外,我们还将使用内置仿真验证该设计,并在真实硬件上使用该设计。
-
我们将从前几个示例中使用过的基本算子开始。 这些算子包括相机算子 CameraGrayAreaBase、缓冲区 ImageBuffer 以及用于将结果传输到主控 PC 的算子,即 DmaToPC。 与此不同的是,这次我们需要在设计中使用第二个 DmaToPC 模块来传输原始图像以及二值化结果。 按照以下设计所示,找到并重命名所有算子。

-
如您所见,我们将 DMA 模块重命名为了 DMA0_OriginalImages 和 DMA1_BinarizedImages。因此我们为它们赋予了一个索引。 这是因为每个 DMA 通道都使用一个通道索引。 此通道索引用于从任何 PC 软件访问数据。 大多数非 FPGA 内部资源都使用索引来指定其位置。 某些使用 FPGA 外部硬件的算子包括相机算子、使用 DRAM 的算子(例如 ImageBuffer)、 使用通用输入输出的算子(例如触发信号)以及 DMA 算子。 事实上,到目前为止我们设计中的所有算子都在使用外部资源,并且可以分配给一个索引。 相机算子可以分配给 Camera Link 端口 A 或 B。 缓冲区可以分配给 microEnable IV VD4-CL 上的四个 DRAM 之一,DMA 可以分配给各个 DMA 通道之一。 有关设备资源使用的详细说明,请参见 'Allocation of Device Resources'。 所有支持的硬件平台的可用设备资源列表呈现在 Device Resources 中。
大多数设备资源都可以通过 VisualApplets 中的资源对话窗口进行更改。 有些资源可以通过算子的参数进行更改。 要更改设备资源,我们必须打开资源对话窗口,该窗口可通过 → 或使用编辑菜单栏中的图标来访问。

确保 DMA 模块 DMA0_OriginalImages 已分配给索引 0,且 DMA1_BinarizedImages 已分配给索引 1。 相机模块应分配给代表 Camera Link 端口 A 的索引 0。 我们并不十分关心缓冲区使用的是哪一个 DRAM 芯片,因此如果某些内存算子之间存在冲突,我们可以让 VisualApplets 自动选择索引。 通常,VisualApplets 总是会选择未使用的索引。 如果您有两个相机模块并删除了使用索引 0 的模块,则剩余的相机模块将使用索引 1。 因此,请务必在开始构建 applet 之前检查所有设备资源索引。 综合完成后,资源索引将无法更改。
-
接下来,我们需要引入我们的图像处理算法。 由于我们必须实现两种不同的图像处理算法,因此我们需要将管线分支为两条路径。 这可以通过分支算子轻松完成。在基本算子库中找到该算子并将其拖入您的设计中。 当您释放鼠标按键时,将弹出一个窗口,允许用户指定输出链接的数量,即 分支的数量。选择 2 并点击“确定”。您的设计中现在将拥有一个带有两个输出链接和一个输入链接的分支模块。 将该模块移动到缓冲区旁边并将其连接。

现在我们已经对管线进行了分路,可以在分支模块和 DMA 模块之间实现这两种图像处理算法。
-
首先,我们将实现原始图像输出路径,在该路径中仅需输出每第 10 幅图像。 我们不会将所有必需的算子放置在主设计层级上,而是使用一个层级盒。 借助层级模块,您可以方便地在设计中实现层级结构,并将任意数量的算子组合成一个新算子。 使用层级模块可以简化工作区的概览。 在您的设计中插入一个带有一个输入和一个输出的层级盒。 您可以在基本算子库中、设计区的弹出菜单中或从 主菜单“Design”中找到层级盒。
将 HierarchicalBox 模块放置在分支和 DMA 之间并将其连接。 您可以使用其上下文菜单或通过选中它并按 F2 键来重命名该模块。

要编辑层级模块的内容,只需双击它。 将打开一个新的空白设计窗口。它仅包含输入和输出连接器。 我们将所需的算子放置在中间并将它们连接到端口。 要退出层级模块,请按退格键 (Backspace) 或图标
.
要移除 10 幅图像中的 9 幅,我们需要如图所示的算子。

以及参数化:
-
模块 CountFrames 的属性

-
模块 CountFrames 输出的链接属性

-
模块 Not0 的属性

工作原理: CountFrames 模块将用 0 到 9 之间的值替换每个图像的像素。 因此,它将随着每个图像从 0 到 9 重复计数。 如果当前的计数值不为 0,Not0 模块将把每个图像的每个像素替换为值 1。 如果第二个输入“Rem”的像素值为 1,则 RemoveImage 模块将删除每个图像。 因此,图像编号 0、10、20、30 等将被绕过。所有其他图像将被删除。
-
-
为了实现二值化,我们将在设计中添加另一个分层模块。

此分层模块中的算子为“Is_GreaterThan”和“Scale”。

ThresholdFrom 模块表示实际的二值化。 对于大于参数 Number 指定的值的每个输入像素值,输出值为 1,否则为 0。 因此,模块的输出位深度将为 1 位。您可以通过打开链接属性来检查这一点。 由于我们不想输出 1 位值,我们需要将结果转换为 8 位值。 实现这一点的一个非常简单的解决方案是将每个值按 255 进行缩放。因此,二进制值 1 变为 255, 而二进制值 0 保持为 0。将 ScaleBy255 模块的参数设置为以下值。

如您所见,我们将参数 ScaleFactor 的参数类型设置为 Static。对于此算子,这非常 重要,因为它与动态参数相比所需的 FPGA 资源要少得多。 通常,如果您知道在综合后不需要更改参数,请始终将其类型设置为静态。
-
- 您实现的最后一步将是检查设计规则错误。执行 DRC 以检查错误。 如果没有错误,您现在可以构建设计并在硬件中使用它。 或者,您可以使用下一节中所示的仿真来验证您的实现。 别忘了不时保存您的设计。
对于大多数设计,在实际 FPGA 硬件中使用之前, 使用仿真来验证实现的}{ 功能非常有用。接下来我们将使用仿真来验证我们的设计。
-
准备工作
首先,我们需要一个用于模拟的图像。 您需要使用 TIFF 或 BMP 格式的图像文件。 如果您想将图像数据注入到像我们示例中那样使用灰度图像的图像处理管道中, 则必须使用包含单个颜色分量的图像。 有关模拟允许的图像文件的更多信息,请参见 'Simulation'。 VisualApplets 安装文件夹中提供了一些示例图像。
-
源和探针
可以使用“simulation_source”模块将图像文件注入到任何图像传输链接中,并可以使用 “simulation_probe”模块在任何其他链接上进行监视。 在我们的示例中,我们按照以下截图在相机和缓冲区之间的链接添加了一个模拟源,并添加了相应的模拟探针。 您可以从“Analysis”菜单、设计窗口的上下文菜单或直接从图中标记的图标添加模拟源和探针。

-
添加图像文件
要将图像文件添加到模拟源,请双击设计中的源以打开 Simulation Source Viewer。 现在只需将图像文件拖放到 Simulation Source Viewer 窗口中,或者使用 → 菜单。

图像文件现已添加到模拟源。您只需将更多文件拖到 模块或窗口上,即可将它们添加到源中。 在 Simulation Source Viewer 窗口底部,您可以看到序列中的所有图像。
-
启动模拟
我们现在准备开始模拟。选择 → ( F9 ) 以打开主 Simulation 窗口。 每次打开此窗口时,都会自动执行设计规则检查。 无法模拟设计规则检查失败的设计。
在 VisualApplets 中,模拟按周期处理。 每个周期代表从设计中的所有模拟源注入图像。 只需单击 即可开始模拟。 VisualApplets 现在将执行模拟。 根据设计的复杂程度,这可能需要几秒钟时间。
-
检查结果
我们现在可以检查模拟结果。 关闭 Simulation 窗口。 此时模拟探针应该已填充了结果。

如果您打开位于二值化背后的探针的 Simulation Probe Viewer,您可以立即查看 模拟是否成功。图像应包含值为 0 和 255 的像素。

如果需要,现在可以将结果保存到磁盘。
-
序列模拟
我们可以在上一步中验证二值化。 但是,单个模拟图像不足以验证监视输出,因为预期只有每 10 个图像 才传输到主机 PC。 因此,我们需要模拟一系列图像。
-
再次打开 Simulation 窗口。
-
单击 以重置先前模拟中的序列。 通常,如果您想开始新的模拟,最好始终重置模拟以避免用户错误。
-
单击 以模拟一张图像。 我们将在每个模拟探针中获得一个结果。 现在无需关闭 Simulation 窗口。 您可以查看设计窗口中模块的编号,以获取模拟探针中的当前图像数量。
-
现在通过单击 执行另一个周期。 这一次,除 DMA0 模块处的探针外,所有模拟探针的图像数量都应增加到二。
重复此步骤,直到总共模拟 11 个周期。 此时 DMA 0 处的探针应包含两个图像。这表明我们的实现功能正常。

-
除了单击 11 次 外,您还可以使用 Simulation 窗口中的微调框来设置处理周期数。 模拟结果将是相同的。 此外,您可以设置 10 个模拟周期,启动它们,然后在之后启动接下来的 10 个周期。随您喜欢...
-
在验证了实现的功能后,我们可以在硬件中对其进行测试和使用。 您需要构建设计以获得硬件 applet 文件 HAP。(用户手册:'Build') 确保您的设计与硬件平台匹配,例如我们示例中的 mE4VD4-CL。 此外,确保您的项目使用正确的架构,例如 Windows 64 Bit。 它必须与已安装的 Framegrabber SDK 相同。 通过以下方式开始构建 → ( F7 )。 VisualApplets 现在将使用 FGPA 制造商工具将您的设计转换为 FPGA 比特流。
合成的结果是一个 HAP 文件。 它包含 FPGA 比特流以及用于访问数据和参数的软件接口。 HAP 文件位于 Framegrabber SDK 安装目录的子目录“Hardware Applets”中,或者, 如果未安装 Framegrabber SDK 或您选择了其他目标运行时,该文件位于系统设置中指定的文件夹中 (参见 'System Settings')。
我们将在 Framegrabber SDK 工具 microDisplay 中测试我们的设计。microDisplay 是用于对 applet 进行初步测试的工具。 打开 microDisplay 并加载 applet。 microDisplay 将显示两个 DMA 图像窗口, 即仅显示每 10 张图像的原始图像窗口,以及显示二值化图像的第二个 DMA 窗口。 有关在 Framegrabber SDK 中使用 applet 的详细说明,请参阅 Framegrabber SDK documentation。



上一页

