自动对焦原理:CDAF、PDAF、激光/ToF 对焦
自动对焦,说白了就是让镜头自己找到最清晰的那个位置。我做了这么多年图像算法,最深的感触就是——对焦不准,后面所有算法都是白搭。你想想看,一张糊掉的图,再好的 AWB 和 AE 也救不回来。
今天咱们就把三种主流对焦方式掰开揉碎了讲。这三种方式,我按自己的理解把它们分成两类:算出来的和量出来的。
核心观点:CDAF 是“算”对比度,PDAF 是“算”相位差,激光/ToF 是“量”距离。算的慢但准,量的快但受限于硬件。
1. 对比度对焦 (CDAF) —— 最朴素的“找最锐”
CDAF 的原理其实特别简单:图像越清晰,相邻像素的差异就越大。镜头从近到远走一遍,每到一个位置算一个“清晰度分数”,分数最高的那个位置就是焦点。
我习惯把 CDAF 比作“盲人爬山”。你闭着眼睛摸一个山坡,每走一步摸一下地面坡度,坡度最大的地方就是山顶。镜头也是这样,只不过它摸的是图像的对比度。
常用的清晰度评价函数
| 评价函数 | 原理 | 特点 |
|---|---|---|
| Tenengrad | Sobel 梯度平方和 | 抗噪好,计算量大 |
| Laplacian | 二阶微分值 | 对边缘敏感,易受噪声影响 |
| Brenner | 相邻像素差平方 | 计算快,精度一般 |
| 方差法 | 像素灰度方差 | 最简单,适合均匀场景 |
我的经验:实际项目中我很少只用一种评价函数。通常我会把 Tenengrad 和 Brenner 加权组合,前者保证精度,后者保证速度。有一次在低光照场景下,Laplacian 被噪声淹没了,换成 Tenengrad 才稳住。
爬山搜索算法
CDAF 的搜索策略也很有讲究。最基础的是全局搜索——镜头从头走到尾,找最大值。但这样太慢了,没人这么用。
实际产品里常用的是爬山法:
- 朝一个方向移动镜头,每步算一次清晰度
- 如果分数持续上升,继续走
- 如果分数开始下降,说明过了峰值,往回退到最高点
- 如果一开始就下降,说明方向反了,掉头
注意:爬山法有个致命问题——局部极值。比如镜头前面有个玻璃窗,玻璃上的污渍可能比远处的风景更“清晰”。我遇到过好几次这种情况,后来加了“粗搜 + 精搜”两段式策略才解决。
// 伪代码:CDAF 爬山搜索
float search_focus() {
float max_score = 0;
int max_pos = 0;
int direction = 1; // 1: 正向, -1: 反向
for (int step = 0; step < MAX_STEPS; step++) {
move_lens(direction);
float score = calc_tenengrad(current_frame);
if (score > max_score) {
max_score = score;
max_pos = current_pos;
} else {
// 分数下降,可能过了峰值
if (step > MIN_STEPS) {
move_to(max_pos); // 回到最高点
break;
}
}
}
return max_pos;
}
2. 相位对焦 (PDAF) —— 单反下放的技术
PDAF 的原理比 CDAF 复杂一些,但说白了就是“看一眼就知道该往哪走”。
传感器上专门留了一些像素,它们被遮光罩分成左右两半。当画面合焦时,左右像素看到的图像完全重合;没合焦时,左右图像会有偏移。这个偏移量的大小和方向,直接告诉镜头:往哪边转、转多少。
我记得第一次调 PDAF 的驱动时,被那个“相位差转马达步数”的映射表折腾得不轻。不同镜头、不同温度,映射关系都不一样。
PDAF vs CDAF 对比
| 对比项 | PDAF | CDAF |
|---|---|---|
| 对焦速度 | 快(一次到位) | 慢(需要搜索) |
| 精度 | 中等(受限于像素间距) | 高(可达亚像素级) |
| 暗光表现 | 差(相位像素感光弱) | 中等(依赖对比度) |
| 硬件成本 | 高(需要专用像素) | 低(纯软件) |
| 适用场景 | 运动、连拍 | 静态、微距 |
关键点:PDAF 不是万能的。它只能告诉你“偏移了多少”,但没法告诉你“这个偏移量对应的距离是多少”。所以 PDAF 通常需要和 CDAF 配合使用——PDAF 快速粗调,CDAF 精细微调。
3. 激光/ToF 对焦 —— 主动测距
前面两种都是“被动对焦”——靠分析图像来推断焦点位置。激光和 ToF 是“主动对焦”——直接发射光,测量光往返的时间,算出距离。
激光对焦用的是三角测距法:发射一束激光,在传感器上找到反射光斑的位置,根据几何关系算出距离。ToF 则是直接测光的飞行时间。
这两种方式有个共同优点:不受纹理影响。你想想看,一面白墙,CDAF 和 PDAF 都抓瞎,但激光和 ToF 完全不在乎。
避坑指南:我曾经在一个扫地机器人项目上吃过亏。ToF 模组在室外强光下性能急剧下降,因为太阳光里的红外成分淹没了发射信号。后来我们加了带通滤波器和动态增益控制才搞定。
三种主动测距方式对比
| 方式 | 测距原理 | 有效距离 | 精度 | 典型应用 |
|---|---|---|---|---|
| 激光三角法 | 光斑位移 → 几何计算 | 0.1 ~ 5m | ±1mm | 手机辅助对焦 |
| dToF | 直接测量飞行时间 | 0.1 ~ 10m | ±1cm | iPad Pro LiDAR |
| iToF | 调制光相位差 | 0.1 ~ 5m | ±3cm | 手机前置人脸识别 |
4. 混合对焦 —— 实际产品中的最优解
讲完三种方式,你可能会问:到底用哪个?
我的答案是:小孩子才做选择,成年人全都要。
现在的旗舰手机,基本都是混合对焦系统:
- 第一步:激光/ToF 快速测距,给出大致距离
- 第二步:PDAF 根据相位差做精细调整
- 第三步:CDAF 做最后的微调,确保精度
这套流程走下来,对焦时间可以控制在 100ms 以内,而且精度能达到像素级。我参与的一个项目里,混合对焦比纯 CDAF 快了 5 倍,而且暗光场景下的成功率从 60% 提升到了 95%。
注意:混合对焦不是简单的“1+1+1”。三种方式的切换时机、置信度判断、异常处理,都是坑。比如激光测距突然跳变怎么办?PDAF 在低光照下置信度低怎么办?这些都需要在算法层面做融合和仲裁。
5. 调优实战要点
最后,分享几个我在调 AF 时常用的经验:
- 评价函数要选对:纹理丰富的场景用 Tenengrad,平滑场景用方差法,没有万能方案
- 搜索步长要自适应:粗搜大步快跑,精搜小步慢走,步长固定会浪费大量时间
- 死区处理:当清晰度变化小于阈值时,不要反复对焦,否则画面会一直抖动
- 温度补偿:镜头马达的响应会随温度变化,尤其是音圈马达,需要做温度查表补偿
- 边界保护:镜头不能真的走到物理极限,软件上要留安全余量
嗯,关于 AF 的原理就先讲这么多。这三种方式各有各的脾气,摸透了它们,你就能根据产品需求灵活组合了。