1. AF系统概述:自动对焦的基本原理、AF系统组成、对焦评价函数简介

1.1 自动对焦——相机为什么要自己“找焦点”

自动对焦,说白了就是让相机自己判断什么时候画面最清晰。你按下快门,镜头自动前后移动,找到那个“刚刚好”的位置。

我刚开始做嵌入式相机时,觉得手动对焦也挺好。后来发现,在安防监控、无人机、工业检测这些场景里,没人有时间去拧镜头环。机器必须自己搞定。

自动对焦的核心逻辑其实很简单:

  • 移动镜头——改变像距,让成像面落在传感器上
  • 计算清晰度——用算法给当前画面打个分
  • 搜索最佳位置——找到分数最高的那个点

嗯,听起来像爬山。你站在山谷里,目标是山顶。每走一步,测一下海拔。海拔最高的地方,就是焦点位置。

核心观点:自动对焦的本质是一个一维搜索问题。搜索空间是镜头位置,目标函数是图像清晰度评价。

1.2 AF系统组成——谁在干活?

一套完整的AF系统,至少包含这几个部分:

组件 作用 我踩过的坑
镜头模组 包含对焦镜片,可前后移动 马达回程差会让位置不准,得做校准
驱动马达 VCM、步进电机、超声波马达 VCM有磁滞,步进有丢步,选型要谨慎
图像传感器 采集图像数据 帧率不够,对焦会卡顿
ISP/处理器 运行对焦算法,计算评价值 算力有限时,得用简化算法
驱动IC 将数字指令转为马达电流 电流噪声会影响位置精度

你想想看,这五个部件任何一个出问题,对焦都会翻车。我在一个项目中遇到过,马达驱动IC的电流纹波太大,导致镜头在合焦点附近来回抖动,画面一直忽清忽糊。后来换了低噪声驱动IC才解决。

1.3 对焦评价函数——怎么才算“清晰”?

机器不像人眼,一眼就能看出画面清不清晰。它需要一个数学公式,把“清晰度”变成一个数值。

这个数值,就叫对焦评价值(Focus Value,FV)。

常见的评价函数有这几类:

1.3.1 基于梯度的评价函数

清晰图像边缘锐利,相邻像素差异大。模糊图像边缘平滑,像素差异小。所以,计算图像梯度就能反映清晰度。

  • Tenengrad函数:用Sobel算子算梯度,然后求和。我最早用的就是它,效果稳定,就是计算量大一点。
  • Laplacian函数:用拉普拉斯算子,对噪声敏感,但响应快。
  • Brenner函数:只算相隔两个像素的差值,计算量最小,适合嵌入式。
// 一个简单的Brenner函数实现(C语言风格)
uint32_t brenner_fv(uint8_t *img, int width, int height) {
    uint32_t sum = 0;
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width - 2; x++) {
            int diff = img[y * width + x] - img[y * width + x + 2];
            if (diff > 0) sum += diff * diff;
        }
    }
    return sum;
}

经验之谈:实际项目中,我通常会在Brenner基础上加一个阈值门限,滤掉噪声引起的微小梯度。效果提升很明显。

1.3.2 基于频域的评价函数

清晰图像高频成分多,模糊图像高频成分少。用FFT或DCT变换,看高频能量就行。

  • FFT高频能量法:做傅里叶变换,累加高频分量。精度高,但计算量太大,实时性差。
  • DCT系数法:只算部分DCT系数,比FFT快一些。

说实话,在嵌入式平台上,频域方法用得不多。算力扛不住。我只有在PC端做算法仿真时才用FFT。

1.3.3 基于统计的评价函数

  • 方差法:计算图像像素值的方差。清晰图像对比度高,方差大。
  • 熵函数:计算图像信息熵。清晰图像信息量大,熵值高。

方差法简单,但容易受光照影响。熵函数对纹理丰富的场景效果好,对纯色场景就抓瞎了。

1.4 评价函数的理想曲线长什么样?

一个好的评价函数,它的FV曲线应该满足:

  • 单峰性:只有一个最大值,没有假峰
  • 无偏性:峰值位置对应真实合焦点
  • 灵敏度高:离焦时FV下降快,容易判断方向
  • 抗噪性好:不会因为一点点噪声就乱跳

我曾经在一个项目中,用了简单的梯度函数,结果在低光照下曲线全是毛刺,搜索算法根本找不到峰值。后来换了带预滤波的Tenengrad,才稳定下来。

注意:没有万能的对焦评价函数。不同场景、不同镜头、不同传感器,适合的函数都不一样。做项目时,一定要实测对比。

1.5 AF系统知识结构总览

下面这张图,把AF系统的核心脉络画出来了。你可以把它当作本章的知识地图。

AF系统知识结构总览 自动对焦AF系统 基本原理 系统组成 对焦评价函数 镜头移动改变像距 一维搜索问题 爬山模型 镜头模组 驱动马达 图像传感器 ISP/处理器 驱动IC 梯度类(Tenengrad等) 频域类(FFT/DCT) 统计类(方差/熵) 本章重点:理解AF系统的三大支柱——原理、组成、评价函数,为后续搜索策略打下基础

1.6 小结

这一章我们聊了:

  • 自动对焦的本质是一维搜索,目标是找到FV曲线的峰值
  • AF系统由镜头、马达、传感器、处理器、驱动IC五部分组成,缺一不可
  • 对焦评价函数是AF的“眼睛”,常见的有梯度类、频域类、统计类三大流派
  • 好的评价函数要满足单峰、无偏、灵敏、抗噪四个条件

我个人习惯,在开始一个新项目时,先把这三点理清楚。原理搞懂了,组件选对了,评价函数调好了,后面的搜索策略才能跑得顺。否则,再好的搜索算法也救不了烂数据。