3、自动对焦(AF)算法原理
自动对焦,说白了就是让镜头自己找到最清晰的那个位置。你想想看,手机拍照时那一瞬间的“咔哒”声背后,其实是一套复杂的物理测量和搜索逻辑在跑。我刚开始做ISP时,总觉得AF不就是找个最大值嘛,后来被各种场景虐过才知道,这里面的坑比想象中多得多。
3.1 AF的物理基础:对比度与相位
要理解AF,得先知道相机怎么判断“清晰”。目前主流方案就两种:对比度检测和相位检测。它们俩的物理原理完全不同,适用场景也各有侧重。
| 检测方式 | 物理原理 | 典型应用 | 我的评价 |
|---|---|---|---|
| 对比度检测(CDAF) | 图像边缘越锐利,相邻像素灰度差越大 | 早期手机、微单、监控 | 精度高,但慢得像蜗牛 |
| 相位检测(PDAF) | 通过微透镜分光,测量左右像点的偏移量 | 主流旗舰手机、单反 | 快准狠,但硬件成本高 |
| 混合对焦(Hybrid AF) | PDAF粗定位 + CDAF精调 | 几乎所有中高端机型 | 这才是工程上的最优解 |
核心指标:对比度值通常用Tenengrad梯度或Laplacian方差来算。相位偏移量则直接对应镜头需要移动的物理距离——这也是PDAF能“一步到位”的原因。
我在项目中遇到过一个问题:纯CDAF在拍纯色墙壁时,对比度曲线几乎是一条平线,镜头会来回拉风箱。后来加了PDAF辅助,才解决了这个“无纹理死锁”的尴尬。
3.2 对焦窗口选择
AF算法不是对整张图算清晰度的,那样太慢了。我们需要选一个或几个“窗口”,只在这些区域里计算。窗口选得好不好,直接决定对焦成败。
常见的窗口策略有这几种:
- 中心固定窗口:最简单,但主体不在中心时就废了。我记得早期功能机时代,拍人必须把人放正中间,否则背景清晰人脸糊——就是这玩意的锅。
- 多区域网格窗口:把画面分成9宫格或25宫格,分别算清晰度,取最大值或加权融合。适合风景、多人场景。
- 人脸/主体跟踪窗口:结合检测算法,窗口跟着目标走。这是现在的主流做法,但算力开销大。
- 自适应窗口:根据场景亮度、运动状态动态调整窗口大小和位置。嗯,这个是我个人比较推崇的方案。
避坑指南:窗口不能太小,否则容易受噪声干扰;也不能太大,否则背景会拉低主体权重。我曾经在一个夜景项目里把窗口设成32x32,结果对焦全凭运气——后来改成64x64加中值滤波,稳多了。
3.3 爬山算法与全局搜索
有了清晰度评价函数(比如对比度值),接下来就是怎么找到那个“最清晰”的镜头位置。这本质上是一个一维极值搜索问题。
爬山算法(Hill Climbing)是AF领域最经典的搜索策略。它的逻辑很简单:
- 朝一个方向移动镜头,计算当前帧的清晰度值。
- 如果清晰度在上升,继续同方向移动。
- 如果清晰度开始下降,说明越过了峰值,回退到上一个位置。
- 如果清晰度变化小于阈值,认为已经收敛。
但爬山算法有个致命弱点——容易陷入局部极值。你想想看,如果画面里有栅栏、树叶这些高频纹理,清晰度曲线可能有好几个峰,爬山爬到半山腰就停了。
我曾经踩过的坑:有一次在户外拍铁丝网,爬山算法直接锁在了最近的一根铁丝上,远处的目标全糊了。后来我加了“全局搜索 + 局部爬山”的两阶段策略,先大步长粗扫一遍找到全局最高峰区域,再小步长精调,才彻底解决这个问题。
全局搜索(Full Search)就是让镜头从近端走到远端,每走一步算一次清晰度,最后取最大值对应的位置。优点是能找到全局最优,缺点是——慢。一个典型的全局搜索可能需要30~50步,每步一帧,对焦时间轻松超过1秒。
工程上常用的折中方案是三步搜索法:
- 第一步:大步长(比如32步进)粗扫,定位峰值区域。
- 第二步:中步长(8步进)在峰值区域细扫。
- 第三步:小步长(2步进)精调,找到最终位置。
这样总步数可以从50步降到15步左右,对焦时间控制在300ms以内。
3.4 知识结构图:AF算法核心流程
下面这张图把AF的完整链路串起来了,从物理信号到最终对焦完成,每一步都绕不开。
3.5 工程实战要点
最后聊几个我在调优AF时反复踩过的坑,希望能帮你少走弯路:
- 死区处理:镜头在微距端和无穷远端的边界位置,清晰度曲线可能不单调。我建议在边界处加软限位,不要硬顶。
- 运动场景:如果画面在动,爬山算法会误判。可以加运动检测,运动时切到PDAF或冻结对焦。
- 低照度:噪声会严重干扰对比度计算。先做降噪再算清晰度,或者用更大窗口平均。
- 回差补偿:齿轮和弹簧有机械间隙,正反方向走到同一位置可能清晰度不同。我习惯在最终位置做一次“微抖”确认。
一句话总结:AF调优的本质,就是在速度、精度、鲁棒性之间做权衡。没有银弹,只有针对你的硬件和场景反复试出来的最优解。