3. 光学镜头与成像:从参数到选型的实战要点

镜头这东西,看着简单,其实坑不少。我做了这么多年光学检测,见过太多因为镜头选型不当导致项目返工的情况。今天咱们就把镜头参数、畸变校正、远心镜头选型这几个核心问题掰开揉碎了讲。

3.1 镜头三大核心参数:焦距、光圈、景深

这三个参数是绑在一起的,动一个,另外两个跟着变。我习惯把它们叫做「铁三角」。

3.1.1 焦距

焦距决定了视场角大小。说白了,焦距越短,看得越宽;焦距越长,看得越远越细。

焦距范围 典型应用 注意事项
4-8mm 大视野、近距离检测 畸变较大,需校正
12-25mm 通用工业检测 畸变适中,性价比高
35-75mm 高精度、小视野 景深较浅,对焦要求高
我的经验:选焦距时,先算工作距离和视场大小。公式很简单:焦距 = 工作距离 × 传感器尺寸 / 视场宽度。别死记硬背,拿尺子比划一下更直观。

3.1.2 光圈

光圈控制进光量,用F数表示。F值越小,光圈越大,进光越多。

但这里有个陷阱——很多人以为光圈越大越好。其实不然。大光圈虽然进光多,但像差也大,边缘画质会下降。我一般建议:

  • 高精度测量:用F8-F11,画质最锐
  • 低光照环境:用F2.8-F4,但要做好畸变校正
  • 大景深需求:用F16以上,但注意衍射效应
避坑:我曾经在一个项目中,为了追求亮度把光圈开到F1.4,结果边缘模糊得一塌糊涂。后来老老实实换回F8,加了两盏补光灯才解决问题。记住,光圈不是越大越好,够用就行。

3.1.3 景深

景深就是清晰范围。光圈越小,景深越大。但景深还跟工作距离、像素大小有关。

我常用的估算方法:

景深 ≈ 2 × 光圈F数 × 像素尺寸 × (工作距离 / 焦距)²

举个例子:用25mm镜头,工作距离200mm,光圈F8,像素3.45μm,算下来景深大概±1.5mm。嗯,这个精度对大多数检测场景够用了。

3.2 畸变校正:别让镜头「说谎」

畸变是镜头的固有缺陷,尤其是广角镜头。说白了,就是直线拍出来变弯了。

3.2.1 畸变类型

  • 桶形畸变:画面中间向外凸,常见于广角
  • 枕形畸变:画面四角向内凹,常见于长焦
  • 复合畸变:两者混合,最麻烦

3.2.2 校正方法

我一般分三步走:

  1. 标定:用棋盘格或圆点阵拍一组图像
  2. 计算畸变系数:用OpenCV的calibrateCamera()函数
  3. 重映射:用remap()生成校正后的图像

代码示例(Python + OpenCV):

import cv2
import numpy as np

# 读取标定图像
images = [cv2.imread(f'calib_{i}.jpg') for i in range(20)]

# 棋盘格角点检测
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*9, 3), np.float32)
objp[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)

objpoints = []
imgpoints = []

for img in images:
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (9, 6), None)
    if ret:
        objpoints.append(objp)
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        imgpoints.append(corners2)

# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
    objpoints, imgpoints, gray.shape[::-1], None, None)

# 畸变校正
img = cv2.imread('test.jpg')
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
关键点:标定图像要覆盖整个视场,至少拍15-20张。我习惯让棋盘格在画面中旋转、倾斜、平移,这样算出来的畸变系数才准。

3.3 远心镜头选型:高精度测量的「标配」

远心镜头最大的特点:没有透视误差。什么意思?就是物体前后移动,成像大小不变。这对精密测量来说太重要了。

3.3.1 什么时候必须用远心镜头?

  • 被测物体有高度差(比如台阶、凸起)
  • 测量精度要求高于0.01mm
  • 物体在传送带上位置不固定

3.3.2 选型参数对照

参数 说明 我的建议
放大倍率 0.1x - 4x 常见 根据视场和传感器尺寸反推
工作距离 通常50-200mm 留出安装光源和夹具的空间
景深 远心镜头景深较浅 确保被测物在景深范围内
远心度 越小越好,一般<0.1° 高精度选<0.05°
选型口诀:先定视场,再算倍率,后看工作距离,最后校核远心度。别搞反了顺序,否则容易选到不合适的镜头。

3.3.3 远心镜头 vs 普通镜头

我画了一张对比图,帮你快速理解:

远心镜头 vs 普通镜头成像对比 普通镜头(透视成像) 近处物体 远处物体 传感器 近大远小,有透视误差 远心镜头(平行光成像) 近处物体 远处物体 传感器 大小不变,无透视误差 核心差异 普通镜头:物体越近成像越大 → 测量误差随高度变化 远心镜头:物体远近成像大小不变 → 适合高精度测量

3.3.4 选型实战案例

去年我接了一个项目,要检测手机中框的平面度,精度要求±0.005mm。普通镜头根本搞不定,因为中框有0.3mm的高度差,透视误差直接超标。

我最后选了:

  • 0.5x 远心镜头
  • 工作距离 110mm
  • 远心度 0.03°
  • 搭配 5MP 工业相机
结果:测量重复性达到±0.003mm,一次性通过验收。所以说,选对镜头,项目就成功了一半。

3.4 本章小结

镜头选型没有万能公式,但有几个原则可以记住:

  1. 先算后选:焦距、光圈、景深要匹配实际工况
  2. 畸变必须校正:尤其是广角镜头,不校正就别谈精度
  3. 远心镜头是「神器」:但别滥用,成本高、景深浅,适合高精度场景

嗯,这些就是我这些年摸爬滚打总结出来的经验。下次遇到镜头问题,不妨先对照着排查一遍,八成能解决。