☰
机器视觉成像原理入门:从针孔模型到工业相机成像链路
2026/10/8 7:20:21 网站建设 项目流程

现场挺常见的一种情况:方案阶段按 25 mm 镜头、300 mm 距离估视野,算出来 100 mm 出头,觉得够用了。等到现场装上去,产品两边拍不全,实际视野比估的小了快一成。这时候第一反应往往是镜头发错货了,或者去翻相机型号,一折腾就是半天。我自己早几年也这么干过。

其实东西大概率都没错,是估算用的模型太粗了。这个坑很多人都踩过,我想借它把“一张图到底是怎么来的”从头捋一遍,这个专栏后面的内容基本都是在这条线上展开的。

一张图要经过哪些环节

光从光源出来,打到工件上,被工件反射或者透过去,这一步就决定了特征和背景之间有多少对比度。然后光进镜头,镜头把它汇聚到传感器上,视野多大、清不清楚、畸变多少、景深够不够,都在这一环。传感器把光子变成电子,ADC 再把电子数换成灰度值,最后通过网线或者采集卡传到工控机,交给 Halcon 或者模型去处理。

图里我把它分成了光学、电子、软件三段。说白了,光学段决定看不看得清,电子段决定信号干不干净、能不能按节拍传过来,软件段才是大家平时花时间最多的地方。

但我干这行这些年最深的一个体会是:前面丢掉的信息,后面算法是补不回来的。镜头没解析出来的边,亚像素算法再厉害也只能拟合一条糊边;光没打出对比度,换深度学习也是在跟噪声较劲。所以现场调不稳的时候,我的习惯是从前往后查:先看光,再看镜头和对焦,再看相机参数,最后才动算法。听起来很土,但省时间。

针孔模型:好用,但别在近处硬套

针孔模型大家应该都见过。假设所有光线都从一个点穿过去,物点、这个点、像点在一条直线上,用相似三角形就能得到:

h′h=du \frac{h'}{h} = \frac{d}{u}hh′​=ud​

hhh是物高,h′h'h′是像高,uuu是物体到那个“孔”的距离,ddd是孔到像面的距离。工程上一般直接把ddd当成焦距fff,于是就有了现场最常用的那个式子:

FOV≈S⋅uf FOV \approx \frac{S \cdot u}{f}FOV≈fS⋅u​

SSS是靶面的宽或高。这个式子我自己也天天用,心算快,做方案初期估个大概完全够。Halcon 里面阵相机的标定模型本质上也是针孔模型,再加上畸变项。

问题出在它默认像距就等于焦距。真实镜头对焦到有限距离的时候,像面是要往后挪的,物体越近挪得越多。远处无所谓,近了就不行了。

薄透镜模型:像距其实比焦距长

还是那个上学时学过的式子:

1f=1u+1v \frac{1}{f} = \frac{1}{u} + \frac{1}{v}f1​=u1​+v1​

把像距和放大倍率解出来:

v=f uu−f,β=vu=fu−f v = \frac{f\,u}{u-f}, \qquad \beta = \frac{v}{u} = \frac{f}{u-f}v=u−ffu​,β=uv​=u−ff​

视野就是靶面除以放大倍率:

FOV=Sβ=S (u−f)f FOV = \frac{S}{\beta} = \frac{S\,(u-f)}{f}FOV=βS​=fS(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 μm=8.44562448 \times 3.45\ \mu m = 8.44562448×3.45μm=8.4456mm,高7.06567.06567.0656mm,对角线 11.01 mm 左右,也就是常说的 2/3"。镜头 25 mm,距离 300 mm。

按针孔估:

FOVw≈8.4456×30025=101.35 mm FOV_w \approx \frac{8.4456 \times 300}{25} = 101.35\ mmFOVw​≈258.4456×300​=101.35mm

按薄透镜算:

β=25300−25=0.0909,FOVw=8.44560.0909=92.90 mm \beta = \frac{25}{300-25} = 0.0909,\qquad FOV_w = \frac{8.4456}{0.0909} = 92.90\ mmβ=300−2525​=0.0909,FOVw​=0.09098.4456​=92.90mm

高度方向对应是 84.79 mm 和 77.72 mm。差了 9.1%,跟25/27525/27525/275正好对上,开头说的“小了快一成”就是这么来的。

那要真拍到 101 mm 宽怎么办?倍率得是25/300=0.083325/300 = 0.083325/300=0.0833,反推物距:

u=f(1+1β)=25×(1+12)=325 mm u = f\left(1+\frac{1}{\beta}\right) = 25 \times (1+12) = 325\ mmu=f(1+β1​)=25×(1+12)=325mm

往后退 25 mm,刚好一个焦距。这个可以当个土办法记住:用针孔公式估出来的安装距离,实际大概要再加一个焦距。

顺带说说灰度值是怎么来的

光学部分说完,再简单看一下电子这一段。很多人调图像只会拉曝光和增益,但不太清楚背后在发生什么。

一个像素的灰度可以拆成三步:落到像元上的光子,按量子效率变成电子,电子再按转换增益变成灰度值(DN)。

Ne=QE×Nph,DN=K×Ne,K=2bit−1FWC N_e = QE \times N_{ph},\qquad DN = K \times N_e,\qquad K = \frac{2^{bit}-1}{FWC}Ne​=QE×Nph​,DN=K×Ne​,K=FWC2bit−1​

FWCFWCFWC是满阱容量,这里假设增益刚好让满阱对应满量程。

随便取一组参数感受一下:曝光时间内某个像元接收到 10000 个光子,量子效率 65%,满阱 10000 e⁻,12 bit 输出,读出噪声 2.5 e⁻。

电子数0.65×10000=65000.65 \times 10000 = 65000.65×10000=6500个。转换增益4095/10000=0.40954095/10000 = 0.40954095/10000=0.4095DN/e⁻,所以灰度大约是0.4095×6500≈26620.4095 \times 6500 \approx 26620.4095×6500≈2662。

噪声这块,光子到达本身就是随机的,会带来散粒噪声,大小是电子数开根号,再跟读出噪声合起来:

σ=6500+2.52=80.66 e−,SNR=650080.66=80.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σ=6500+2.52​=80.66e−,SNR=80.666500​=80.6≈38.1dB

再多算两个数:满阱时信噪比最多也就10000=100\sqrt{10000} = 10010000​=100,也就是 40 dB,这是单帧的天花板,增益调多少都突破不了;动态范围是20lg⁡(10000/2.5)=72.020\lg(10000/2.5) = 72.020lg(10000/2.5)=72.0dB。

所以图像噪点大的时候,别第一时间去拉增益。增益是把信号和噪声一起放大,SNR 不会变好。该做的是让光子多一点:光源加亮、光圈开大、曝光拉长,节拍允许的话哪个都比增益强。现场经常看到增益拉满、图像一片雪花,然后说相机不行,其实就是光不够。

另外拿到一款新相机,我一般先看四个参数:像元尺寸、满阱、读出噪声、量子效率。规格书上这几个数比“多少万像素”更能说明它在暗一点的场景下表现怎么样。


下篇聊像素、像元尺寸和分辨率这三个经常被混着说的概念,顺便算一下检测 0.1 mm 的缺陷到底要多少像素。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询