图像采集与传输:相机接口标准、触发模式与数据格式
图像采集是整个机器视觉系统的第一道关卡。说白了,相机选对了接口,项目就成功了一半。我见过太多项目在调试阶段才发现带宽不够用,或者触发延迟对不上产线节拍——那时候再换相机,成本就高了。
相机接口标准:GigE、USB3.0、Camera Link
目前主流的数字相机接口就这三种。我按自己的使用经验给你排个序:GigE 最灵活,USB3.0 最方便,Camera Link 最硬核。
| 接口 | 带宽 | 线缆长度 | 典型场景 | 我的评价 |
|---|---|---|---|---|
| GigE Vision | 1 Gbps(约 125 MB/s) | 100 米(Cat6) | 多相机、远距离、产线分散 | 稳定,适合工业环境 |
| USB3.0 Vision | 5 Gbps(约 500 MB/s) | 3~5 米(可加中继) | 桌面检测、单相机、快速原型 | 即插即用,但线长受限 |
| Camera Link | 2.04~6.8 Gbps(Base/Medium/Full) | 10~15 米 | 高分辨率、高帧率、线阵相机 | 延迟最低,但需要采集卡 |
触发模式与帧率控制
触发模式决定了相机什么时候开始曝光。这个选不对,图像要么拍早了,要么拍晚了,要么拍重了。
三种常用触发模式
- 自由运行(Free-Run):相机按内部时钟连续采集。适合传送带匀速、目标连续出现的场景。但要注意——如果目标间隔不均匀,会浪费带宽和存储。
- 硬件触发(Hardware Trigger):外部传感器(光电开关、编码器)给一个脉冲,相机拍一张。这是工业现场最可靠的方式。我建议所有产线项目都优先考虑硬件触发。
- 软件触发(Software Trigger):上位机发指令触发采集。延迟不稳定(通常 1~10 ms),只适合低速或实验场景。
帧率控制的核心公式
帧率不是想设多少就设多少。它受三个因素限制:
最大帧率 = 1 / (曝光时间 + 读出时间 + 传输时间)
实际帧率 ≤ min(相机最大帧率, 接口带宽限制, 触发信号频率)
举个例子:你有一台 500 万像素相机,像素深度 8 bit,帧率标称 60 fps。但如果你用 GigE 接口:
单帧数据量 = 2592 × 1944 × 1 = 5.04 MB
GigE 理论带宽 = 125 MB/s
理论最大帧率 = 125 / 5.04 ≈ 24.8 fps
看到了吗?接口带宽成了瓶颈。你实际能跑到的帧率只有 25 fps 左右,而不是 60 fps。
图像数据格式:Bayer、RGB、YUV
相机输出的原始数据格式,直接影响后续处理流程。选错了格式,要么浪费带宽,要么丢失信息。
| 格式 | 数据量(以 1920×1080 为例) | 特点 | 典型用途 |
|---|---|---|---|
| Bayer(RAW) | 2.07 MB(8 bit) | 每个像素只有一种颜色,需要去马赛克 | 工业相机、高帧率场景 |
| RGB888 | 6.22 MB(24 bit) | 每个像素 3 个通道,颜色完整 | 显示、颜色分析、深度学习 |
| YUV422 | 4.15 MB(16 bit) | 亮度全分辨率,色度半分辨率 | 视频流、传输带宽敏感场景 |
我个人习惯是:能走 Bayer 就走 Bayer。为什么?因为 Bayer 数据量最小,传输最快。而且现在的 ISP 算法(比如去马赛克、白平衡)在 GPU 上跑得飞快,完全可以在上位机做。我在一个 PCB 检测项目中,用 Bayer 格式把帧率从 30 fps 提到了 45 fps——就是因为省掉了相机内部的 RGB 转换时间。
图像传输带宽计算
带宽计算是系统设计的必修课。算错了,轻则丢帧,重则系统崩溃。
带宽计算公式
带宽需求 = 图像宽度 × 图像高度 × 像素深度 × 帧率 × 通道数
单位:字节/秒(Bps)
举个例子:
相机参数:2448 × 2048, 8 bit, 30 fps, 单色
带宽需求 = 2448 × 2048 × 1 × 30 = 150,405,120 Bps ≈ 143.4 MB/s
GigE 有效带宽 ≈ 110 MB/s(考虑协议开销)
结论:GigE 不够用,必须用 USB3.0 或 Camera Link
多相机带宽分配
如果你用多台相机,还要考虑总线共享的问题。比如 USB3.0 控制器通常共享 5 Gbps 带宽,4 台相机同时采集,每台只能分到 1.25 Gbps。我建议:
- 多台 GigE 相机:用独立网卡或交换机端口隔离
- 多台 USB3.0 相机:尽量分散到不同 USB 控制器(看主板芯片组)
- Camera Link:每台相机独占采集卡通道
嗯,到这里,图像采集与传输的核心内容就讲完了。你想想看,其实就三件事:选对接口、算对带宽、用对格式。这三件事做好了,后面的图像处理才能跑得稳。我每次做新项目,都会先拿这个框架过一遍,基本不会出大问题。