原作陈瑶,部分内容来源于网络,我在此基础上进行了理解和整理。

经过学习,我把AF分为两个部分,第一部分是在变焦的过程中保持图像清晰,用的是tracking算法。简单的来说,是通过镜头曲线去预估变焦后,镜头应该对焦到什么位置。

第二部分是聚焦清晰,用的是爬坡算法。通过滤波器计算出图像的清晰度,移动镜片,找到最清晰的位置,也可以利用镜头曲线去缩小爬坡的范围。

所以镜头曲线是什么?先来介绍一下硬件相关的原理。

(一)硬件原理

目前在监控镜头中遇到的控制zoom和focus的电机都是步进电机,其优点是技术成熟,控制简单,缺点也较明显,存在机械磨损,一颗镜头的正常拉伸周期在30万-50万次,以枪球联动为例,日夜频繁拉伸,理论寿命也就在3个月左右。

在镜头手册中对步进电机的说明一般包含以下几个参数:

  1. 线圈阻抗;

  2. 驱动电压;

  3. 激励方法:1-2相驱动,2-2相驱动;

  4. 螺杆螺距,螺距即螺纹上相邻两牙对应点之间的轴向距离,目前遇到的大部分镜头都是0.4mm;

我们主要关心的是第3条和第4条,目前算法中电机都采用的是2-2相驱动,根据电机步进角和细分步数及螺杆螺距最终将镜头的移动距离换算成电机步数,后面会结合具体的镜头介绍如何计算。

AF算法中,使用到了镜头自身的一些固有参数,下面以联合光电T5390-HQ1为例作介绍。

镜头曲线的概念

图1 镜头pi点位置图

图1中,黑色的曲线就是镜头的对焦曲线,横坐标表示zoom电机位置,纵坐标表示focus电机的位置。该曲线表示,在某一物距(物体到透镜光心的距离)下,当zoom处于横坐标中的某一位置时,如果focus正好位于曲线上,那么该物距下就能通过镜头在sensor上获得清晰的成像。

不同的物距对应着不同的对焦曲线,在zoom位置相同时,物距越远focus值越小(位置越低低);不同曲线间的间隔在不同的zoom位置是不同的,在wide端(靠近坐标原点方向),不同物距下的对焦曲线间隔较近,在tele端(远离坐标原点方向),不同物距下的曲线间隔相对较大,如图2所示,

图2.不同物距下的对焦曲线

厂商在给出的镜头手册中包含多组不同物距下的镜头对焦曲线,在AF算法中最多选10条曲线就可以很好的满足算法需求,选择曲线的要求一般是两条曲线之间的物距间隔不宜过大,过大的曲线间隔会对tracking时位置估计的准确性带来困难(两曲线间物距相差太大,对物距像距的线性近似偏差较大)。

注意,不同厂商给出的对焦曲线使用的坐标原点会有所差异,在整理focus坐标时要一致性的将坐标原点转换成图1中表示的坐标,便于AF算法统一识别处理。

镜头PI点

概念

AF算法中zoom和focus电机都有自己的坐标系统,pi点就是一个相对于坐标原点的固有位置,如图1所示。

图中红色小圆圈标注的点是目前AF算法中标定的坐标原点,横坐标表示zoom电机位置,纵坐标表示focus电机的位置,虚线交叉的位置是PI点所在位置。

AF算法中步进电机细分后最小步长为0.005mm/步(表示电机走一微步,螺杆将结构向前推动0.005mm),根据图1中的尺寸标定,可以算出zoom PI点的位置为19.9mm(26.14-6.24) ,换算成电机步数为19.9/0.005 = 3980步,同理可计算出focus电机的PI点电机步数为6.2mm/(0.005mm/步) = 1240步。

PI坐标点搜索过程

PI点坐标的搜索是在AF算法正常运行之前完成的(AF依赖于zoom和focus坐标),搜索过程依赖于镜头内部的光耦电平信号,光耦电平可用来确定电机运动方向和PI点位置。

如图1所示,ZPI表示zoom在当前位置处的PI电平,FPI表示focus在当前位置时的PI电平,两个电平值可通过GPIO来读取。对这款镜头来说,zoom靠近wide端时ZPI是低电平,靠近tele端时ZPI是高电平;focus在靠近near(小物距)端时FPI是高电平,在靠近far(大物距)端时FPI是低电平。光耦电平跳变的地方就是PI点的位置。

镜头内部的光耦在机芯正常工作时的关闭的,避免光耦漏光影响成像效果。PI程序搜索开始前首先打开光耦,根据当前光耦电平决定下一步电机的运动方向,目前的搜索程序在搜索过程中多次反复越过光耦点,搜索思想如下:

  1. 搜索开始时大步向光耦电平跳变位置移动电机;

  2. 累加大步搜索时电机运动的总步数,如果总步数超过了最大运动步数,认为光耦电平无跳变,错误退出;

  3. 大步搜索过程中,光耦电平跳变后,改变电机运动方向和运动步长(步长减半),继续搜索光耦电平跳变点;

  4. 电平跳变后再次改变电机运动方向和电机运动步长(减小),更精确的搜索电平跳变位置,重复34操作,直到通过步长为1时搜索到电平跳变点退出;

  5. 此时的电机位置即PI点的坐标。

偏差校正

监控一体机镜头是一个精密的机械器件,镜头内部的镜片移动距离以0.005mm为单位计,由于机械加工的精度问题,光耦的安装位置,镜头后焦的距离,sensor板sensor高度等和设计时的理论值存在偏差,在镜头的生产过程中要对偏差进行校正。

镜头的校正的结果分成两个部分,第一部分是光耦位置的偏差校正,可解决光耦安装带来的偏差问题;第二部分是理论镜头曲线和实际镜头曲线的校正,这一部分主要是校正光学设计和实际生产的偏差,校正后的曲线和实际相符,有利于拉伸镜头时更好的实现全程清晰效果

下面介绍目前采用的机芯校正方法:

PI校正其实就是校正PI点理论坐标和实际坐标的偏差,分为水平和垂直两个方向,如图7所示,黑色曲线表示理论曲线,虚线交叉处的黑色点表示理论PI位置,红色的点表示实际PI点位置。

图7 镜头PI校正原理

理论PI点和实际PI点的偏移△x和△y分别对应着zoom PI偏差和focus PI偏差,图中只表示了偏差的情况之一,实际情况,偏差可以在黑色圆点的任意方向。

校正时用到的工具是一个模拟无穷远物距的灯箱,实际上是一个平行光管,简化结构如图8。

图8 灯箱简化结构图

光源为图像模板提供照明,毛玻璃使照明均匀,分划板位于透镜的焦点上,模板图像通过透镜成像于无穷远处。因此在物镜右侧可观测到位于无穷远的像。

校正时采用的是镜头的无穷远物距曲线,分为以下几个步骤:

1、将镜头移动到PI点(图7中红色原点处),记当前zoom和focus坐标为理论PI点坐标,此时坐标和理论坐标存在偏差;

2、在zoom最大步长范围内选择若干个位置点(记为锚点,如图7黑色曲线上的黑色小圆点所示),选点时要在wide端和tele端留有一定的余量,避免在错误的坐标系下过分靠近边界时和机械结构相撞。将zoom移动到对应的每个锚点坐标上,在自动聚焦模式下聚焦清楚后记录下对应的focus位置,这一过程中虽然坐标系统存在偏差,但和没有偏差的坐标系统相比,同样的zoom物理位置聚焦清晰时的focus物理位置是一样的,即和没有偏差的系统相比,同样物理位置聚焦清楚后的差异主要表现在坐标值的差异上;

考虑一简单情况,只有zoom PI点存在偏差,focus正常,如图9所示。

图9 focus系统无偏差情况

在偏差系统中如果zoom=2000,聚焦清楚时focus为1000,在无差系统中zoom为2000时聚焦清楚时focus为1100,focus的这一差异就是因为zoom坐标系统偏差引起。那么可以通过focus值的偏差来校正出zoom的偏差,理论上在镜头曲线单调区间内聚焦清楚时的focus位置对应着唯一的zoom,通过计算可以得出在无差系统中focus为1000时的zoom位置,这一位置和偏差系统中的位置差即zoom PI偏差。同理只考虑focus PI偏差的情况,zoom位置相同时聚焦清楚的focus偏差就是focus PI偏差。

3、在无差系统的锚点坐标(非物理位置)左右以单步长递增多次循环计算理论focus位置,在理论focus位置上加上一定范围内的偏差值(pi偏差肯定在一个适当范围内),计算每次偏差系统锚点处的focus和无差系统计算出的focus位置差的平方(最小二乘),统计出最小值,此时代入无差系统计算的zoom偏移和focus偏移即zoom PI和focus PI偏差。

4、记录描点时的focus和PI补偿后的理论focus偏差,该偏差即镜头曲线的校正偏差。

(二)Tracking算法

Tracking是zoom tracking是简写,指的是在变倍过程中根据清晰度变化情况自动调整focus位置使得图像保持清晰的过程。

如图2所示,镜头厂商会给出大约10个不同物距下的镜头曲线,范围从很近的物距一直到无穷远物距。在tracking过程中物距是一个连续变化的过程,算法会根据当前的zoom位置和物距估算出下一个zoom位置处的focus值,下文将解释这一过程。

曲线插值

图10 focus位置估计方法

如图10所示,图中黑色的点表示镜头曲线表中的某一条曲线采样位置(镜头曲线在程序中没有完整的导入,完全导入镜头数据会较大,影响生成的库的大小),需要求出中间垂直线和镜头曲线交叉处的focus值,由于镜头曲线在较小的一段范围内近似直线,如图中的红色连线所示,根据三角形等比公式有如下等式:

△f1/△f2 =△z1/△z2

其中△f2、△z1、△z2均可从曲线表中查询后计算获得,因此可算出△f1值,从而近似计算得到交叉点的focus位置(前一个圆点处的focus位置+△f1)。

Focus位置估计

根据高斯成像公式

1/f = 1/u + 1/v

其中f表示焦距,u表示物距,v表示像距。聚焦时zoom在一固定位置,焦距恒定,那么上面公式可改写为:

C = 1/u + 1/v

简单变换后为:

v = 1/c * (1 + 1/(cu - 1))

函数形状如图11所示:

图11 焦距恒定时物距和相距的对应关系

从图中可以看出,物距u和像距v之间是一一对应的关系。Focus位置估计时的已知和未知量如图12所示:

图12 待估计的focus位置

图12中,黑色的小圆点表示已知的focus位置,红色的小圆点表示待估计的focus位置,三个小圆点的物距信息为已知,求红色小圆点处的focus位置。映射到图11中的效果如图13所示。

图13

其中△u1、△u2、△x1、△x2、△v2为已知信息,△v1为待求信息,在黑色点物距差较近时,黑色点的连线近似直线,有如下等式成立:

△u1/△u2 = △x1/△x2 = △v1/△v2

因此可以计算出△v1 = △u1 * △v2/△u2,从而计算出红色点处的镜头focus值。

总结起来分为以下几步:

  1. 根据物距大小计算出比当前物距略小和略大的两条镜头曲线;

  2. 根据要估计的zoom位置在采样过后的曲线表中找出该点的前一个点和后一个点,在第一步中找到的两条曲线上通过插值计算出zoom位置处的两个focus值,即图10中中间垂直线和两条曲线的交叉点处的focus值;

  3. 使用第2步中计算出的focus值和图13的比例关系,计算出目标物距处的focus值。

物距估计

物距估计即根据当前的zoom和focus位置及已知的镜头曲线表计算出当前focus位置的物距大小。

计算过程分为以下几步:

  1. 根据镜头曲线表和zoom位置插值计算出镜头曲线上zoom位置对应的focus值;

  2. 比较实际focus值和插值处的focus值,得出当前focus位于哪两条镜头曲线之间;

  3. 根据镜头曲线标号得出第二步中两条镜头曲线的物距信息;

  4. 问题转换为根据已知的两点的focus值和对应的物距信息及一处focus值,求该focus值处的物距信息;

  5. 这样求解过程和图13类似,通过等比计算可直接算出。

(三)爬坡算法

目前的AF算法中搜索峰值的过程采用的是盲人爬坡算法,该方法要求清晰度评价函数具有严格的单峰性。搜索过程中只能通过爬坡和下坡来判断出山峰的方向而不能看到山峰的全貌,只有当越过山峰时才能找到山峰。

为了提高聚焦是速度,在af算法中将山坡划分为3个不同的区域,分别对应着平坦区域(flat),斜坡区域(slope),陡坡区域(steep),不同区域对应着不同的爬坡步长,在平坦区域采用大步走的方式,随着坡度越来越来,步长越来越小,以达到快速精确搜索山峰的目的。爬坡过程如图14所示。

图14 理想山峰的爬坡过程

可以采用状态机的方法,实现各种状态的跳转。

滤波器的应用

如何评价清晰度?这里就要用到滤波器了。图像越清晰,说明图像的高频分量越多,用一款滤波器保留图像的高频分量,来对比到底哪张图片更加清晰。

基于硬件设计的成本考虑,早期的自动对焦系统都是用一些固定系数高频提取算子比如sobel,laplace等作为评价函数。

当图像高频成分丰富的时候,例如合焦附近的时候,高通滤波器能够提取足够的锐度信息。但是当图像离焦的时候,高通滤波器就不行了,带通滤波器和带阻滤波器比高通滤波器能更好的提取图像的锐度信息。

举例来说,下图画出两组滤波器对不同对比度图像的响应曲线。横轴是lens 位置,纵轴是focus value。

可以看出下方sobel 算子对于低对比度图像的响应非常平坦,对于高对比度离焦的情况也不好。

从信号处理的理论上来讲,这些算子都可以认为是FIR滤波器

FIR滤波器原理

一个4 tap FIR滤波器其输出可表示为:

比如 difference算子就可以用一个2 阶FIR 滤波器表示:

h(0) = +1,

h(1) = -1;

这些算子相当于系数固定的FIR滤波器,很多早期对焦系统的评价函数就是这些固定的算子。

因为镜头以及成像系统的光学特性差别很大,这种固定系数高频算子的ISP设计不能满足自动对焦系统的需要。比如在低对比度的情形下,图像缺少高频成份,如果滤波器就不能够提取到足够的图像边缘的高频成份,这样对焦算法就无法找到峰值从而实现对焦了。所以后来的自动对焦系统评价函数逐渐采用可以设定系数的FIR或者IIR滤波器。从原理上说,实现同样性能的滤波器,IIR滤波器比FIR滤波器的阶数要低,为了节省行存,硬件上采用IIR滤波器较为合适。

二阶IIR滤波器

上图是一个二阶IIR滤波器,与FIR滤波器相比,IIR滤波器会把输出反馈到输入。

传递函数数学表达式是:

再回到具体的自动对焦系统中来说,一般会采用下面的设计:

(四)我的疑问

  1. 如果有两个物体,一个前一个后,总会聚焦在前景上怎么办?

    可以设置ROI,设置感兴趣的区域,将这个区域对焦清楚位置

  2. PI点是什么?它有什么作用?

    回答:刚上电的时候,zoom和focus的电机不知道自己停在什么位置。这个PI点,就是确定一个起始位置,或者说是坐标轴的中心。接下来的移动都按照这个为准

  3. 对焦曲线为什么在焦距比较长的地方会分岔?

    猜测:当焦距比较短的时候,景深比较大,像也比较近,只要对焦清楚了,基本都能看清。而焦距比较长的时候,景深比较小,不同物距的像离得比较远,想要看到不同距离的物体,就需要移动sensor的位置了。所以焦距比较长的时候,会有多根线。

  4. 理论上焦距越长,像应该越远,但是这个对焦曲线却不是一直增大的,而是先增大后减小,这是为什么呢?

    猜测:可能是变焦镜头在变焦的过程中,镜片组在移动,等效出来的理想凸透镜也在移动。虽然焦距变长了,但是镜片位置前移了,像与镜头的位置反而缩短了

  5. 镜头内部的光耦在机芯正常工作时的关闭的,避免光耦漏光影响成像效果。光耦会漏光么?我印象中的光耦是塑料封装的,应该不存在漏光的问题呀。

  6. 海思平台的滤波器貌似由横向Horizontal IIR和纵向Vertical FIR两种一维滤波器组成,为何不用二维的FIR或者IIR滤波器?