大幅面与卷材表面检测:多相机拼接、畸变校正与线扫同步
一、当幅宽超过一个相机:一次真实的判级事故
前年冬天,我在一家锂电隔膜厂做表面检测项目的复盘。产线幅宽 1600mm,检测精度要求 0.05mm/pixel,客户用一台 8K 线扫相机硬扛,结果两种缺陷反复被投诉:宽度 0.3mm、长度 800mm 的纵向划伤,在系统里被报成两条各 300~400mm 的短划伤,判级直接从"废品"掉到"让步接收";另一种更糟,接缝位置上什么都没报——缺陷恰好落在两个相机视场的交界盲区里,等于这一段幅面根本没有被检测。
这两个事故的本质都不是算法问题,而是几何与同步问题:多相机系统的"拼"没拼对,"同步"没同步准。算法工程师习惯把注意力放在分割网络和阈值上,但大幅面卷材检测里,真正决定项目成败的是三件事——相机怎么摆、图像怎么接、行怎么对齐。这篇文章把这三件事从公式到代码完整走一遍,全部基于卷材(薄膜、隔膜、铜箔、纸张、无纺布)这一类连续运动 + 近似平面 + 高反光的场景。
先说清楚这类场景和普通面阵检测的本质区别:
| 维度 | 普通面阵工位检测 | 大幅面卷材检测 |
|---|---|---|
| 被测物 | 静止或步进 | 连续运动,速度 10~300 m/min |
| 成像方式 | 面阵 + 闪光 | 线扫 + 常亮/频闪,纵向靠运动合成 |
| 幅面 | 单相机视场可覆盖 | 需 2~8 台相机横向拼接 |
| 时间维度 | 单帧独立 | 行与行连续,纵向有严格时序 |
| 缺陷语义 | 框住即可 | 需换算成卷长米标,供裁切/分切使用 |
| 典型坑 | 光照、定位 | 接缝盲区、跨缝缺陷、行错位、坐标不统一 |
二、核心原理:先把几何算清楚,再谈算法
2.1 相机数量由三个公式决定
任何多相机方案的第一张图都应该是幅面分配图。设卷材幅宽WWW,单相机横向视场FOVx\mathrm{FOV}_xFOVx,相邻相机重叠率η\etaη(一般取 5%~15%),需要的相机数量NNN满足:
N≥⌈W−η⋅FOVxFOVx⋅(1−η)⌉ N \ge \left\lceil \frac{W - \eta \cdot \mathrm{FOV}_x}{\mathrm{FOV}_x \cdot (1 - \eta)} \right\rceilN≥⌈FOVx⋅(1−η)W−η⋅FOVx⌉
而单相机的横向视场由像素当量ε\varepsilonε(每像素代表的实际宽度,mm/pixel)反推:
FOVx=ε⋅Nx,ε≤dmink \mathrm{FOV}_x = \varepsilon \cdot N_x, \qquad \varepsilon \le \frac{d_{\min}}{k}FOVx=ε⋅Nx,ε≤kdmin
其中NxN_xNx是相机横向分辨率(像素),dmind_{\min}dmin是最小缺陷特征尺寸(mm),kkk是每特征所需像素数——工程上取 3~5,缺陷边界模糊、对比度低的场合要取 5~8。以开头那个 1600mm / 0.05mm 的产线为例,ε=0.05\varepsilon=0.05ε=0.05、k=4k=4k=4意味着dmin=0.2d_{\min}=0.2dmin=0.2mm;8K(8192 像素)相机的单机视场是8192×0.05=409.68192 \times 0.05 = 409.68192×0.05=409.6mm,算上 10% 重叠后有效覆盖约 369mm,1600/369≈4.341600 / 369 \approx 4.341600/369≈4.34,所以至少要 5 台。客户用 1 台,缺口不是"精度差一点",而是有效检测区域只有 25%。
重叠率不是随便给的余量,它承担三个功能:给拼接算法留配准搜索空间、给缝的渐晕与亮度不连续留羽化带、给机械装配公差留容错。重叠率过小的典型症状是缝处亮度出现一条暗带或亮带;过大则浪费有效像素、增加带宽压力。
2.2 为什么必须先做畸变校正再拼接
镜头的实际成像不满足理想针孔模型。Brown-Conrady 模型把畸变分成径向与切向两部分:
xd=xu(1+k1r2+k2r4+k3r6)+2p1xuyu+p2(r2+2xu2)yd=yu(1+k1r2+k2r4+k3r6)+p1(r2+2yu2)+2p2xuyu \begin{aligned} x_d &= x_u (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2p_1 x_u y_u + p_2 (r^2 + 2x_u^2) \\ y_d &= y_u (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + p_1 (r^2 + 2y_u^2) + 2p_2 x_u y_u \end{aligned}xdyd=xu(1+k1r2+k2r4+k3r