一、图像采集基础:工业相机选型、镜头与光源搭配、触发模式与帧率控制

各位同学,咱们今天聊聊图像采集的基础。说实话,这部分内容看着简单,但我在项目里见过太多人在这上面栽跟头。你想想看,相机选错了,后面算法再牛也白搭。所以这一节,我把自己这些年踩过的坑、总结的经验,都摊开来跟你讲讲。

1.1 工业相机选型:别只看像素

很多人一上来就问:「我要多少万像素的相机?」其实像素只是其中一个维度。我个人习惯先问三个问题:拍什么?多快?多暗?

核心选型参数(按优先级排序):

  1. 传感器类型:CCD vs CMOS。以前CCD是老大,现在CMOS技术进步很快。我做过一个项目,在强光下检测微小划痕,CMOS的全局快门反而比CCD更合适。
  2. 分辨率:不是越高越好。分辨率高了,数据量大,帧率就下来了。你想想看,检测一个10mm的零件,200万像素够用,非要上1200万,结果帧率只有5fps,产线根本跑不起来。
  3. 帧率:这个跟你的产线节拍直接挂钩。我建议留出30%的余量。
  4. 接口类型:GigE、USB3.0、Camera Link、CoaXPress。做设备联网,我个人最推荐GigE,原因后面讲网络通信时会细说。
接口类型 带宽 传输距离 适用场景
GigE 1 Gbps 100米 设备联网首选,布线方便
USB3.0 5 Gbps 5米 实验室、短距离高速采集
Camera Link 6.8 Gbps 10米 高分辨率、高帧率场景
CoaXPress 12.5 Gbps 100米+ 超高速、远距离传输

我的小技巧:选型时先定接口,再定传感器。接口决定了你的网络架构怎么搭。我曾经在一个项目中,客户非要USB3.0,结果现场距离超过10米,最后只能加中继器,麻烦得很。

1.2 镜头与光源搭配:光打不好,一切白搞

嗯,这里要注意。镜头和光源的搭配,说白了就是「让特征看得见」。我见过太多人花几万块买相机,却用几十块的镜头和手电筒打光。结果呢?图像质量一塌糊涂。

镜头选型要点

  • 焦距:决定了视场角。公式很简单:焦距 = 工作距离 × 传感器尺寸 / 视场大小。但实际项目中,我建议你留出10%的余量。
  • 光圈:F值越小,进光量越大,但景深越浅。做检测时,我一般用F8-F11,景深够用,成像也锐利。
  • 畸变:普通镜头边缘畸变在1%-3%。做测量的话,必须用远心镜头。我记得有一次,客户用普通镜头测直径,边缘差了0.2mm,差点被投诉。

光源搭配的「三字经」

我总结了一套口诀,你记一下:

光源搭配三原则:

  • 颜色对:用互补色打光,特征最明显。比如检测红色字符,用蓝色光,对比度瞬间拉满。
  • 角度巧:低角度打光突出表面纹理,高角度打光消除反光。做金属表面检测,我习惯用45度环形光。
  • 均匀先:光源不均匀,算法再强也救不了。我建议用漫射板或者穹顶光源。

避坑指南:我曾经在一个项目中,用了白色LED环形光打不锈钢表面,结果反光严重,特征全被淹没了。后来换成蓝色低角度光,问题迎刃而解。所以,打光方案一定要现场试,别光看理论。

1.3 触发模式与帧率控制:让相机听你的话

触发模式,说白了就是「什么时候拍」。帧率控制,就是「拍多快」。这两者配合不好,图像要么漏拍,要么重复拍。

三种常见触发模式

触发模式 工作原理 适用场景
自由运行模式 相机按固定帧率连续采集 流水线匀速运动、监控场景
硬件触发 外部信号(如光电传感器)触发拍照 定位抓拍、异步检测
软件触发 上位机发送指令触发 实验室、低速场景

我个人最推荐硬件触发。为什么?因为稳定。软件触发有延迟,你想想看,Windows系统调度一波动,触发时间可能差几十毫秒。产线上,这几十毫秒可能就让产品跑偏了。

帧率控制的几个关键点

  • 曝光时间 vs 帧率:曝光时间长了,帧率自然就低。公式:最大帧率 ≤ 1 / 曝光时间。但实际还要考虑数据传输时间。
  • 带宽瓶颈:GigE接口理论带宽1Gbps,但实际有效带宽也就800Mbps左右。算一下:200万像素、8位灰度图,一帧约2MB,理论帧率也就50fps。但加上网络开销,实际能到40fps就不错了。
  • 触发延迟:硬件触发延迟一般在微秒级,软件触发在毫秒级。做高速检测,必须用硬件触发。

我的经验:做帧率控制时,我习惯先算理论值,再留30%余量。比如产线需要30fps,我会选能稳定跑40fps的配置。这样即使光照变化导致曝光时间增加,也不会掉帧。

实际项目中的触发配置示例

给你看一个我常用的硬件触发配置代码片段(基于GigE相机):

// 设置触发模式为硬件触发
camera.TriggerMode = TriggerMode.On;
camera.TriggerSource = TriggerSource.Line0;  // 接光电传感器

// 设置触发延迟(微秒)
camera.TriggerDelay = 100;  // 延迟100us,等待产品到位

// 设置曝光时间(微秒)
camera.ExposureTime = 2000;  // 2ms曝光

// 开始采集
camera.StartCapture();

这段代码看着简单,但实际调试时,触发延迟和曝光时间要反复调。我记得有一次,触发延迟设了50us,结果产品还没完全到位就拍了,图像里只有半个零件。后来调到120us,才完美捕捉。

注意:硬件触发信号的电平类型(NPN/PNP)一定要跟相机匹配。我曾经被这个坑过,信号线接反了,相机死活不触发。查了半天,原来是电平不匹配。所以,接线前一定先看手册。

好了,图像采集基础就讲这么多。下一节咱们聊聊网络通信协议,这部分是设备联网的核心。你想想看,图像采回来了,怎么传出去?用什么协议?怎么保证不丢包?这些才是真正考验工程师功底的地方。