4. 自动对焦(AF)原理:对比度对焦(CDAF)与相位对焦(PDAF)基础
自动对焦,说白了就是让镜头动起来,把画面拍清楚。我刚开始接触3A时,觉得AF不就是调调马达嘛,后来才发现这里面的门道深着呢。今天咱们就把两种最核心的对焦方式——对比度对焦(CDAF)和相位对焦(PDAF)掰开揉碎了讲清楚。
4.1 对比度对焦(CDAF)—— 老黄牛式的靠谱
CDAF的原理特别直观:画面越清晰,相邻像素的亮度差异就越大。你想想看,一张对焦准确的照片,边缘锐利,黑白分明;而对焦不准的照片,糊成一片,灰度值都差不多。
算法流程其实就三步:
- 计算对比度值:对当前帧图像计算一个“清晰度得分”
- 判断方向:对比前后两帧的得分,决定镜头往哪边转
- 搜索峰值:反复移动镜头,直到找到得分最高的位置
常用的对比度评价函数有这么几种:
| 评价函数 | 计算方式 | 特点 |
|---|---|---|
| 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精细微调。流程大概是这样的:
- PDAF粗调:计算相位差,一步把镜头移到大致位置
- CDAF精调:在小范围内搜索对比度峰值
- 锁定:确认对焦完成,进入跟踪模式
这样做的好处很明显:既有了PDAF的速度,又保留了CDAF的精度。我参与的一个项目中,纯PDAF的对焦成功率只有85%左右,加上CDAF精调后,成功率提升到了98%以上。
4.5 实战中的关键参数
不管用哪种方案,有几个参数是绕不开的:
- 搜索步长:CDAF中每次移动的步进值。步长太大容易跳过峰值,步长太小对焦太慢。我一般设成镜头全行程的1%~3%。
- 死区阈值:当对比度变化小于这个值时,认为已经到峰值了。设得太小容易误判,设得太大又不够精准。
- 超时时间:防止镜头卡死或来回震荡。超过这个时间还没锁定,就强制退出或回退到安全位置。
- 置信度阈值:PDAF的相位差计算是否可靠。低光或纹理不足时,置信度会下降,这时候应该回退到CDAF。
我的调试习惯:先把CDAF调稳,再调PDAF。因为CDAF是“兜底方案”,如果CDAF本身就不靠谱,混合对焦的效果肯定好不到哪去。我一般会在实验室里用棋盘格标板把CDAF的搜索曲线调得又尖又稳,然后再去调PDAF的相位差映射关系。