
现场挺常见的一种情况方案阶段按 25 mm 镜头、300 mm 距离估视野算出来 100 mm 出头觉得够用了。等到现场装上去产品两边拍不全实际视野比估的小了快一成。这时候第一反应往往是镜头发错货了或者去翻相机型号一折腾就是半天。我自己早几年也这么干过。其实东西大概率都没错是估算用的模型太粗了。这个坑很多人都踩过我想借它把“一张图到底是怎么来的”从头捋一遍这个专栏后面的内容基本都是在这条线上展开的。一张图要经过哪些环节光从光源出来打到工件上被工件反射或者透过去这一步就决定了特征和背景之间有多少对比度。然后光进镜头镜头把它汇聚到传感器上视野多大、清不清楚、畸变多少、景深够不够都在这一环。传感器把光子变成电子ADC 再把电子数换成灰度值最后通过网线或者采集卡传到工控机交给 Halcon 或者模型去处理。图里我把它分成了光学、电子、软件三段。说白了光学段决定看不看得清电子段决定信号干不干净、能不能按节拍传过来软件段才是大家平时花时间最多的地方。但我干这行这些年最深的一个体会是前面丢掉的信息后面算法是补不回来的。镜头没解析出来的边亚像素算法再厉害也只能拟合一条糊边光没打出对比度换深度学习也是在跟噪声较劲。所以现场调不稳的时候我的习惯是从前往后查先看光再看镜头和对焦再看相机参数最后才动算法。听起来很土但省时间。针孔模型好用但别在近处硬套针孔模型大家应该都见过。假设所有光线都从一个点穿过去物点、这个点、像点在一条直线上用相似三角形就能得到h′hdu \frac{h}{h} \frac{d}{u}hh′udhhh是物高h′hh′是像高uuu是物体到那个“孔”的距离ddd是孔到像面的距离。工程上一般直接把ddd当成焦距fff于是就有了现场最常用的那个式子FOV≈S⋅uf FOV \approx \frac{S \cdot u}{f}FOV≈fS⋅uSSS是靶面的宽或高。这个式子我自己也天天用心算快做方案初期估个大概完全够。Halcon 里面阵相机的标定模型本质上也是针孔模型再加上畸变项。问题出在它默认像距就等于焦距。真实镜头对焦到有限距离的时候像面是要往后挪的物体越近挪得越多。远处无所谓近了就不行了。薄透镜模型像距其实比焦距长还是那个上学时学过的式子1f1u1v \frac{1}{f} \frac{1}{u} \frac{1}{v}f1u1v1把像距和放大倍率解出来vf uu−f,βvufu−f v \frac{f\,u}{u-f}, \qquad \beta \frac{v}{u} \frac{f}{u-f}vu−ffu,βuvu−ff视野就是靶面除以放大倍率FOVSβS (u−f)f FOV \frac{S}{\beta} \frac{S\,(u-f)}{f}FOVβSfS(u−f)拿它跟针孔那个式子一比差的就是uuu和u−fu-fu−f。针孔估算偏大的比例是εfu−f \varepsilon \frac{f}{u-f}εu−ff这个式子值得记一下。物距是焦距的 10 倍针孔估算大概偏 11%50 倍的时候大概偏 2%。我自己的习惯是物距不到焦距 20 倍的就老老实实用薄透镜公式算一遍这时候误差已经超过 5% 了。还有个细节容易被忽略公式里的uuu是到镜头主平面的距离镜头资料上写的工作距离一般是到镜头前端的。两者差多少要看镜头结构近距离项目要留意。下面算例为了简单先当它们一样。拿开头那个情况来算。相机 2448 × 2048像元 3.45 µm靶面宽2448×3.45 μm8.44562448 \times 3.45\ \mu m 8.44562448×3.45μm8.4456mm高7.06567.06567.0656mm对角线 11.01 mm 左右也就是常说的 2/3。镜头 25 mm距离 300 mm。按针孔估FOVw≈8.4456×30025101.35 mm FOV_w \approx \frac{8.4456 \times 300}{25} 101.35\ mmFOVw≈258.4456×300101.35mm按薄透镜算β25300−250.0909,FOVw8.44560.090992.90 mm \beta \frac{25}{300-25} 0.0909,\qquad FOV_w \frac{8.4456}{0.0909} 92.90\ mmβ300−25250.0909,FOVw0.09098.445692.90mm高度方向对应是 84.79 mm 和 77.72 mm。差了 9.1%跟25/27525/27525/275正好对上开头说的“小了快一成”就是这么来的。那要真拍到 101 mm 宽怎么办倍率得是25/3000.083325/300 0.083325/3000.0833反推物距uf(11β)25×(112)325 mm u f\left(1\frac{1}{\beta}\right) 25 \times (112) 325\ mmuf(1β1)25×(112)325mm往后退 25 mm刚好一个焦距。这个可以当个土办法记住用针孔公式估出来的安装距离实际大概要再加一个焦距。顺带说说灰度值是怎么来的光学部分说完再简单看一下电子这一段。很多人调图像只会拉曝光和增益但不太清楚背后在发生什么。一个像素的灰度可以拆成三步落到像元上的光子按量子效率变成电子电子再按转换增益变成灰度值DN。NeQE×Nph,DNK×Ne,K2bit−1FWC N_e QE \times N_{ph},\qquad DN K \times N_e,\qquad K \frac{2^{bit}-1}{FWC}NeQE×Nph,DNK×Ne,KFWC2bit−1FWCFWCFWC是满阱容量这里假设增益刚好让满阱对应满量程。随便取一组参数感受一下曝光时间内某个像元接收到 10000 个光子量子效率 65%满阱 10000 e⁻12 bit 输出读出噪声 2.5 e⁻。电子数0.65×1000065000.65 \times 10000 65000.65×100006500个。转换增益4095/100000.40954095/10000 0.40954095/100000.4095DN/e⁻所以灰度大约是0.4095×6500≈26620.4095 \times 6500 \approx 26620.4095×6500≈2662。噪声这块光子到达本身就是随机的会带来散粒噪声大小是电子数开根号再跟读出噪声合起来σ65002.5280.66 e−,SNR650080.6680.6≈38.1 dB \sigma \sqrt{6500 2.5^2} 80.66\ e^-,\qquad SNR \frac{6500}{80.66} 80.6 \approx 38.1\ dBσ65002.5280.66e−,SNR80.66650080.6≈38.1dB再多算两个数满阱时信噪比最多也就10000100\sqrt{10000} 10010000100也就是 40 dB这是单帧的天花板增益调多少都突破不了动态范围是20lg(10000/2.5)72.020\lg(10000/2.5) 72.020lg(10000/2.5)72.0dB。所以图像噪点大的时候别第一时间去拉增益。增益是把信号和噪声一起放大SNR 不会变好。该做的是让光子多一点光源加亮、光圈开大、曝光拉长节拍允许的话哪个都比增益强。现场经常看到增益拉满、图像一片雪花然后说相机不行其实就是光不够。另外拿到一款新相机我一般先看四个参数像元尺寸、满阱、读出噪声、量子效率。规格书上这几个数比“多少万像素”更能说明它在暗一点的场景下表现怎么样。下篇聊像素、像元尺寸和分辨率这三个经常被混着说的概念顺便算一下检测 0.1 mm 的缺陷到底要多少像素。