跳转到内容
STAGING SERVER
DEVELOPMENT SERVER

性能优化#

本主题解释了什么是采集策略以及它们为什么重要。

工业相机通常以恒定且可能非常高的速率(例如 60–200 fps 或更高)生成图像。在许多应用中,处理流水线(如 Python、OpenCV、AI 推理等)无法跟上这一速率。

这就造成了一个根本性的矛盾:

Camera (Producer) → fast
Application (Consumer) → slower

如果没有采集策略,将会出现以下某种情况:

  • 缓冲区无限增长:不可行
  • 缓冲区随机溢出:不可取

采集策略定义了系统在负载下的行为方式。

心智模型#

Camera → Frame Stream → Buffer Queue → RetrieveResult() → Application

如果应用程序的处理速度慢于相机,队列就会填满,此时必须决定如何处理这种情况。这就是采集策略的作用。

采集策略#

提供两种采集策略。

LatestImageOnly#

仅保留最新的一帧。当应用程序忙碌时,较旧的帧将被丢弃。以下图示说明了这一点:

Camera:    F1 → F2 → F3 → F4
App reads:        →    F4
Dropped:   F1, F2, F3

优点:

  • 您始终可以看到最新状态。
  • 最低延迟

缺点:

  • 丢帧

典型用例:

当您需要当前信息、可以接受丢帧且必须将延迟保持在最低水平时,请使用 LatestImageOnly。例如:

  • 实时显示(GUI)
  • 操作员监控
  • 实时可视化
OneByOne#

每一帧都按顺序进入队列并进行处理。不会有意丢弃任何帧。以下图示说明了这一点:

Camera:    F1 → F2 → F3 → F4
App reads: F1 → F2 → F3 → F4

优点:

  • 无丢帧(非常适合分析/录制)
  • 确定性处理顺序

缺点:

  • 如果处理较慢,则延迟会增加
  • 在持续过载的情况下存在缓冲区溢出的风险

典型用例:

当每一帧都很重要、结果必须可复现且处理速度与采集速度大致相同时,请使用 OneByOne。例如:

  • 检测系统
  • 图像记录
  • 测量任务

缓冲区配置#

缓冲区在相机和应用程序之间起到临时存储的作用。您可以根据需要调整使用的缓冲区数量。

camera.MaxNumBuffer.Value = 20

增加缓冲区数量具有以下优点:

  • 能够容忍暂时的速度减缓。

缺点是:

  • Memory 使用量增加。
  • 延迟增加,即队列变长。

核心要点#

没有所谓的“最佳”策略。具体选择取决于您是始终需要最新的图像,还是需要所有图像。下表可为您选择合适的策略提供参考。

策略 延迟 丢帧 确定性
LatestImageOnly 低 是 低
OneByOne 高(如果速度较慢) 无 高