跳转到内容

应用笔记:JPEG 压缩#

本应用笔记介绍了 Basler JPEG 压缩运算符的使用方法(应用笔记 SAN013)。

您将获得有关运算符功能的信息。通过一个 VisualApplets 设计,展示了一个 JPEG 压缩应用,并呈现了一个生成 JPEG 数据文件的 SDK 项目。

VisualApplets 中的 JPEG 压缩需要两个运算符。它们是 ImageBuffer_JPEG_Gray 和 JPEG_Encoder_Gray。图像缓冲区用于在采集卡内存中缓冲图像数据,并用于对像素进行特定的重新排序。JPEG 编码器负责执行 JPEG 压缩本身。

之所以需要重新排序像素,是因为 JPEG 压缩使用的是 8x8 像素块。下图说明了重新排序的过程。

像素重排序方案

重新排序后的图像将如下所示。该运算符保持了原始图像的图像尺寸。

像素重排序示例

重新排序后,可以使用运算符 JPEG_Encoder_Gray执行 JPEG 压缩。该运算符的输出是不含 JPEG 标头的 Huffman 流。压缩率取决于在运行时可更改的所选量化表。对于 Huffman 编码,使用标准亮度表。

运算符文档

有关参数、输入链接和算子功能的详细说明,请参阅算子参考。

JPEG 压缩设计示例#

以下设计示例将展示一个执行 JPEG 压缩的 VisualApplets 设计。该设计需要满足以下规范:

  • 从 Camera Link Base 面阵相机抓取图像。
  • 缓冲图像数据并执行 JPEG 压缩。
  • 在软件中向图像添加 JPEG 标头并将选定的图像写入文件。
  • 相机的图像高度不是恒定的。必须将可变的图像高度添加到 JPEG 标头中。

VisualApplets 设计#

使用以下设计来满足这些规范。

用于 JPEG 压缩的 VisualApplets 设计

这个简单的设计足以满足所有规范。使用 Base 面阵相机运算符抓取图像。接下来,图像被分为两条路径。第一条路径缓冲图像并通过运算符 ImageBuffer_JPEG_Gray 执行像素重新排序。随后使用 JPEG_Encoder_Gray 进行 JPEG 压缩。JPEG 数据流通过 DMA 通道传输到主机 PC 内存中。在第二条路径中,原始图像数据被缓冲并通过第二个 DMA 通道传输到主机 PC。

VisualApplets 设计仿真#

该设计可以完全模拟。通过在数据链路上放置仿真源和探针,可以监视 JPEG 压缩的各个步骤。下图显示了包含仿真模块的设计。可以看出,原始图像的像素 (simModule0) 经过了重新排序 (simModule1),并生成了 JPEG 数据流 (simModule2)。

JPEG 压缩设计仿真

查看 JPEG 数据时,可以确定数据流的长度(见下图)。如果在 JPEG 编码器中更改了 Quality,数据长度也会相应变化。

SimProbe 中的 JPEG 数据

microDisplay 中的运行时测试#

任何包含 JPEG Encoder 的 applet 都可以直接在 microDisplay 中使用。在给定的示例中,该 applet 会为每个 DMA 通道生成一个图像窗口。DMA 1 显示采集到的原始图像,而第一个 DMA 通道显示编码后的图像数据以及 DMA 长度。

microDisplay 中的 JPEG Applet

用于生成 JPEG 文件的 SDK 项目#

该示例的设计文件以及 SDK 示例项目可在以下文件夹中找到 examples\processing\advanced\JPEG\JPEG_gray 位于 VisualApplets 安装路径中。

该 SDK 项目基本上负责采集原始图像和 JPEG 数据。原始图像直接输出到显示器。系统会生成一个 JPEG 头部并将其添加到 JPEG 数据中,从而完成 JPEG 文件的构建。用户可以将 JPEG 快照写入文件。此外,使用简单的 C 代码解码器 nanojpeg对编码后的 JPEG 数据进行解码。解码后的图像将会显示出来。

用户可以调整图像大小、更改 JPEG Quality、写入 JPEG 快照文件或写入 JPEG 数据十六进制文件转储。

请注意,头部生成仅是一个示例。VisualApplets JPEG 运算符的用户应编写适合其自身的应用程序的自定义头部生成器。

JPEG 解码器信息:

NanoJPEG -- KeyJ's Tiny Baseline JPEG Decoder

Version 1.0 (2009-04-29)

by Martin J. Fiedler <martin.fiedler@gmx.net>