4. 自动对焦(AF)原理

自动对焦,说白了就是让镜头动起来,把画面拍清楚。我刚开始接触3A时,觉得AF不就是调调马达嘛,后来才发现这里面的门道深着呢。今天咱们就把两种最核心的对焦方式——对比度对焦(CDAF)和相位对焦(PDAF)掰开揉碎了讲清楚。

4.1 对比度对焦(CDAF)—— 老黄牛式的靠谱

CDAF的原理特别直观:画面越清晰,相邻像素的亮度差异就越大。你想想看,一张对焦准确的照片,边缘锐利,黑白分明;而对焦不准的照片,糊成一片,灰度值都差不多。

算法流程其实就三步:

  1. 计算对比度值:对当前帧图像计算一个“清晰度得分”
  2. 判断方向:对比前后两帧的得分,决定镜头往哪边转
  3. 搜索峰值:反复移动镜头,直到找到得分最高的位置

常用的对比度评价函数有这么几种:

评价函数 计算方式 特点
Tenengrad Sobel算子提取梯度,求和 抗噪性好,计算量适中
Laplacian 二阶微分算子 对边缘敏感,易受噪声影响
Brenner 相邻像素差值的平方和 实现简单,硬件友好
SMD(灰度方差) 相邻像素差值和 计算量最小,精度一般

关键指标:CDAF的精度取决于“对比度曲线的尖锐程度”。理想情况下,峰值位置就是最佳对焦位置。但实际中,曲线往往有平台区或噪声毛刺,这就需要做曲线拟合或滤波处理。

我在项目中遇到过一个问题:用Tenengrad函数时,画面中有大面积天空或白墙,对比度值几乎不变,镜头就在那里来回扫,就是找不到峰值。后来加了一个区域权重掩膜,只对画面中央和边缘纹理丰富的区域计算对比度,问题就解决了。

4.2 相位对焦(PDAF)—— 快准狠的现代方案

PDAF的原理跟人眼有点像。人眼通过左右眼看到的视差来判断距离,PDAF则是通过传感器上特殊的相位检测像素来直接算出对焦方向。

具体来说,传感器上每隔几行就有一对“遮挡像素”:

  • 左像素:只接收光线从右侧来的部分
  • 右像素:只接收光线从左侧来的部分

当镜头准确对焦时,左右像素接收到的光强一致,相位差为0。当镜头靠前或靠后时,左右像素的信号会出现偏移,这个偏移量就是相位差。

我的经验:PDAF的相位差计算通常用互相关(Cross-Correlation)或SAD(差值和)来做。我个人习惯用SAD,因为硬件实现简单,而且对光照变化不敏感。

相位差到镜头移动量的换算公式:

// 相位差 -> 镜头步数
// pd_value: 相位差值(像素单位)
// lens_gain: 镜头灵敏度(步数/像素)
// direction: 对焦方向(+1 或 -1)

int pd_to_lens_step(int pd_value, float lens_gain, int direction) {
    int step = (int)(pd_value * lens_gain + 0.5f);
    return step * direction;
}

4.3 CDAF vs PDAF —— 谁更胜一筹?

这两种方案各有各的脾气,我整理了一个对比表:

对比维度 CDAF PDAF
对焦速度 慢(需要反复搜索) 快(一次计算到位)
精度 高(直接基于图像内容) 中等(受像素间距限制)
低光性能 差(噪声干扰大) 好(相位信号更稳定)
硬件成本 低(纯软件算法) 高(需要专用像素)
适用场景 静态场景、高精度需求 运动场景、视频录制

避坑指南:我曾经在PDAF调试中踩过一个坑——相位检测像素的灵敏度会随着温度变化而漂移。夏天室外35度时,同样的相位差值对应的镜头步数跟实验室25度时差了将近20%。后来我加了一个温度补偿表,才把这个问题压住。

4.4 混合对焦(Hybrid AF)—— 取长补短

现在主流的高通平台都用的是混合对焦:PDAF快速粗调 + CDAF精细微调。流程大概是这样的:

  1. PDAF粗调:计算相位差,一步把镜头移到大致位置
  2. CDAF精调:在小范围内搜索对比度峰值
  3. 锁定:确认对焦完成,进入跟踪模式

这样做的好处很明显:既有了PDAF的速度,又保留了CDAF的精度。我参与的一个项目中,纯PDAF的对焦成功率只有85%左右,加上CDAF精调后,成功率提升到了98%以上。

混合对焦(Hybrid AF)流程图 开始对焦 PDAF粗调 计算相位差 → 一步移动镜头 是否到位? 是 否 CDAF精调 小范围搜索对比度峰值 重新PDAF粗调 调整参数后再次计算 锁定对焦 PDAF负责快速粗调,CDAF负责精细微调,两者配合实现又快又准的对焦

4.5 实战中的关键参数

不管用哪种方案,有几个参数是绕不开的:

  • 搜索步长:CDAF中每次移动的步进值。步长太大容易跳过峰值,步长太小对焦太慢。我一般设成镜头全行程的1%~3%。
  • 死区阈值:当对比度变化小于这个值时,认为已经到峰值了。设得太小容易误判,设得太大又不够精准。
  • 超时时间:防止镜头卡死或来回震荡。超过这个时间还没锁定,就强制退出或回退到安全位置。
  • 置信度阈值:PDAF的相位差计算是否可靠。低光或纹理不足时,置信度会下降,这时候应该回退到CDAF。

我的调试习惯:先把CDAF调稳,再调PDAF。因为CDAF是“兜底方案”,如果CDAF本身就不靠谱,混合对焦的效果肯定好不到哪去。我一般会在实验室里用棋盘格标板把CDAF的搜索曲线调得又尖又稳,然后再去调PDAF的相位差映射关系。