性能优化#
工业相机通常以恒定且可能非常高的速率(例如 60–200 fps 或更高)生成图像。在许多应用中,处理流水线(如 Python、OpenCV、AI 推理等)无法跟上这一速率。
这就造成了一个根本性的矛盾:
如果没有采集策略,将会出现以下某种情况:
- 缓冲区无限增长:不可行
- 缓冲区随机溢出:不可取
采集策略定义了系统在负载下的行为方式。
心智模型#
如果应用程序的处理速度慢于相机,队列就会填满,此时必须决定如何处理这种情况。这就是采集策略的作用。
采集策略#
提供两种采集策略。
LatestImageOnly#
仅保留最新的一帧。当应用程序忙碌时,较旧的帧将被丢弃。以下图示说明了这一点:
优点:
- 您始终可以看到最新状态。
- 最低延迟
缺点:
- 丢帧
典型用例:
当您需要当前信息、可以接受丢帧且必须将延迟保持在最低水平时,请使用 LatestImageOnly。例如:
- 实时显示(GUI)
- 操作员监控
- 实时可视化
OneByOne#
每一帧都按顺序进入队列并进行处理。不会有意丢弃任何帧。以下图示说明了这一点:
优点:
- 无丢帧(非常适合分析/录制)
- 确定性处理顺序
缺点:
- 如果处理较慢,则延迟会增加
- 在持续过载的情况下存在缓冲区溢出的风险
典型用例:
当每一帧都很重要、结果必须可复现且处理速度与采集速度大致相同时,请使用 OneByOne。例如:
- 检测系统
- 图像记录
- 测量任务
缓冲区配置#
缓冲区在相机和应用程序之间起到临时存储的作用。您可以根据需要调整使用的缓冲区数量。
增加缓冲区数量具有以下优点:
- 能够容忍暂时的速度减缓。
缺点是:
- Memory 使用量增加。
- 延迟增加,即队列变长。
核心要点#
没有所谓的“最佳”策略。具体选择取决于您是始终需要最新的图像,还是需要所有图像。下表可为您选择合适的策略提供参考。
| 策略 | 延迟 | 丢帧 | 确定性 |
|---|---|---|---|
| LatestImageOnly | 低 | 是 | 低 |
| OneByOne | 高(如果速度较慢) | 无 | 高 |