4. 图像采集模式详解
在 pylon 的采集体系中,相机打开并完成参数配置后,真正决定“图像以什么节奏进入主机”的是采集模式(Acquisition Mode)。Basler 相机通常提供三种模式:Continuous(连续采集)、SingleFrame(单帧采集)和 MultiFrame(多帧采集)。它们并不是三个互不相关的功能,而是同一套采集状态机在不同“帧数上限”和“停止条件”下的三种表现。理解这一点,比记住三个枚举值更重要。
从相机内部看,采集模式主要影响两个行为:一是 AcquisitionStart 之后相机是否自动停止;二是当达到设定帧数后,相机是否回到 AcquisitionStop 状态。连续采集不设帧数上限,一旦启动就持续输出,直到显式调用停止命令;单帧采集等价于帧数上限为 1 的多帧采集;多帧采集则允许指定一个大于 1 的帧数上限,达到后自动停止。因此,在 pylon API 中,单帧与多帧往往共用同一个参数 AcquisitionFrameCount,只是取值不同。
AcquisitionMode 取 Continuous / SingleFrame / MultiFrame;AcquisitionFrameCount 仅在 MultiFrame 下生效,表示本次采集允许输出的最大帧数。
下面这张图把三种模式放在同一时间轴上对比,重点看“启动—输出—停止”的差异,以及帧数上限对停止时机的影响。
在 pylon C++ API 中,设置采集模式的典型代码如下。注意 AcquisitionFrameCount 必须在 MultiFrame 模式下设置,否则可能被忽略或抛出异常。
// 假设已获取 CInstantCamera camera 并打开
GenApi::INodeMap& nodemap = camera.GetNodeMap();
// 1) 连续采集
GenApi::CEnumerationPtr mode(nodemap.GetNode("AcquisitionMode"));
mode->FromString("Continuous");
camera.StartGrabbing(GrabStrategy_LatestImageOnly);
// 2) 单帧采集
mode->FromString("SingleFrame");
camera.StartGrabbing(1); // 抓取 1 帧后自动停止
// 3) 多帧采集(示例:4 帧)
mode->FromString("MultiFrame");
GenApi::CIntegerPtr frameCount(nodemap.GetNode("AcquisitionFrameCount"));
frameCount->SetValue(4);
camera.StartGrabbing(4); // 抓取 4 帧后自动停止
这里有一个容易混淆的点:StartGrabbing 的参数与相机端的 AcquisitionFrameCount 是两个层面的控制。前者是主机侧抓取策略的帧数上限,后者是相机侧输出帧数的上限。工程上建议两者保持一致,例如都设为 4,避免主机提前停止而相机仍在输出,或相机提前停止而主机一直等待。若使用 GrabStrategy_OneByOne,主机按顺序逐帧取图,适合需要严格帧序的多帧采集;若使用 GrabStrategy_LatestImageOnly,主机只保留最新帧,适合连续采集下的实时显示,但会丢弃中间帧。
三种模式的适用场景差异明显。连续采集适合实时监控、视频流显示、长时间过程记录,例如流水线上的外观巡检,相机持续输出,主机按需取帧或显示。单帧采集适合“拍一张就走”的场景,例如触发一次拍照、测量一个静态工件、标定时的单次取图。多帧采集适合需要固定帧数完成一次任务的场景,例如一次触发后连拍 4 帧用于多曝光融合、运动物体的短序列分析、或需要严格帧数的批量采集。选择哪种模式,取决于任务是否需要“持续”、是否“只取一帧”、还是“固定帧数后停止”。
还有一个与采集模式密切相关的参数是 AcquisitionStop 的行为。连续采集必须显式调用 camera.StopGrabbing(),否则相机会一直输出,占用带宽和主机资源。单帧和多帧在达到帧数后会自动停止,但主机侧仍建议调用 StopGrabbing() 释放资源,并检查 camera.IsGrabbing() 的状态。若在 MultiFrame 下帧数设为 0,部分型号会将其解释为“无限”,行为退化为连续采集,这一点在跨型号移植时需要特别验证。
最后给出一个选择判断的简单依据:需要持续观察就选 Continuous;只需要一张图就选 SingleFrame;需要固定张数、且希望相机自动停止就选 MultiFrame。把采集模式与触发源、抓取策略、帧数上限一起考虑,才能让采集行为既符合任务需求,又保持可预测、可复现。