了解缓冲区处理

适用产品

全部 FLIR 机器视觉 GigE Vision 和 USB3 摄像头

应用说明简介

本应用说明介绍了缓冲区和缓冲区处理模式的本质及其工作方式,并提供了拍摄图像的预期效果示例。

什么是缓冲区?

图像被摄像头拍摄后,会自动传输到 PC 并存储在 RAM 中。 内存中为存储图像分配的空间称为缓冲区。 根据摄像头最大帧率,内存的缓冲区数量默认自动分配。 摄像头相关的缓冲区数量可以通过将流缓冲区计数模式从自动切换为手动并同时为手动流缓冲区计数分配一个值来更改。 缓冲区最大数量取决于 RAM 的可用内存,每个缓冲区的大小则取决于图像尺寸。 您可以设置的最大缓冲区数量是 3。

Spinnaker 1.13 及更高版本拥有自动缓冲计数模式功能。 之前版本默认将缓冲区数量设置为 10。

用户只能在图像从缓冲区检索出来后与图像进行交互。 这类交互包括将图像显示在屏幕上、保存到磁盘或应用图像处理。

缓冲区处理

缓冲区处理决定每个摄像头可用的缓冲区数(如果可以覆盖)以及检索图像的顺序。

缓冲区处理模式

Spinnaker 中有四类缓冲区处理:

    • 先处理最新的——应用处理输出缓冲区队列末尾图像(最新可用的那一个)。 此方式对于运动预测这类需要始终获取最新的帧但之前的帧也可以增加有价值信息的应用有用。

    • 仅处理最新的——应用始终处理最近完成的图像(最新的那一个)。 丢弃之前的图像。 流缓冲区计数被忽略。 该模式通常用在实时显示 GUI,其中要求摄像头和显示屏之间没有延迟。

 

    • 先处理最早的——应用始终处理输出缓冲区队列首个图像(最早可用的那一个)。

    • 先盖写最早的——应用始终处理输出缓冲区队列首个图像(最早可用的)。 如果有新图像传入,它会从队列开头盖写缓冲区。 看上去像一个循环缓冲区。

如果输出缓冲区队列是空的,则应用会等待新图像,直至超过指定的超时值。 超时值默认设置为无限期。

Spinnaker 默认的缓冲区处理模式是“先处理最早的”。

FlyCapture2 中,有两种处理模式:

  • 丢弃帧——等同于“仅处理最新的”。
  • 缓冲帧——等同于“先处理最早的”。

FlyCapture2 的默认缓冲区处理模式是丢弃帧。

缓冲区处理模式示例

示例 1

触发摄像头 6 次。 每次触发后,我们将检索图像,然后输出 FrameID(Frame ID 始终从 0 开始)。

示例条件:

  • 1 FPS
  • 无图像处理
  • 缓冲区数量或缓冲区处理模式无变化

示例结果:

  • 0、1、2、3、4、5

无论使用哪种缓冲区处理模式,结果应当都一样。 但是,如果摄像头触发比主机的处理能力更快,或者说如果主机端有延迟,那么图像将被丢弃。 这样的话,输出的帧 ID 可能与上文显示的结果不匹配 同样,图像检索位置与其传输位置不一样的时候,缓冲区处理模式将决定检索的图像以及图像的顺序。

示例 2

触发摄像头 6 次。 第六次触发后,我们开始检索三个图像,然后输出 FrameID。

示例条件:

  • 1 FPS
  • 无图像处理
  • 设置缓冲区数量为 3(PC 只在内存保留 3 张图像)
  • 逐个应用每种缓冲区处理模式

每种模式示例结果:

  • 先处理最新的
    • 2、1、0
    • 没有盖写,摄像头保留了先拍摄的三张图像,丢弃 3、4、5 帧
    • 对于 Blackfly S USB3 摄像头,其顺序是 2、3、4。对于其他 USB3 摄像头,其顺序是 2、3、1。参见下方的“传输队列”章节。
  • 仅处理最新的
    • 5、错误
    • 摄像头保留了最新的图像,但尝试检索不存在的图像时,出现了错误
  • 先处理最早的
    • 0、1、2
    • 和“先处理最新的”一样,区别是最早图像先被检索
  • 先盖写最早的
    • 3、4、5
    • 帧 0、1 和 2 被盖写了,表示帧 3 是最早的图像且率先被检索,然后再检索帧 4 和 5

示例代码

Spinnaker 1.15 或更高版本中,Spinnaker SDK 安装时提供缓冲区处理示例代码。 该示例代码通过上方定义的示例展示了不同缓冲区处理模式的工作情况。

传输队列(摄像头机载图像缓冲区)

每个摄像头都有一个机载图像缓冲区,每个拍摄的图像都要经过该缓冲区。 只要摄像头保持通电,它也可以用来无限期存储图像。 该图像缓冲区可以存储多张图像。

Blackfly S 和 Oryx 摄像头拥有 240 MB 的图像缓冲区。 每个图像占用的空间大小是摄像头最大分辨率的四倍。 例如,BFS-U3-13Y3C 摄像头的分辨率是 1.3 MP,那么每张图像就要占用图像缓冲区 5.2 MB 的空间。 可以存储的最大图像数量见 TransferQueueMaxBlockCount 节点。 当前在摄像头上缓冲的图像数量见 TransferQueueCurrentBlockCount 节点。

虽然 Blackfly、Chameleon3、Flea3 和 Grasshopper3 摄像头有图像缓冲区,但它们不能使用 Spinnaker 传输队列功能。 这些摄像头必须通过 FlyCapture2 访问机载图像缓冲区功能。

仅 USB3 摄像头

如果 USB3 摄像头拍摄图像后 PC 上没有可用的缓冲区,则该图像将被自动存储在机载缓冲区中。 一旦 PC 有可用空间,摄像头机载缓冲区中的图像将自动传送到 PC。 如果使用的是“先处理最新的”模式,此情况会干扰预期的图像顺序(参加上文的示例 2 结果)。

Blackfly、Chameleon3、Flea3 和 Grasshopper3 摄像头默认最多有一个图像在缓冲。 Blackfly S 摄像头最多可以缓冲 TransferQueueMaxBlockCount 节点中所定义值的图像数量。

故障排除

为什么我将图像保存到磁盘时丢帧?

RAM 的运行速度通常要比硬盘(即便是固体硬盘)写入速度快得多。 处理图像并从 USB3 或 GigE 摄像头进行高带宽传送时,图像有可能以快于硬盘可以应对的速率传输到 PC。 此问题有一种解决方案,即增加摄像头相关的缓冲区的数量,或使用一个更快的硬盘系统。 更多信息请参见“高带宽保存图像”