系列文章目录

机器视觉系列(一)——概述
机器视觉系列(二)——机械部分
机器视觉系列(三)——电气部分
机器视觉系列(四)——相机部分

文章目录

  • 系列文章目录
  • 前言
  • 一、什么是工业镜头
  • 二、工业镜头的分类
  • 三、工业镜头的主要性能参数
    • 镜头质量测评方法
    • 非球面镜头
    • 镜头镀膜
  • 四、工业镜头的选型步骤
  • 五、其他组件
  • 六、相机镜头校正
  • 总结
  • 参考资料

前言

延续之前的机器视觉系列文章,这里从应用的角度,介绍工业镜头部分的相关整理内容。

一、什么是工业镜头

工业镜头是光、机、电技术的精密结合,光学系统由若干透镜(或反射镜)组成,以构成正确的物象关系,并确保获得正确、清晰的影像,其是镜头的核心;而机械装置包括固定光学元件的零件(如镜筒、透镜座、压圈、连接环等)、镜头调节机构(如光圈调节环、调焦环等)、连接机构(比如常见的C接口、CS接口)等。此外,也有些镜头有自动调光圈、自动调焦或感测光强度的电子结构。其用于聚焦光线在相机内部成像,其作用是产生锐利的图像,以得到被测物的细节

二、工业镜头的分类

按照实际用途可分为FA镜头、远心镜头、M12镜头
①FA就是Factory Automation,工厂自动化,指用于工厂自动化的镜头,简称工业镜头。
②远心镜头主要是为纠正传统工业镜头视差而设计的,它可以在一定的物距范围内,使得到的图像放大倍数不会变化,这对被测物体不在同一物面上的情况是非常重要的。远心镜头由于其特有的平行光路设计,一直被对镜头畸变要求很高的计算机视觉应用场合所青睐。

有时为了追求高精度,还会使用双远心镜头,其能比普通远心镜头提供远高的测量准确性,其入射和出射光瞳均投射到无限远处,其畸变系数为普通镜头的1/20,一般小于0.1%。

③M12镜头是小螺纹口径镜头,整体尺寸都要远小于FA镜头和远心镜头,主要用于嵌入式视觉和板卡式相机。

按照焦距类型,FA镜头还可进一步分为定焦镜头、变焦镜头、鱼眼镜头和微距镜头
①定焦镜头特指只有一个固定焦距的镜头,它只有一个焦段,或者说只有一个视野,没有变焦功能。定焦镜头的设计相对变焦镜头而言要简单得多,但一般变焦镜头在变焦过程中对成像会有所影响,而定焦镜头的优点是对焦速度快,成像质量稳定。对于使用定焦镜头的数码相机,它所拍摄的运动物体图像清晰而稳定,对焦非常准确,画面细腻,颗粒感非常轻微,测光也比较准确。
②变焦镜头通过镜头中镜片之间的相互移动,使镜头的焦距在一定范围内变化,从而在无需更换镜头的情况下,使相机既可获得全景图像,又可获得局部细节图像。通过变换焦距,得到不同宽窄的视场角、不同大小的影像和不同景物范围的相机镜头。变焦镜头在不改变拍摄距离的情况下,可以通过变动焦距来改变拍摄范围,因此非常有利于画面构图。
【其实变焦镜头很好用,就是价格太贵…】
③鱼眼镜头是一种视角接近或等于180°的镜头,是一种极端的广角镜头。它的视角力求达到或超出人眼所能看到的范围,因此,鱼眼镜头与人们眼中的真实世界的景象存在很大的差别,我们在实际生活中看见的景物是有规则的固定形态,而通过鱼眼镜头产生的画面效果则超出了这一范畴。其主要用于制作基于现实场景的全景图象
④微距镜头是一种用作微距摄影的特殊镜头,主要用于拍摄十分细微的物体,力求将目标的细节尽可能详尽的呈现出来。其主要用于平面物体(文件、照片、绘画等)的翻拍复制
此外还有沙姆镜头,其镜头沿着图像的横轴或纵轴倾斜,透视镜头和远心镜头两种形式都有,用于激光三角测量等需要相机倾斜拍摄目标的应用中

三、工业镜头的主要性能参数

由于在实际机器视觉中,使用最多的就是FA定焦镜头,这里只讨论FA定焦镜头的主要参数。
焦距f:其是镜头到焦点的距离,是镜头的重要性能指标。镜头焦距的长短决定着拍摄的成像大小、视场角大小、景深大小和画面的透视强弱。焦距越大成像越大。根据透镜的用途不同,焦距的大小也不同,常见的工业镜头焦距有5mm、8mm、12mm、16mm、25mm、35mm、50mm、75mm等。其计算公式为:

式中,WD为工作距离(物距)。
光圈系数(相对孔径):其计算公式为:

相对孔径的倒数就是光圈系数,光圈系数一般以F数来表示。例如,如果镜头的相对孔径是1:2,那么其光圈系数就是F2.0,相机的镜头上都会标写这一指标。常用的光圈系数为F1.4、F2.0、F2.8、F4.0、F5.6、F8.0、F11.0、F16.0、F22.0等几个等级。光圈系数的标称值越大,光圈越小,在单位时间内的通光量越小。有些视觉系统为了增加镜头的可靠性和降低成本,采用定光圈设计,即当光圈不能改变时,通过调整光源强调或相机增益来调整图像亮度。

对照度要求不高、使用手动光圈的高清相机可考虑将光圈稍缩小一点。

靶面尺寸:镜头靶面尺寸是指镜头成像直径可覆盖的最大感光芯片尺寸,主要有1/2英寸、2/3英寸、1英寸和1英寸以上。
接口:其是镜头与相机的连接方式,常用的接口包括C、CS、F、V、T2等。
像差(比如畸变、场曲等),在机器视觉应用中最为关键的像差是畸变(变形率)和场曲(对于传感器接配的镜头来说,该参数已被严格校正)。畸变会影响测量结果,特别是在精密测量中,必须通过软件进行标定和补偿。
分辨率:其代表镜头记录物体细节的能力,是指在成像平面上1mm间距内,可分辨开的黑白相间的线条对数,单位是“线对/mm”。镜头的分辨率越高,成像越清晰。镜头的分辨率不能和相机的分辨率混为一谈。

一般要求像面分辨率要大于1/(2*单个像元尺寸<单位取mm>)以上,单位线对/mm,1/2英寸的相机靶面需要镜头的最低分辨率为38线对/mm,1/3英寸的靶面需要镜头的最低分辨率为50线对/mm,相机的靶面越小,对镜头的分辨率要求越高。
数值孔径NA:其用以衡量镜头能够收集的光的角度范围。其计算公式为:

式中,n为镜头工作介质的折射率,空气中n=1.0;a为光进入镜头时最大孔径锥角。数值孔径与分辨率及光学放大倍数成正比。也就是说,数值孔径直接决定了镜头的分辨率,数值孔径越大,分辨率越高,否则分辨率越低。
视场FOV:其指镜头实际拍到的区域范围,其计算公式为:

式中,f为焦距;WD为工作距离。

光学放大倍数M:其等于芯片尺寸除以视场,其计算公式为:

工作距离WD:即物距,指镜头最下端机械面到被测物体的距离。由于有些系统工作空间很小,因而要求镜头有较小的工作距离;但有的系统在镜头前需要安装光源或其他工作装置,因而必须有较大的工作距离保证空间。需要的工作距离越大,保持小视野的难度和成本就越高。
注意,计算景深时还会使用对焦距离,对焦距离包括工作距离、镜头长度、相机法兰距这3部分的长度
后焦距:指相机接口平面到芯片的距离。简单来说,当安装上标准镜头(标准C/CS接口镜头)时,后焦距是使被拍摄物体的成像恰好在CCD图像传感器的靶面上的距离。在对线扫描镜头或大面阵相机的镜头选型时,后焦距是一个非常重要的参数,它直接影响镜头的配置。一般工业相机在出厂时都对后焦距做了适当的调整,因此,在配接定焦镜头的应用场合,一般不需要调整工业相机的后焦距。而在有些应用场合,如出现当镜头对焦环调整到极限位置仍不能使图像清晰时,如果镜头接口正确,则需要对工业相机的后焦距进行调整。
弥散圆直径δ:用于计算镜头景深所需要的参数。不同的厂家对容许弥散圆直径有不同的定义,一般给定参数为,芯片尺寸24mm36mm对应弥散圆直径0.035mm,6cm9cm对应0.0817mm,4”5”对应0.146mm。通常情况下,肉眼分辨率为二千分之一至五千分之一。人眼在明视距离(眼睛正前方30厘米)能够分辨的最小的物体大约为0.125mm。所以,弥散圆放大在7寸照片(这是个常用尺寸)也只能是0.125mm以内,也就是图像对角线长度的1/1730左右。这个1/1730左右的容许弥散圆大小对于任何大小的底片或者CCD都适用,因为它们放大出来的7寸照片,都可以将弥散圆控制在0.125mm。所以蔡斯公司制定的标准就是弥散圆直径=1/1730底片对角线长度。实际使用中如果需要,还可进一步放宽到1/1200-1/1500。另外,因为弥散圆最根本目的是界定你是否能够看出清晰或者模糊,那么至少需要22个像素(4个像素的方块)来分辨是否清晰,即取2个像元尺寸大小,这基本上是弥散圆的极限

景深DOF:其是镜头的一个重要的外部参数,它表示满足图像清晰要求的远点位置与近点位置的差值,如下图:

前景深ΔL1、后景深ΔL2及景深ΔL的计算公式为:



在相机中可清晰成像的距离范围为:L-△L1~L+△L2。
式中,f为焦距;F为光圈系数;L为对焦距离(即工作距离*(1+1/放大倍率))。

对比下前景深与后景深的区别:

另从后景深的计算公式可以看出,很容易出现△L2<0的情况,这就引出超焦距的概念。即当镜头对焦在无穷远时,景深前界(离镜头最近清晰点)到镜头的距离称之为超焦距。就是从这个超焦距点到镜头距离的1/2处开始到无穷远,成像都是清晰的。如果超焦距是2米,则景深就是1米到无穷远。当使用超焦距时,我们希望获得尽可能大的景深。

超焦距的计算公式为:

这时的清晰成像距离为>fH/2。
例如,给定弥散圆直径为0.011mm(2pixel*5.5μm),焦距为12mm,光圈系数为2.8,工作距离为700mm,则:
L = 700 + 12 = 712mm
△L1 = 2.80.011712^2 / (12^2 + 2.80.011712) = 94.10mm
△L2 = 2.80.011712^2 / (12^2 - 2.80.011712) = 127.91mm
△L = 94.10+127.91 = 222.01mm
fH = 12 + 12^2/(2.80.011) = 4687.32mm
可以看到,影响景深的最主要因素是工作距离,工作距离越大景深越大。此外,光圈越大景深越小,焦距越大景深越小。
实际使用中,真实可接受弥散圆与理论计算存在一定差距,通常通过实测来进行确定
①固定光圈,保证其他测试条件相同。
②放置一个条码目标物,调节镜头至条码刚好能识别出的状态,即极限状态。再用相同的另一张条码上移到能识别出的极限高度,此段高度即为景深。

对镜头成像品质影响最大、或者说镜头的核心参数指标是镜头的分辨率和像差,两个指标的综合表现可以合称为清晰度Clarity。在专业高清镜头领域,厂商实际上有单独针对镜头的专业测评方法,即MTF(Modulation Transfer Function)曲线图。MTF曲线图是镜头厂家在极为专业、严谨的测试环境下测试并对外公布的参数,可作为镜头成像品质权威、客观的技术参考依据。一方面因为MTF曲线图测试环境非常严谨,另外排除了成像介质(成像器件)的影响,因此能够客观反映镜头水准。而镜头的MTF曲线图可以客观反映分辨率和像差这两个特性。
在对镜头的分辨率和像差进行测试时,将正弦光栅图(黑白条纹图)置于镜头前方,测量镜头成像处的调制度,由于镜头像差的影响,会出现以下情况:空间频率较低(线条较宽疏)时,测量的调制度几乎等于正弦光栅的调制度;当正弦光栅空间频率较高(线条较细密)时,镜头成像的调制度逐渐下降。
镜头成像的调制度随空间频率变化的函数称为调制度传递函数MTF。对于原来调制度为M的正弦光栅,如果经过镜头后达到像平面的像的调制度为M
,则MTF函数值为:MTF = M*/M。显然MTF的值介于0和1之间,MTF的值越高镜头性能越好。根据这个调制传递函数作出一条关于镜头的“幅频特性”曲线,即MTF特性曲线图,纵坐标为MTF值,横坐标为空间频率(每毫米线对数),如下图:

在MTF曲线图上,用于评价一款镜头成像清晰度的两个指标(像差和分辨率),可以清楚地表现出来。镜头的反差表示了镜头还原实物反差变化的能力,它对应的是空间频率很低时的MTF值,随着空间频率提高,MTF值以递减的趋势变化。
一般当MTF值降低到0.03时,用人眼已经无法辨别光栅的线对数,此时对应的空间频率就是镜头的分辨率,如下图:

镜头质量测评方法

镜头是以光轴为中心的中心对称结构。理论上在像场中与光轴同心的圆上的任一点的成像状况都应该是相同的。但光栅并不是点状的,它有方向性。我们将平行于参考直径的光栅方向称为弧矢向S,而将垂直于参考直径的光栅方向称为子午向M。受到镜头像散的影响,这两种方向的光栅作出的曲线往往是不重合的。
在MTF曲线图中,应该同时考虑这两种信息。于是MTF曲线图的坐标轴发生了变化,纵坐标还是MTF值,但横坐标变成了测试点到像场中心的距离,单位为mm,而空间频率的变化要画出多条曲线来表示。这就是实际上,在镜头的官方资料中所能找到的MTF曲线和上面讲的“幅频特性”曲线并不一样的原因,尽管它们实质相同,但真正的MTF曲线要包含更丰富的内容,如下图:

对于镜头的成像素质,我们只关心像差和分辨率,也就是低频空间频率下和高频空间频率下的MTF值,所以一般只用两条曲线分别代表这两个参数——用低频额定10lp/mm曲线代表镜头反差特性,用高频的30lp/mm曲线代表镜头分辨率特性。另外随着镜头光圈大小的改变,成像的素质也会有很大变化,在MTF图中也要表示出这一点。一般会选用最有代表性和使用价值的两个光圈值F8和全开做出两组曲线,可同时画在一张图上,如下图:

左上图中(左图右图焦距不同,分别为24mm和120mm,F值相同),其X轴表示从画面中心到边缘的距离,值0表示中心,而5、10、15、20表示测量点到全画幅传感器中中心的距离(单位mm);Y轴表示MTF值
①S10代表在空间频率固定为10lpmm,f=4时的弧矢方向曲线图,像差特性;
②M10代表在空间频率固定为10lp/mm,f=4时的子午方向曲线图,像差特性;
③S30代表在空间频率固定为30lp/mm,f=4时的弧矢方向曲线图,分辨率特性;
④M30代表在空间频率固定为30lp/mm,f=4时的子午方向曲线图,分辨率特性。

Y轴的数字可用于理解清晰度的好坏,上图中数值的评价标准是一种普遍接受的主观评价,具体数值可能因人而异。
MTF图的分析方法可总结为:
①10lp/mm曲线代表镜头反差特性,越高说明镜头反差越大;
②30lp/mm曲线代表镜头分辨率特性,越高说明镜头分辨率越高;
③MTF曲线越平直,说明边缘与中间的一致性越好;
④边缘曲线快速下降说明成像在边角的反差与分辨率降低;
⑤弧矢曲线与子午曲线越接近,说明镜头像散越小。

非球面镜头

常规的相机镜头为球面镜头,球面镜头会产生无法避免的像差现象。在实际应用中,通常通过多片镜片组合来对球面镜头的像差进行矫正,这样带来的问题是镜头的体积及重量的增加,同时透过的光减少。
非球面镜头Aspherical Lens采用非球面镜片,实质是在球面面形基础上细微调整而成的。从数学角度来说,球面的面形是一个二次函数,而非球面的面形函数是四次甚至更高次的函数,因此非球面的面形更加复杂。实际上,它是在球面的基础上,按事先设计好的细微面形起伏,进行人为控制而获得非球面的复杂曲面。
①非球面镜头能够减少球差及色差,提高清晰度;
②非球面镜头采用的镜片数量小,可以缩小镜头体积和重量;
③非球面镜头能够显著提升画面周边的成像质量;
④光通过镜头损耗减少,可以做出通光量更大的镜头。

镜头镀膜

由于光线通过镜头的玻璃镜片过程中,有部分光会发生反射现象而产生损失(通常为5%),而镜头一般由多组镜片构成,则光线通过一组镜头镜片过程中,由于发生了多次反射过程(N组镜片的镜头实质有2N个反射面),实际上到达相机靶面的光线大量减少,同时会产生令人不愉快的鬼影和炫光现象。因此,多组镜片构成的镜头一方面产生了像差、降低了镜头的反差、并导致了镜头实际有效通光孔径降低。
镜头镀膜的核心意义在于可以使得光线在一定波长范围内减少反射,增加通光量,从而使多组镜片的镜头达到可用的目标。镜头的镀膜是根据光学的干涉原理,在镜头表面镀上一层厚度为四分之一波长的物质(通常为氟化物),使镜头对这一波长色光的反射降至最低。显然,一层膜只对一种色光起作用,而多层镀膜则可对多种色光起作用。
多层镀膜通常采用不同的材料重复地在透镜表面镀上不同厚度的膜层。多层镀膜可大大提高镜头的透光率,例如未经镀膜的透镜的每个表面的反射率为5%,单层镀膜后降至2%,而多层镀膜可降至0.2%,这样可大大减少镜头各透镜间的漫反射,从而提高影像的反差和明锐度。

四、工业镜头的选型步骤

计算短边对应的像素数 E=B/C,相机长边和短边的像素数都要大于E
②像元尺寸=产品短边尺寸B/所选相机的短边像素数;
放大倍率 =所选相机芯片短片尺寸/相机短边的视野范围
可分辨的产品精度 =像元尺寸/放大倍率(判断是否小于C)
对焦焦距 =工作距离*(1+1/放大倍率)单位mm
镜头靶面尺寸要≥相机靶面尺寸,否则将出现黑角
相机分辨率要小于2倍的镜头的解析度,即要求像面分辨率要大于1/(2*单个像元尺寸<单位取mm>)以上,单位线对/mm
另外,对于恒定光照条件的环境(一般为实验室环境),可选用固定光圈的镜头。对于光照度变化不明显的环境,常选用手动光圈镜头,即将光圈调到一个比较理想的数值后固定住。如果照度变化较大,应选用自动光圈镜头。在使用自动光圈镜头时,一般需要镜头配合摄像机的背光补偿功能来实现,采用宽动态范围的摄像头也有比较不错的效果。

五、其他组件

偏光镜,其是根据光线的偏振原理制造的镜片,用来排除和滤除光束中的直射光线,使光线能于正轨之透光轴投入眼睛视觉影像,使视野清晰自然。例如,通过使用偏光镜,可以减弱水面的反光,从而清晰的拍摄到水中的鱼。在拍摄这样的场景时,光源的投射角度与相机拍照的角度要趋近一致,并且其最大的偏折角度需介于30-40°之间。使用的时候可以通过慢慢转动滤镜前组的镜片来进行调整,力求把景物表面的反光降到最低程度。另外,偏光镜可以有效提高色彩的饱和度,提高反差,这是因为偏光镜可以吸收大气中雾气或灰尘反射出的各种方向的杂光,从而使拍摄出的影像更加纯净。

滤光片,其是用来选取所需辐射波段的光学器件。滤光片的一个共性,就是没有任何滤光片能让天体的成像变得更明亮,因为所有的滤光片都会吸收某些波长,从而使物体变得更暗。例如你想要拍一朵黄花,背景是蓝天、绿叶,如果按照平常拍,就不能突出“黄花”这个主题,因为黄花的形象不够突出。但是,如果在镜头前放一个黄色滤光片,阻挡一部分绿叶散射出的绿光、蓝天散射出的蓝光,而让黄花散射出的黄光大量通过,这样,黄花就显得十分明显了,突出了“黄花”这个主题。

六、相机镜头校正

这里只介绍面阵相机的针孔相机模型的标定。
我接触过的相机镜头校正软件有:OpenCV、Matlab、Halcon三种,其都可以分为4个步骤:
使用待校正相机镜头拍摄多幅不同位姿的标定板图像
标定板特征点亚像素精度提取
基于针孔相机模型的解析求解
基于非线性最优化的参数精炼
步骤①三者之间没有差别。
关于拍摄用于标定的图像时的注意细节有:
<1>使用制造精度高的标定板(需要能从图案区分出标定板的长和宽)
<2>保持相机不变,拍摄不同方向的棋盘图案
<3>拍摄图像最少10张,最好能达到20张以上
<3>所拍摄图像不能是模糊的
<4>所拍摄图像不能包含相对于相机平面大于45°角的校准图案,如下图:

<5>在图像中标定板的大小要大于全视野的1/4并小于全视野,推荐使用2/3视野大小的标定板
<6>拍摄的所有图像整体要覆盖相机的所有视野,包括四角、四边和中间
<7>拍摄的所有图像中,校准图案在相对于相机的方向上有足够的变化
在本文实验中,我分别使用标称制造精度±0.01mm的棋盘格和圆点阵的两种标定板各拍摄了21张不同位姿的图像:


步骤④三者之间没有差别。
步骤③主要是使用的针孔相机模型的差别,OpenCV和Matlab差别很小,OpenCV的相机内参数矩阵定义为:

Matlab的相机内参数矩阵定义为:

Matlab提供了一个传感器x轴和y轴相对偏斜的自由度s,而Halcon的相机内参数矩阵使用焦距f,像元缩放sx和sy(即每个像元对应的尺寸),中心点坐标cx和cy来表示,将上述参数整理后形式与OpenCV的定义相同。fx = f/sx,fy = f/sy,其中f为镜头焦距,单位mm;sx和sy的单位需从μm转换为mm。这里使用的是Basler acA1300-30gc,其像元尺寸为3.75μm,f=5mm,则对应的fx=5/3.751000=1333.33。
而关于镜头畸变的模型定义,三者都提供多项式畸变校正模型,只是OpenCV提供的自由度最大,3个径向畸变系数k1、k2、k3和2个切向畸变系数p1、p2都可以选择性配置;Matlab的自由度略小,相比OpenCV不能配置只使用k1的多项式模型;而Halcon的自由度最低,5个系数必须全部使用。但Halcon还提供了一个只用系数kappa表示的可进行解析求解的除法畸变模型。
步骤②是后面两个步骤的基础,Matlab(在2021版之后,而我用的是2019,不能提取圆点阵)可以提取棋盘格和圆点阵两种图案的特征点亚像素坐标;OpenCV也可以提取棋盘格和圆点阵两种图案的特征点亚像素坐标(cv.findChessboardCorners+cv.cornerSubPix以及cv.findCirclesGrid);Halcon只可以提取圆点阵图案的特征点亚像素坐标。
进行3种软件的特征点亚像素提取精度实验:分别使用OpenCV提取两种图案的特征点的亚像素精度坐标,Matlab提取棋盘格、Halcon提取圆点阵。然后分别求每幅图像提取的特征点的X和Y坐标的均值(X和Y混在一起),然后将不同软件提取的特征值进行相减得:


可以看到,OpenCV的提取值X和Y坐标都比Matlab 小约1个像素;OpenCV的提取值X和Y坐标都比Halcon大约0.02个像素。
如上面所述,这是3种软件相机和标定的最大差别
基于上述特征点提取结果,先在3种软件中,分别测试使用5畸变校正系数和1畸变校正系数(Matlab为2畸变校正系数)。多系数畸变校正模型的校正结果,相比于少系数畸变校正模型的改进很小,哪一种软件二者的校正后投影特征点的平均坐标偏差都小于0.005个像素。因此,在整理对比实验数据时只列出使用少系数畸变校正模型的标定结果。

可以看到最终投影平均误差最小的是:使用OpenCV算法+圆点阵+OpenCV提取特征点的算法。
这个结果可能跟很多博文中的比较结果都不一样,但这个结论其实不重要,主要是因为:使用的标定板、相机、镜头、拍摄标定图像时的相对位置、使用的图像数量都会对这个结论产生影响。
先排除能排除的影响:使用的图像数量。这里以OpenCV算法+圆点阵+OpenCV提取特征点的算法为例,分别使用图像数量从13-21张,来绘制投影平均误差的变化

从上图可以看出:基本上超过20张图像,其平均误差就已经收敛,不会再有明显的下降改进;从13-21张的变化过程中,最大误差波动也才0.003个像素,对于上述所有算法,其对于最终平均误差指标的影响都小于0.003/0.049
100%≈6%。所以可以确定,使用图像数量基本上不影响上述指标波动。
上面也说过,校正算法本身的影响很小,从上表数据也可以得到验证。
而对于剩下的使用的标定板、相机、镜头、拍摄标定图像时的相对位置这几个影响因素,我们是没有办法进行对比实验的。再加上在标定算法的最后一步,都会有一个非线性的精炼过程,其是数值最优的(严格依赖于数据),但不一定是真实的。也就是说,这个步骤会导致即使使用的标定板、相机、镜头全部相同,仅是由于使用了不同的标定图像,就会造成最终的平均误差的波动,所以我们也没有必要太过关注于平均误差的绝对值。
但在实际使用中,我们还是需要从上述各种算法中选择一种,来获得最优的相机镜头校正结果,所以还是需要对上述算法进行量化比较。这里我以如下准则来进行评价:由于我们知道相机和镜头属于工业制品,且大品牌的高质量产品是有严格的品控的(其会在出厂前进行抽检和全检),所以我们用到的相机和镜头,其在产品说明书上会提供明确的规格参数。而实际视觉系统在标定过程中,标定板尺寸、标定板距镜头的大致距离,这些也都是可以获得的参数。虽然由于安装使用、人工操作、算法处理等环境都会引入误差,但最终的标定结果还是应该与上述可获知参数比较接近的。所以可认为,越接近相机和镜头的真实参数情况的标定结果越好,或最起码更具有实际使用价值(这意味着你可以通过标定,将标定结果和误差等都转换成具有测量单位的量,可以指导生产)
OpenCV的官方文档给出了镜头标定的计算推导过程:







以及镜头畸变的除法模型:

多项式模型:

上式中的u和v与x’、y’含义相同,u和v与x’’、y’’含义相同。
其中,(Xw,Yw,Zw)为标定板上某个特征点在世界坐标系中的位置,(Xc,Yc,Zc)为标定板上相同点在相机坐标系中的位置,而r11-r33表示两个坐标系变换之间的旋转矩阵,tx、ty、tz表示两个坐标系变换之间的平移向量。其中(Xw,Yw,Zw)、(Xc,Yc,Zc)、tx、ty、tz都可用具有长度单位的数值表示,且这些系数的长度单位是一致的,而r11-r33为(-1,1)之间的数值。相机内参矩阵A中的系数fx、fy、cx、cy是将具有长度单位的相机坐标系中的点转换到图像坐标系中的像素值。而在实际使用中,一般是要经过镜头畸变变换,将(Xc,Yc,Zc)归一化为(x’,y’,1),然后畸变变换得到(x’’,y’’)后,再使用相机内参矩阵A。所以畸变变换中的系数κ或K1、K2、K3、p1、p2都是无量纲值。
在求解相机内参矩阵A时,可参考公式:

将镜头畸变的影响预先施加到(Xc,Yc,Zc)中,这时利用相似三角形原理,根据Xc和Zc的比值与u和1的比例相等来求解fx、fy、cx、cy,于是可得fx和fy的单位为pixel/mm(mm也可以是其他长度单位),cx和cy的单位为pixel,而且不要求fx单位中的长度单位与Xc的长度单位一致。即cx和cy大致为图像中心像素的像素级坐标值,fx = f/sx,fy = f/sy,f为镜头的焦距,单位取mm,那么sx和sy就为相机每个像元的尺寸,单位也得取mm。
这样所有的镜头标定相关参数就都有了明确的物理意义和单位,就可以与真实环境或物体参数对应起来。
关于镜头焦距和像元尺寸,都可以查阅产品手册获得。tx和ty的值一般不重要,而tz的值对应的就是标定板在拍摄标定图像过程中,相对镜头的实际距离了。镜头畸变系数也可查阅产品手册获得,海康MV系列工业镜头的畸变水平为0.15%,由于畸变模型系数为无量纲值,其对应的r^2是归一化坐标的径向距离,所以可简化取为1。当畸变多项式模型只使用K1一个系数时,是可以得到K1和κ的对应关系的:

于是畸变模型计算得:

κ≈-K1≈0.0015。
在实际使用OpenCV的cv2.calibrateCamera函数进行标定的过程中发现,如果希望最终的标定系数与实际物理参数推导的关系一致,预先给定基于上述推导先验知识计算的参数cameraMatrix和distCoeffs非常重要,因为对于使用LM算法进行最小二乘的迭代寻优而言,初始点的位置至关重要。另外参数objectPoints,即标定板中特征点的数值也非常重要,因为其对应[R|T]矩阵的计算,一方面要保证objectPoints的数值具有明确的物理意义,另一方面又要保证[R|T]矩阵计算的数值稳定性。之前已说过R矩阵中的数值都是(-1,1)之间的数,所以要求T向量的数值也应在(-1,1)之间,这其中最关键的就是tz。所以Halcon中要求标定板中的相关参数都以m为单位,这是因为实际标定过程中,无论是标定板尺寸、还是标定板距镜头的距离,都在1m以内,这样就可保证T向量的值都在(-1,1)之间。另外实测表明,标定板厚度,也就是参数objectPoints中各坐标点的z值不是必须精确给定的,赋予以远小于1的正数或赋0,对最终标定结果基本无影响
注意,由于标定算法的数值计算精度要求很高,最好能使用64位浮点数来表示数值,因为其精度可达小数点后15位,这也是Halcon所使用的。而OpenCV相关算法使用32位浮点数来表示数值,其精度只有小数点后7位,是有可能存在算法计算精度问题的。
通过上述准则,我们就可以确定如何选择相机标定算法了。这里的图像中心是640和480,所以依然是使用OpenCV算法+圆点阵+OpenCV提取特征点的算法最佳。从算法层面分析,这主要归功于使用边缘轮廓+矩估计所提取的圆点阵的特征点坐标,具有最好的透视变换还原性
另外,在Janne Heikkila and Olli Silven的 《A Four-step Camera Calibration Procedure with Implicit Image Correction》中,其说明相机标定算法能达到的理论精度为<0.01pixel,但由于在实际操作中存在各种无法消除的误差,会导致真实误差要远大于理论精度。所以如果我们的最终标定误差<0.01乘以10=0.1个像素,都是完全可以接收的好的结果。还要将上述标定误差从像素换算到实际长度单位(这里是25/42*0.049≈0.03mm),其应该大于标定板的制造误差(这里是0.01mm),否则即使投影平均误差再低,也是没有意义的
基于以上分析,在实际进行相机镜头标定时,为追求高精度,应在完全模拟真实使用的场景下(即相机光圈、焦距、镜头、工作距离、曝光时间都尽可能接近真实使用值),然后使用圆点阵标定板,按照上述标定用图像注意事项,采集超过20张标定图像,最后进行亚像素级的相机镜头标定。这样获得的结果不一定是真实的,但由于其高度的数据相似性,会使其在实际使用中,获得更小的标定后校正误差。

附上使用OpenCV+圆点阵校正的Python代码如下:

dirs = "D:\circles"
fns = os.listdir(dirs)
fns = [os.path.join(dirs,k) for k in fns]
CHECKERBOARD = (7,7)
objpoints = []
imgpoints = []
objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
objp = objp * 0.025 # 真实世界坐标,单位m,Z轴坐标全为0for fname in fns:img = cv2.imread(fname)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)ret, corners = cv2.findCirclesGrid(gray, CHECKERBOARD) # 直接得到浮点数if ret == True:objpoints.append(objp)imgpoints.append(corners) # 对特征点坐标进行中心化不会改变最终的标定精度,因为标定板会出现在相机视野的各个角落,所以依然不会缩减该参数的取值范围 # 给定初始化相机内参和镜头畸变参数
ini_camera = np.zeros((3,3), dtype=np.float32)
f = 12 # 12mm镜头
sx = 3.75*1e-3 # 像元3.75μm
fx = f / sx
ini_camera[0,0] = fx
ini_camera[1,1] = fx
ini_camera[0,2] = 1280/2 # 图像长1280
ini_camera[1,2] = 960/2 # 图像宽960
ini_camera[2,2] = 1
ini_dist = np.zeros((1,5), dtype=np.float32)
acc = 0.9985 # 对应0.15%的标称畸变水平
r2 = 1
ini_dist[0,0] = (acc-1) / r2 # -0.0015# 只使用多项式畸变系数K1标定
flag = 0 | cv2.CALIB_USE_INTRINSIC_GUESS | cv2.CALIB_ZERO_TANGENT_DIST | cv2.CALIB_FIX_K2 | cv2.CALIB_FIX_K3
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], ini_camera, ini_dist, flags=flag)
# 使用5个多项式畸变系数标定
flag = 0 | cv2.CALIB_USE_INTRINSIC_GUESS
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], ini_camera, ini_dist, flags=flag)

总结

以上就是关于工业镜头要讲的内容,欢迎大家对本文章进行补充和指正。

参考资料

《Halcon机器视觉算法原理与编程实战》,北京大学出版社
《机器视觉算法与应用》,清华大学出版社
《海康机器视觉认证工程师官方资料》
《Handbook of Machine and Computer Vision——The Guide for Developers and Users》,Alexander Hornberg,Wiley
OpenCV官方文档,https://opencv.org/
Matlab官方文档,https://ww2.mathworks.cn/help/vision/ug/evaluating-the-accuracy-of-single-camera-calibration.html
Halcon官方文档,https://www.mvtec.com/doc/halcon/12/en/calibrate_cameras.html
https://learnopencv.com/understanding-lens-distortion/

机器视觉系列(五)——镜头部分相关推荐

  1. 机器视觉系列(六)——照明部分

    系列文章目录 机器视觉系列(一)--概述 机器视觉系列(二)--机械部分 机器视觉系列(三)--电气部分 机器视觉系列(四)--相机部分 机器视觉系列(五)--镜头部分 文章目录 系列文章目录 前言 ...

  2. 华睿相机sdk 开发_岳阳楼区供应睿鉑倾斜五镜头相机D2PSDK是

    岳阳楼区供应睿鉑倾斜五镜头相机D2PSDK是 优势说明:睿鉑倾斜五镜头相机D2PSDK是S2PSDK的升级版相机,具备1:500地籍免相控的能力. 分享到: 当 前 价:1.00 起订数量: 1台 发 ...

  3. 机器视觉系列(四)——相机部分(精简版)

    系列文章目录 机器视觉系列(一)--概述 机器视觉系列(二)--机械部分 机器视觉系列(三)--电气部分 文章目录 系列文章目录 前言 一.工业相机和其他数码相机的区别 工业相机和普通数码相机的区别 ...

  4. python解复杂方程_Python数据处理篇之Sympy系列(五)---解方程

    前言 sympy不仅在符号运算方面强大,在解方程方面也是很强大. 本章节学习对应官网的:Solvers 官方教程 (一)求解多元一次方程-solve() 1.说明: 解多元一次方程可以使用solve( ...

  5. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1

    <ASP.NET Core In Action>读书笔记系列五 ASP.NET Core 解决方案结构解析1 参考文章: (1)<ASP.NET Core In Action> ...

  6. Silverlight Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)

    原文:Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations) 正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Bl ...

  7. 盘点2013年那些最优秀的网页设计作品【系列五】

    这个系列的文章向大家展示2013年最优秀的国外网页设计作品,这些都是过去的一年在图片,纹理,导航等等各个方面的优秀网站.2013年,网页设计领域出现了几个新的流行趋势,最热门的就是响应式设计(Resp ...

  8. 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引

    数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引 [建立一个搜索引擎大致需要做这样几件事:自动下载尽可能多的网页:建立快速有效的索引:根据相关性对网页进行公平准确的排序.我们在介绍 Googl ...

  9. 智能路由器-OpenWRT 系列五 (NAS-SMB家庭共享)

    NAS是我觉得家里必不可少的一台设备,NAS 全称 Network Attached Storage,即网络附加存储服务器,它通过自身的操作系统和 SMB/NFS/CIFS/FTP 等多种通信协议来给 ...

最新文章

  1. Opencv cv2 Overload resolution failed
  2. 波士顿动力机器狗半夜遛弯儿惊呆路人,还配合拍照,网友:想到了《黑镜》...
  3. 关于Font Awesome图标的使用
  4. springMVC 前后台日期格式传值解决方式之一(共二) @DateTimeFormat的使用和配置...
  5. Linux C 编程技巧--利用有限状态机模型编程
  6. 机器学习-多元梯度下降
  7. TCP的流量控制和阻塞控制
  8. java做求立方体,Java工具集-数学(立方体操作工具类)
  9. 微软卸载工具msicuu2(附带资源)
  10. 翁凯java进阶_翁凯-----java课程入门与进阶1
  11. python 函数嵌套和嵌套调用
  12. Elasticsearch 如何实现相似推荐功能?
  13. 原则与思维模型--《思维模型》0
  14. java获取和风天气_和风天气(一)数据分析
  15. 读书笔记:《活出生命的意义》
  16. 受够了百度网盘?如何注册无限容量的Google Drive网盘
  17. 2006-09-28 墨子的双眼皮
  18. win7字体大小怎么设置_怎么设置 win7系统excel2010定时保存和数据恢复的方案 -win7系统使用教程...
  19. Excel之如何使用VLOOKUP函数合并两张表
  20. Acer Aspire sw5-12安装系统(包含所有资源)|Acer sw系列装系统

热门文章

  1. ImageIO的图片压缩算法
  2. 小白攻略(一):数学建模是什么,为什么,怎样做?
  3. arduino编程语言Wiring参考手册API
  4. AI高考的信息检索策略
  5. java内部窗口无法实现,java 既不是内部命令也不是外部命令的解决办法
  6. C++ 多线程学习总结
  7. 7-14 电话聊天狂人 (25 分)
  8. QQTIM怎么成功修改个人文件夹保存位置
  9. web前端需要学习什么?需要掌握什么技术
  10. TensorFlow基础(1)特点安装基本用法