第二章 相机与镜头选型:工业相机分类与镜头参数实战

大家好,我是老张。在工业视觉这行摸爬滚打了十几年,今天咱们聊聊相机和镜头的选型。说实话,这是整个视觉系统里最基础也最容易踩坑的环节。我见过太多项目,算法调得再好,硬件选错了,最后全白搭。

核心观点:相机和镜头选型,决定了你整个测量系统的精度上限。选错了,后面再怎么优化也救不回来。

2.1 工业相机分类:CCD vs CMOS,全局快门 vs 卷帘快门

先说说传感器类型。CCD和CMOS之争,其实已经持续很多年了。我个人习惯是:高精度静态测量用CCD,高速动态检测用CMOS。为什么?

CCD的优点是噪声低、动态范围大、像质均匀。我在做半导体晶圆检测项目时,用的就是CCD相机。那会儿客户要求测量精度到0.5微米,CMOS根本扛不住。但CCD的缺点也很明显——帧率低、功耗大、成本高。

CMOS这些年进步飞快。尤其是全局快门CMOS的出现,让它在工业领域站稳了脚跟。我记得2018年有个项目,检测流水线上的药瓶,速度要求每分钟600个。CCD根本跟不上,最后用了全局快门CMOS,完美解决。

参数 CCD CMOS(全局快门) CMOS(卷帘快门)
噪声水平 中等 中等
帧率 低(通常<30fps) 高(可达1000fps)
动态范围 高(>70dB) 中等(60-70dB) 中等
成本 中等
适用场景 高精度静态测量 高速动态检测 低速或静态场景

避坑指南:我曾经在一个项目中选了卷帘快门CMOS去拍高速运动的零件,结果图像严重变形,像被扭曲了一样。后来才明白,卷帘快门是逐行曝光的,运动物体拍出来就是歪的。所以,拍运动物体,必须用全局快门

2.2 镜头参数:焦距、光圈、畸变

镜头这东西,说白了就是相机的「眼睛」。选不好,再好的相机也白搭。

2.2.1 焦距

焦距决定了你的视野大小和工作距离。公式很简单:

焦距 f = (工作距离 × 传感器尺寸) / 视野宽度

举个例子:你要拍一个100mm宽的零件,传感器是1/2英寸(宽6.4mm),工作距离200mm。那么:

f = (200 × 6.4) / 100 = 12.8mm

所以选12mm或16mm的镜头都行。我个人习惯选稍长一点的焦距,因为边缘畸变会小一些。

2.2.2 光圈

光圈控制进光量和景深。工业测量中,我建议光圈设在F8到F11之间。为什么?

  • 光圈太大(F2.8以下):景深太浅,零件稍微不平就虚了
  • 光圈太小(F16以上):衍射效应开始显现,图像反而变模糊

我记得有个项目,客户非要用F2.8的大光圈,说光线不够。结果零件边缘全是虚的,测量误差直接翻倍。后来加了补光灯,光圈收到F8,问题全解决了。

2.2.3 畸变

畸变是镜头的固有缺陷。广角镜头尤其明显。工业测量中,畸变必须校正。

常见的畸变有两种:

  • 桶形畸变:图像中间向外凸出,像桶一样
  • 枕形畸变:图像中间向内凹陷

校正方法:用标定板拍一张图,算出畸变系数,然后用OpenCV的cv2.undistort()函数校正。代码很简单:

import cv2
import numpy as np

# 读取标定板图像
img = cv2.imread('calibration.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 标定参数(从标定结果中获取)
mtx = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
dist = np.array([k1, k2, p1, p2, k3])

# 校正
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

小技巧:选镜头时,尽量选低畸变系列。像Computar的M系列、Kowa的LM系列,畸变都控制在0.1%以内。虽然贵点,但省去了后期校正的麻烦。

2.3 分辨率与视野计算实战

这部分是选型的核心。说白了,就是算清楚你需要多少像素。

2.3.1 分辨率计算

公式很简单:

所需像素 = 视野宽度 / 检测精度

举个例子:你要检测一个50mm宽的零件,要求精度0.02mm。那么:

所需像素 = 50 / 0.02 = 2500像素

但注意,这是理论值。实际中要考虑:

  • 边缘检测算法:亚像素算法可以做到0.1像素精度,但需要至少3-5个像素覆盖特征边缘
  • 系统稳定性:建议留20%-30%的余量

所以实际选型时:

实际像素 = 2500 × 1.3 ≈ 3250像素

那就选500万像素的相机(2592×1944),或者更高。

2.3.2 视野计算

视野由传感器尺寸和镜头焦距共同决定:

视野宽度 = (传感器宽度 × 工作距离) / 焦距

还是刚才的例子:传感器宽6.4mm,工作距离200mm,焦距12.8mm:

视野宽度 = (6.4 × 200) / 12.8 = 100mm

完美匹配。

实战经验:我一般会先确定检测精度,反推需要的像素数,再选相机。然后根据工作距离和视野,算焦距。最后用畸变小的镜头。这个顺序别搞反了。

2.4 知识体系总览

下面这张图,是我自己总结的选型流程。你照着走,基本不会出错。

工业相机与镜头选型知识体系 需求分析 检测精度 · 工作距离 · 视野大小 · 运动速度 相机选型 传感器类型:CCD(高精度静态) vs CMOS(高速动态) 快门方式:全局快门(运动物体) vs 卷帘快门(静态场景) 镜头选型 焦距:f = (工作距离 × 传感器尺寸) / 视野宽度 光圈:F8-F11最佳 · 畸变:<0.1%低畸变系列 计算验证 分辨率 = 视野 / 精度 · 留20%-30%余量 最终确认:打样测试

2.5 实战案例:一个完整的选型过程

最后,我拿一个真实项目来演示。这是去年做的一个PCB板检测项目:

  • 检测对象:PCB板,尺寸100mm×80mm
  • 检测精度:0.05mm
  • 工作距离:200mm
  • 运动状态:静止(放在平台上拍)

选型步骤:

  1. 计算所需像素:100 / 0.05 = 2000像素。留30%余量,需要2600像素。选500万像素相机(2592×1944)
  2. 选传感器类型:静态检测,CCD和CMOS都行。考虑到成本,选了全局快门CMOS
  3. 算焦距:传感器宽6.4mm,f = (200 × 6.4) / 100 = 12.8mm。选了12mm镜头
  4. 选光圈:F8,景深够用
  5. 畸变控制:选了Computar M1214-MP2,畸变<0.1%

最终效果:测量误差稳定在0.03mm以内,客户很满意。

最后说一句:选型这事,理论算得再准,也不如实际打样测试一次。我每次都会先借几款镜头和相机,拍几张图看看效果。毕竟,纸上得来终觉浅嘛。

专注资料整理