3 相机与镜头
一套机器视觉系统的算法再精妙,处理的也只是相机交出来的那幅图像。算法链条的最上游是光学:光线穿过镜头、落在传感器上的那一刻,图像的质量上限就已经确定了——对比度不足、细节糊掉、运动拖影、透视变形,这些缺陷没有任何后续算法能真正补救。把钱和心思花在选对相机与镜头上,往往比事后在软件里”增强”划算得多。
本章做三件事:先建立针孔成像模型,给出焦距、工作距离、视场之间的选型计算;再讨论传感器与镜头侧的关键工程概念——像元、快门、景深与远心;最后回答一个产线上每天都要回答的问题:“清楚”能不能变成一个数?我们将给出两类清晰度评价函数,用一组真实实验比较它们的优劣,并说明自动对焦如何在这条曲线上”爬山”。
3.1 针孔模型与成像几何
最简单也最有用的相机模型是针孔模型(pinhole model):所有光线穿过一个理想小孔,在小孔后方距离 \(f\) 处的像平面上成倒像。设空间点在相机坐标系下的坐标为 \((X, Y, Z)\)(\(Z\) 为沿光轴的距离),其像点坐标为
\[ x = f\,\frac{X}{Z}, \qquad y = f\,\frac{Y}{Z}. \]
这就是透视投影(perspective projection),核心是那个除以 \(Z\):同样大小的物体,离相机越远(\(Z\) 越大),成像越小——“近大远小”的日常经验被压缩成了一次除法。参数 \(f\) 称为焦距(focal length),它是成像几何的缩放旋钮:\(f\) 越长,同一物体的像越大、视野越窄。
真实镜头还有畸变:直线在像面上被弯成弧线,越靠近视场边缘越明显。章节 5 会在针孔模型之上加入畸变项与内参矩阵,得到可用于精密测量的完整模型;本章先用理想针孔建立选型直觉。
选型时常用的几个量由此联系起来。设工作距离(working distance,WD)为镜头到物体的距离,视场(field of view,FOV)为图像恰好覆盖的物面宽度,传感器宽度为 \(h\),则放大率(magnification)为
\[ m = \frac{h}{\mathrm{FOV}}, \qquad f = \frac{m\cdot \mathrm{WD}}{1+m}. \]
第二式来自薄透镜公式;当 \(\mathrm{WD} \gg f\) 时它退化为更常见的粗略式 \(f \approx m\cdot\mathrm{WD}\)。
来做一个具体算例。某检测工位选用 1/1.8″ 传感器,像元 2.4 μm、分辨率 3072×2048,传感器宽度 \(h = 3072 \times 2.4\ \mu\text{m} \approx 7.4\) mm;机构限定工作距离 300 mm,需要覆盖 50 mm 宽的视场。于是 \(m = 7.4/50 \approx 0.148\),代入得 \(f \approx 0.148 \times 300 / 1.148 \approx 38.7\) mm。市售定焦镜头没有 38.7 mm 这一档,就近向短取 35 mm:实际放大率 \(m' = f/(\mathrm{WD}-f) = 35/265 \approx 0.132\),实际视场约 \(7.4/0.132 \approx 56\) mm——比需求略宽,留出了安装与对位的余量;反之取 50 mm 会把视场缩到约 37 mm,直接不够用。最后核算空间分辨率:56 mm 摊到 3072 个像素上,每像素约 18 μm,这个数字是否够用,取决于下一节的法则。
3.2 传感器与像元
像元(pixel)是传感器上的感光单元,本质是一口收集光生电子的”井”。一口井最多能存多少电子,称为满阱容量(full well capacity);满阱容量与读出噪声之比决定了动态范围(dynamic range)——同一幅图里能同时分辨的最亮与最暗的跨度。章节 1 讨论过位深:8 bit 还是 12 bit 量化才有意义,归根结底要看传感器的动态范围撑不撑得起这么多级灰度,否则多出来的位深只是把噪声量化得更精细而已。
由此引出一对常被忽视的矛盾:同样尺寸的传感器,分辨率越高,像元越小。像元小了,满阱容量随感光面积缩水,信噪比与动态范围同步下降,还需要更亮的照明或更长的曝光来喂饱它。“分辨率越高越好”是选型中最常见的误区——分辨率要按需求算出来,而不是按预算顶格买。
需求怎么算?经验法则:最小缺陷或最小特征至少覆盖 2 个像素——这正是 章节 1 采样定理的工程版(实践中为留余量常取 3~4 个)。上节算例每像素 18 μm,意味着可靠检出的最小缺陷约 36~70 μm;若工艺要求检 20 μm 的缺陷,就必须缩小视场或更换更高分辨率的方案。
另一个必须在下单前想清楚的问题是快门方式。全局快门(global shutter)让全部像元同一瞬间开始和结束曝光,得到的是真正的”一个时刻”;卷帘快门(rolling shutter)则逐行依次曝光,一幅图的顶部和底部相差一个读出周期。拍静止工件两者无异,但只要工件或相机在动,卷帘快门就会把矩形拍成平行四边形、把圆拍成蛋形——这种几何畸变是逐行时间差造成的,事后无法用标定消除。结论很硬:运动中的工件(流水线飞拍、运动平台上抓拍)必须用全局快门。卷帘快门传感器便宜且噪声常更低,只适合静止拍摄的场合。
3.3 景深与远心镜头
针孔模型里处处清晰,真实镜头却只有一个对焦平面。物体偏离该平面时,一个物点在像面上摊开成一个小光斑;只要光斑直径不超过容许弥散圆(circle of confusion)\(c\)(工程上通常取 1~2 个像元),人和算法都仍认为它”清楚”。能保持清楚的前后范围称为景深(depth of field,DOF),近似为
\[ \mathrm{DOF} \;\approx\; \frac{2\,c\,N\,(m+1)}{m^{2}}, \]
其中 \(N\) 是光圈数(f-number)。定性地读这个式子:光圈收小(\(N\) 增大),景深变大——代价是进光量按 \(N^2\) 减少,且光圈过小后衍射反而让全场都变软;放大率 \(m\) 在分母上还带平方,所以高倍成像的景深塌缩得极快,显微观察只有纸一样薄的清晰层。景深不够时,优先考虑收光圈加照明,其次降低放大率,最后才是机构上压平工件。
普通镜头还有一个与对焦无关的固有问题:透视误差。由 \(x = fX/Z\),放大率随 \(Z\) 变化,\(\Delta m / m \approx \Delta Z\,/\,Z\)。仍用上节算例:工作距离 300 mm,工件表面起伏或夹具重复定位差 ±1 mm,放大率就变化 ±0.33%,在 50 mm 的被测尺寸上引入 ±0.17 mm 的读数漂移——对公差几微米的尺寸测量是灾难性的,而且这不是对焦问题,收光圈救不了。
远心镜头(telecentric lens)正是为此而生:把孔径光阑放在像方焦平面上,使物方主光线全部平行于光轴。于是在远心范围内,放大率不随物距变化——工件抖一抖、厚一点、歪一点,像的大小纹丝不动,透视误差被光学结构本身消灭了。代价是体积、重量与价格。何时必须用远心?高精度尺寸测量(公差进入微米级)、被测物有厚度或台阶(普通镜头会把上下表面拍成不同放大率)、以及 \(Z\) 向位置无法严格控制的场合。
远心镜头的硬约束:因为主光线平行于光轴,镜头前组口径必须不小于被测物——测 50 mm 的工件就需要口径超过 50 mm 的远心镜头。这就是远心镜头又大又贵的根本原因,也是它通常只用于测量工位、不用于大视场定位的原因。
3.4 清晰度的定量评价
“图像清楚不清楚”在实验室里靠眼睛,在产线上必须靠数字:自动对焦需要一个可供搜索的目标函数;设备装调验收需要一个可写进工艺文件的指标;新旧镜头、不同批次镜头的比较需要一把统一的尺子。这类把一幅图映射为一个标量的函数称为清晰度评价函数(focus measure),好的评价函数应当在正焦处取唯一峰值,并随离焦单调下降。
最直接的想法来自观察:图像变糊,本质是高频细节丢失、边缘变缓。梯度能量法(Tenengrad 思想)直接度量边缘的”陡峭程度”:
\[ S_{\mathrm{grad}} = \frac{1}{NM}\sum_{n,m} \Big( G_x[n,m]^{2} + G_y[n,m]^{2} \Big), \]
其中 \(G_x\)、\(G_y\) 是水平与垂直方向的梯度(如 Sobel 算子响应)。图像越锐利,梯度幅值越大,得分越高。另一类是灰度方差法,度量整幅图灰度偏离均值的程度:
\[ S_{\mathrm{var}} = \frac{1}{NM}\sum_{n,m} \big( g[n,m] - \bar g \big)^{2}, \qquad \bar g = \frac{1}{NM}\sum_{n,m} g[n,m]. \]
模糊是一种平均,会把灰度向均值压拢,方差随之下降——它计算最快,但度量的是全局对比度而非细节。两者孰优,让实验说话。
我们合成一幅 480×360 的测试场景(图 3.1):上排四组竖条纹,周期分别为 2、4、6、8 px,相当于一块简易分辨率板;中排是 4 px 棋盘格和一块模拟文字纹理的随机噪点块;下排是提供阶跃边缘的暗矩形和一块斜向黑白对角边;另有两条 1 px 宽的细亮线贯穿画面。从最精细的 1 px 结构到最粗的大块明暗,各种空间尺度齐备。
接着用高斯模糊模拟逐级离焦(真实离焦光斑近似为弥散圆盘,高斯是其平滑的一阶近似;滤波器本身见 章节 6),\(\sigma\) 取 0、0.8、1.6、2.4、3.2、4.8、6.4 共七级,核尺寸按 \(K \approx 6\sigma\) 取奇数。图 3.2 展示了其中两级:\(\sigma=2.4\) 时,周期 2 px 和 4 px 的细条组已彻底融成均匀灰块——这些细节永久消失了——而粗条纹、矩形和对角边还在;\(\sigma=6.4\) 时全部条纹、棋盘格尽数抹平,画面只剩下大块的明暗。
对每一级模糊分别计算两种得分,归一化到 \(\sigma=0\) 时为 1,结果见 表 3.1 与 图 3.3。
| 模糊 \(\sigma\) | 梯度法(归一化) | 方差法(归一化) |
|---|---|---|
| 0.0 | 1.0000 | 1.0000 |
| 0.8 | 0.7330 | 0.6693 |
| 1.6 | 0.3441 | 0.5125 |
| 2.4 | 0.1850 | 0.4716 |
| 3.2 | 0.1356 | 0.4552 |
| 4.8 | 0.1145 | 0.4302 |
| 6.4 | 0.1053 | 0.4068 |
两条曲线都严格单调下降——作为对焦目标函数都”能用”,但品质差距悬殊。梯度法的区分度远强于方差法:从 \(\sigma=1.6\) 到 6.4,梯度得分从 0.344 一路降到 0.105(3 倍以上的跨度),而方差得分只从 0.513 缓降到 0.407,早早进入平台。原因回到两个公式的本性:模糊抹掉的是高频细节,而暗矩形、对角边这些大块明暗结构在任何模糊程度下都保持着全局对比度——方差法只看对比度,所以图像糊到只剩色块仍给出四成的分数;梯度法盯着边缘的陡峭程度,对细节丢失的反应灵敏得多。一个区分度差的评价函数,意味着对焦曲线峰区平缓、远焦区几乎平坦,搜索算法既难判断方向也难判定收敛。
有了单调的评价曲线,自动对焦(autofocus)就是在这条曲线上爬山(hill climbing):移动对焦电机或 \(Z\) 轴,每到一处采图打分,向得分升高的方向继续,直至越过峰顶。实用的搜索策略是粗到细两阶段:先用大步长扫过整个行程,把峰值圈定在一个区间里(顺便避开远焦区平台上的噪声假象);再在区间内用小步长精扫,并对峰顶附近的几个采样点做抛物线拟合,把最佳焦位插值到步长以内。评价函数的区分度越好,粗扫阶段的方向判断越可靠,细扫区间也可以收得越窄。
一个工程细节:本实验所用 SDK 的高斯滤波内部浮点求和顺序不固定,重跑时得分的第 3 位有效数字会轻微抖动(\(\sigma=0\) 不经滤波,分数逐位一致),但单调性与区分度结论稳定不变。评估类指标在工程上要看趋势和量级,不要抠末位数字。
3.5 SciVision 实现
清晰度评价在 SciVision SDK 中由 SCIMV::SciSvFocus 类提供,核心接口是 GetFocusScore:
SCIMV::SciSvFocus focus;
SciROI roi;
SciPoint tl(0, 0), br(W - 1, H - 1); // GenRect1 接收非 const 引用,必须用具名变量
roi.GenRect1(tl, br);
double score;
long rc = focus.GetFocusScore(frame, roi, SCI_GRADIENT, &score);
if (rc) { /* 非 0 为错误码,必须检查 */ }四个参数依次为:srcImage 是待评价图像;ROI 限定评价区域,支持正矩形、斜矩形与无定义三种类型,无定义类型表示处理整幅图像——产线上通常把 ROI 框在被测特征上,避免背景干扰得分;method 选择评价算法,见下表;score 输出得分。得分是相对量,只在同一场景、同一 ROI、同一方法之间比较才有意义。
GetFocusScore 的 method 参数
| 枚举值 | 方法 | 手册描述的特性 |
|---|---|---|
SCI_VARIANCE(0) |
方差法 | 对噪声敏感,耗时最短 |
SCI_EVA_IMPROVE |
点锐度法 | 对噪声和细节缺失比较敏感,耗时最长 |
SCI_IMAGE_DIFFERENCE |
差分法 | 对噪声和细节缺失比较敏感,耗时较长 |
SCI_GRADIENT(3) |
梯度法 | 受噪声和细节缺失影响较小,耗时较长 |
本章实验使用 SCI_GRADIENT 与 SCI_VARIANCE 两档,对应 小节 3.4 的两个公式。SDK 还提供 ScoreStatistics 与 CurveFitting,分别用于从得分序列中找最高点和对得分曲线做最优拟合,正是自动对焦”粗扫—细扫—峰顶拟合”流程的现成构件。生成本章全部图像与得分表的完整工程位于 code/cameras_and_lenses/,读者可修改场景结构与模糊参数自行复现。
工业案例:产线镜头装调验收
某模组厂的检测设备复制到第二条产线后误检率明显偏高,排查发现是装配人员凭目视对焦,“看着差不多清楚”在不同人、不同显示器之间根本不可复制。整改方案是把清晰度分数写进装调工艺:每台装调完成后,拍统一标准靶,用 GetFocusScore(梯度法)打分,达到标杆设备得分的 95% 以上方可放行。两个陷阱值得记录:其一,清晰度得分对拍摄内容高度敏感,换一块靶纸分数就没有可比性,验收必须用同一型号、同一姿态的标准靶;其二,得分末位存在浮点抖动,阈值留出 5% 的余量后完全不受影响——验收标准设计本来就不应依赖小数点后第三位。固化此流程后,新产线装调一次通过,焦距漂移的老化设备也能被周期复检自动拦下。
3.6 小结
- 图像质量的上限在光学侧就已确定,后续算法无法补救;选型计算从针孔模型出发:\(m = h/\mathrm{FOV}\),\(f = m\cdot\mathrm{WD}/(1+m)\),再核算每像素对应的物面尺寸。
- 分辨率按需求算,不按预算买:最小特征至少覆盖 2 个像素(留余量取 3~4);同尺寸传感器上像元越小,满阱容量与动态范围越差。运动工件必须用全局快门。
- 景深 \(\propto cN(m+1)/m^2\):收光圈换景深,高放大率下景深急剧塌缩;普通镜头放大率随物距变化(\(\Delta m/m \approx \Delta Z/Z\)),高精度尺寸测量必须用远心镜头,且其口径不小于被测物。
- 清晰度可以也应该量化:梯度能量法度量高频细节,区分度远优于只看全局对比度的灰度方差法(本章实验中 0.105 对 0.407 的尾部差距);自动对焦即在评价曲线上做粗到细的爬山搜索。
- 评价得分是相对量:只在同一场景、同一 ROI、同一方法下可比;用作验收标准时须固定标准靶,并为浮点抖动留出阈值余量。
相机、镜头与照明的系统性选型,以及远心成像更完整的光学分析,可进一步阅读 Steger 等人的著作 (Steger, Ulrich, 和 Wiedemann 2018);针孔模型、薄透镜成像与透视投影的几何推导,可参考 Szeliski 的教材 (Szeliski 2022)。本章只对比了梯度能量法与灰度方差法两种清晰度评价函数,若要在更大的算子集合中选型,Pertuz 等人 (Pertuz, Puig, 和 Garcia 2013) 在统一框架下系统评测了三十余种聚焦评价算子对噪声、窗口尺寸与图像内容的鲁棒性,是自动对焦与从聚焦恢复形状(shape-from-focus)时挑选评价函数的实用参考。



