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 校正方法
我一般分三步走:
- 标定:用棋盘格或圆点阵拍一组图像
- 计算畸变系数:用OpenCV的
calibrateCamera()函数 - 重映射:用
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 普通镜头
我画了一张对比图,帮你快速理解:
3.3.4 选型实战案例
去年我接了一个项目,要检测手机中框的平面度,精度要求±0.005mm。普通镜头根本搞不定,因为中框有0.3mm的高度差,透视误差直接超标。
我最后选了:
- 0.5x 远心镜头
- 工作距离 110mm
- 远心度 0.03°
- 搭配 5MP 工业相机
结果:测量重复性达到±0.003mm,一次性通过验收。所以说,选对镜头,项目就成功了一半。
3.4 本章小结
镜头选型没有万能公式,但有几个原则可以记住:
- 先算后选:焦距、光圈、景深要匹配实际工况
- 畸变必须校正:尤其是广角镜头,不校正就别谈精度
- 远心镜头是「神器」:但别滥用,成本高、景深浅,适合高精度场景
嗯,这些就是我这些年摸爬滚打总结出来的经验。下次遇到镜头问题,不妨先对照着排查一遍,八成能解决。