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系统的核心脉络画出来了。你可以把它当作本章的知识地图。
1.6 小结
这一章我们聊了:
- 自动对焦的本质是一维搜索,目标是找到FV曲线的峰值
- AF系统由镜头、马达、传感器、处理器、驱动IC五部分组成,缺一不可
- 对焦评价函数是AF的“眼睛”,常见的有梯度类、频域类、统计类三大流派
- 好的评价函数要满足单峰、无偏、灵敏、抗噪四个条件
我个人习惯,在开始一个新项目时,先把这三点理清楚。原理搞懂了,组件选对了,评价函数调好了,后面的搜索策略才能跑得顺。否则,再好的搜索算法也救不了烂数据。