4. 相机参数配置与量产配方管理

在工业成像系统的量产阶段,单台相机“调通”并不等于产线“跑稳”。同一型号的多台相机、不同批次的传感器、甚至同一台相机在不同温度下的响应都可能存在差异。如果每台设备都靠现场工程师手动调参,不仅效率低下,还会导致成像结果不可复现、质量判定标准漂移。因此,把一组经过验证的相机参数固化为“配方”(Recipe),并通过版本控制和批量下发机制统一管理,是量产运维的核心工程实践。

一、五类核心参数的物理含义与配置逻辑

曝光时间(Exposure Time)决定传感器感光积分时长,单位通常为微秒(μs)。曝光越长,图像越亮,但运动物体拖影越严重。对于传送带上的工件检测,曝光时间需满足:曝光时间 ≤ 允许拖影量 ÷ 物体运动速度。例如物体速度 200 mm/s、允许拖影 0.1 mm,则曝光时间应不超过 500 μs。Basler 相机的曝光时间通过 ExposureTime 节点设置,部分型号还支持 ExposureAuto 自动模式,但量产中通常锁定为 Off 以保证一致性。

增益(Gain)是对传感器模拟信号的放大,单位常用 dB 或倍数。增益能提亮图像,但会同步放大噪声,降低信噪比。工程原则是“优先加曝光、谨慎加增益”:在曝光时间受运动约束无法延长时,才用增益补足亮度。Basler 相机的 Gain 节点通常以 dB 为单位,例如设置 Gain = 6.0 表示约 2 倍放大。

白平衡(White Balance)用于校正光源色温导致的色彩偏移,通过调整红、绿、蓝三通道增益比实现。彩色相机需配置 BalanceRatioRed、BalanceRatioGreen、BalanceRatioBlue。量产中常用“白纸/白板标定法”:在目标光源下拍摄标准白板,使三通道均值趋于一致。若使用单色相机,则无需白平衡配置。

像素格式(Pixel Format)决定图像数据的编码方式,直接影响带宽、存储和后续算法兼容性。常见格式包括 Mono8(8位灰度)、Mono12(12位灰度)、BayerRG8(彩色原始)、RGB8Packed(彩色打包)。选择原则:若算法只需灰度且对带宽敏感,选 Mono8;若需保留高动态范围细节,选 Mono12;彩色检测则用 BayerRG8 并在主机端做去马赛克。

ROI(Region of Interest)允许只读取传感器部分区域,从而提升帧率、降低带宽。配置 Width、Height、OffsetX、OffsetY 四个参数。注意:ROI 的偏移和尺寸通常需满足对齐约束(如宽度为 4 的倍数),且缩小 ROI 会改变视场中心,需重新标定坐标系。例如将 1920×1080 缩小为 800×600 并偏移 (560, 240),可让帧率从 60 fps 提升至约 120 fps(具体取决于相机型号)。

相机参数配方管理与批量下发流程 参数配置 曝光 ExposureTime 增益 Gain 白平衡 BalanceRatio 像素格式 PixelFormat ROI Width/Height/Offset 示例:500μs / 6dB / Mono8 配方文件 recipe_v1.2.0.json 含参数键值对 校验和 SHA256 适用机型/固件版本 创建时间/作者 版本号语义化:主.次.修订 版本控制 Git / SVN 仓库 变更记录 Changelog 回滚至 v1.1.0 审批与发布标签 差异对比 Diff 禁止直接修改已发布版本 批量下发与验证 相机 #1 已下发 相机 #2 已下发 相机 #N 已下发 回读参数比对 + 图像一致性抽检 → 通过/告警 关键约束 • 参数需与固件版本匹配 • ROI 对齐约束(4像素) • 曝光与帧率相互制约 • 白平衡依赖光源色温 • 下发前校验 SHA256 • 失败相机自动重试

二、配方文件的版本控制

配方文件本质是一组“参数名—值”的映射,通常以 JSON 或 INI 格式保存。一个可用的配方文件应包含:参数键值对、适用相机型号与固件版本、创建时间与作者、校验和(如 SHA256)。版本号建议采用语义化版本 主版本.次版本.修订号:主版本变更表示不兼容的参数结构调整;次版本表示新增参数或功能;修订号表示参数值微调或缺陷修复。

版本控制的核心原则是“已发布版本不可直接修改”。任何变更都应生成新版本,并记录变更原因。例如 v1.2.0 将曝光从 500 μs 调整为 450 μs,原因是新批次光源亮度提升。若现场发现 v1.2.0 导致过暗,可回滚至 v1.1.0。使用 Git 管理配方文件时,建议每个配方独立仓库或独立目录,提交信息中注明“机型—版本—变更摘要”,便于追溯。

配方文件中的参数值应附带单位与有效范围注释,例如 "ExposureTime": {"value": 500, "unit": "us", "min": 100, "max": 10000},避免不同工程师对数值含义产生歧义。

三、批量下发与一致性验证

批量下发通常通过相机厂商 SDK(如 Basler pylon)或 GenICam 协议实现。基本流程是:枚举在线相机 → 逐台连接 → 写入参数 → 回读比对 → 记录结果。以下是一个简化的 pylon Python 示例,展示如何将配方字典写入多台相机:

from pypylon import pylon

recipe = {
    "ExposureTime": 500.0,
    "Gain": 6.0,
    "PixelFormat": "Mono8",
    "Width": 800, "Height": 600,
    "OffsetX": 560, "OffsetY": 240
}

tl = pylon.TlFactory.GetInstance()
devices = tl.EnumerateDevices()
for dev in devices:
    cam = pylon.InstantCamera(tl.CreateDevice(dev))
    cam.Open()
    for node, val in recipe.items():
        cam.GetNodeMap().GetNode(node).SetValue(val)
    # 回读验证
    actual = cam.ExposureTime.GetValue()
    print(dev.GetModelName(), "ExposureTime =", actual)
    cam.Close()

下发完成后必须进行一致性验证,不能仅凭“写入成功”就判定通过。验证分两步:第一步回读关键参数,与配方文件逐项比对,偏差超过阈值(如曝光 ±1%)则告警;第二步抽检图像,在相同光源和工件下比较灰度均值、对比度等统计量,若多台相机差异超过预设范围,说明存在个体差异或配置遗漏。

批量下发时若某台相机离线或固件版本不匹配,应跳过并记录,不可强行写入。强行写入可能导致相机进入异常状态,需断电重启才能恢复。

四、量产配方管理检查表

为便于现场执行,以下检查表可直接用于每次配方变更或产线换型:

检查项要求示例/判断依据
配方版本号语义化且唯一v1.2.0,禁止重复
适用机型/固件与实际相机一致acA1920-40gm / 固件 2.3.1
曝光时间满足拖影约束≤ 500 μs(速度 200 mm/s)
增益尽量低,噪声可接受≤ 10 dB,信噪比 ≥ 40 dB
白平衡三通道均值偏差 ≤ 5%白板标定后 R/G/B 均值接近
像素格式与算法兼容Mono8 或 Mono12
ROI 对齐宽度/偏移为 4 的倍数Width=800, OffsetX=560
校验和SHA256 与文件一致下发前自动校验
回读比对关键参数偏差 ≤ 1%曝光、增益、ROI 尺寸
图像抽检灰度均值差异 ≤ 5%同工件、同光源下比较

配方管理的最终目标不是“把参数写进去”,而是让每一台相机在任意时间、任意产线都能复现同一成像结果。这要求参数配置有据可查、版本变更可追溯、批量下发可验证。当产线换型或新增设备时,只需选择对应配方版本并执行下发,即可在数分钟内完成整线部署,而无需逐台手动调试。