Blackfly S USB3工业相机:缓冲区处理
- Flir Blackfly S USB3 产品介绍
- 介绍相机缓冲区
- 缓冲区处理
-
- 缓冲区处理模式
-
- 缓冲区处理模式示例
-
- 示例 1
- 示例 2
- 传输队列(摄像头机载图像缓冲区)
- 通过Code改变缓冲区的大小
本博客的技术内容可应用于 FLIR 的网口和USB3的相机
Flir Blackfly S USB3 产品介绍
Blackfly S 采用行业先进的冰形传感器。 它具有强大的功能,可以轻松生成所需的精确图像,并加速应用程序的开发。 包括自动和准确的手动控制图像捕获和相机预处理。 Blackfly S 提供GigE、USB3.套装和板级版。 精确图像 索尼CMOS传感器的选择包括:全球快门、偏振和高灵敏度BSI传感器。
以下是缓冲区和缓冲区处理模式的本质及其工作模式,并提供拍摄图像的预期效果示例
介绍相机缓冲区
图像被摄像头拍摄后,会自动传输到 PC 并存储在 RAM 中。 默认情况下,缓冲区,缓冲区的数量默认自动分配内存。 通过自动切换区计数模式从自动切换到手动,并为手动流缓冲区计数分配一个值,可以改变相机相关缓冲区的数量。 缓冲区的最大数量取决于缓冲区的最大数量 RAM 每个缓冲区的大小取决于图像的大小。
Spinnaker 1.13 而且更高具有自动缓冲计数模式功能。 之前版本默认将缓冲区的数量设置为 10。
使用图像时,只能在从缓冲区检索图像后与图像交互。 这种交互包括在屏幕上显示图像、保存磁盘或应用图像处理。
缓冲区处理
缓冲区的处理决定了每个摄像头的可用性(如果可以覆盖)和。
缓冲区处理模式
Spinnaker 处理缓冲区有四种:
应用处理输出缓冲区队列末尾图像(最新可用的) 这种方法更好地应用于运动预测,需要始终获得最新帧,但之前的帧也可以添加有价值的信息。 应用程序总是处理最近完成的图像(最新的)。 丢弃之前的图像。 忽略了流缓冲区的计数。 该模式通常用于实时显示 GUI,摄像头和显示屏之间没有延迟。 应用程序始终处理输出缓冲区队列的第一个图像(最早的图像) 应用程序总是处理输出缓冲区队列的第一个图像(最早可用)。 若有新图像传入,则从队列开头盖上缓冲区。 它看起来像一个循环缓冲区。
缓冲区处理模式示例
以上解释比较抽象,下面举几个例子就清楚了。
示例 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 帧
- 5、错误
- 相机保留了最新的图像,但当试图检索不存在的图像时,出现了错误
- 和先处理最新一样,区别在于最早的图像首先被检索
- 3、4、5
- 帧 0、1 和 2 被盖写着,表示帧 3 它是最早的图像,先检索,然后检索帧 4 和 5
传输队列(摄像头机载图像缓冲区)
每个摄像头都有机载图像缓冲区,每个图像都必须通过缓冲区。 它还可以用来无限期地存储图像,只要摄像头保持通电。 多个图像可以存储在图像缓冲区。
Blackfly S 摄像头拥有 240 MB 的图像缓冲区。
每个图像占用的空间是摄像头最大分辨率的四倍。 例如,BFS-U3-13Y3C 相机的分辨率是 1.3 MP,然后每个图像都会占据图像缓冲区 5.2 MB 的空间。 可以存储的最大图像数量见 TransferQueueMaxBlockCount 节点。 目前在相机上缓冲的图像数量见 TransferQueueCurrentBlockCount 节点。
如果 USB3 摄像头拍照后 PC 如果没有可用的缓冲区,图像将自动存储在机载缓冲区。 一旦 PC 有一个可用的空间,相机机载缓冲区的图像将自动传输到 PC。 若采用先处理最新模式,则会干扰预期的图像顺序。
通过Code改变缓冲区的大小
通过Spinnaker C 接口 将缓冲区的大小改为11,默认为10
Spinnaker::GenApi::INodeMap & sNodeMap = cam->GetTLStreamNodeMap(); CIntegerPtr StreamNode = sNodeMap.GetNode(“StreamDefaultBufferCount”); INT64 bufferCount = StreamNode->GetValue(); StreamNode->SetValue(11);
通过 GetTLStreamNodeMap 获得NodeMap 通过 GetNode 获得Node 通过 GetValue 默认缓冲区大小 通过 SetValue 将缓冲区大小设置为11