自动对焦原理:CDAF、PDAF、激光/ToF 对焦

自动对焦,说白了就是让镜头自己找到最清晰的那个位置。我做了这么多年图像算法,最深的感触就是——对焦不准,后面所有算法都是白搭。你想想看,一张糊掉的图,再好的 AWB 和 AE 也救不回来。

今天咱们就把三种主流对焦方式掰开揉碎了讲。这三种方式,我按自己的理解把它们分成两类:算出来的和量出来的。

核心观点:CDAF 是“算”对比度,PDAF 是“算”相位差,激光/ToF 是“量”距离。算的慢但准,量的快但受限于硬件。

自动对焦三大技术路线 自动对焦 (AF) 对比度对焦 (CDAF) 相位对焦 (PDAF) 激光/ToF 对焦 特性 爬山搜索 + 评价函数 精度高,速度慢 特性 像素级相位检测 速度快,精度中等 特性 主动测距 暗光强项,有距离限制 应用:静态场景、微距 常见于:监控、显微镜 应用:运动场景、连拍 常见于:手机、单反 应用:暗光、低纹理 常见于:扫地机、无人机

1. 对比度对焦 (CDAF) —— 最朴素的“找最锐”

CDAF 的原理其实特别简单:图像越清晰,相邻像素的差异就越大。镜头从近到远走一遍,每到一个位置算一个“清晰度分数”,分数最高的那个位置就是焦点。

我习惯把 CDAF 比作“盲人爬山”。你闭着眼睛摸一个山坡,每走一步摸一下地面坡度,坡度最大的地方就是山顶。镜头也是这样,只不过它摸的是图像的对比度。

常用的清晰度评价函数

评价函数 原理 特点
Tenengrad Sobel 梯度平方和 抗噪好,计算量大
Laplacian 二阶微分值 对边缘敏感,易受噪声影响
Brenner 相邻像素差平方 计算快,精度一般
方差法 像素灰度方差 最简单,适合均匀场景

我的经验:实际项目中我很少只用一种评价函数。通常我会把 Tenengrad 和 Brenner 加权组合,前者保证精度,后者保证速度。有一次在低光照场景下,Laplacian 被噪声淹没了,换成 Tenengrad 才稳住。

爬山搜索算法

CDAF 的搜索策略也很有讲究。最基础的是全局搜索——镜头从头走到尾,找最大值。但这样太慢了,没人这么用。

实际产品里常用的是爬山法:

  1. 朝一个方向移动镜头,每步算一次清晰度
  2. 如果分数持续上升,继续走
  3. 如果分数开始下降,说明过了峰值,往回退到最高点
  4. 如果一开始就下降,说明方向反了,掉头

注意:爬山法有个致命问题——局部极值。比如镜头前面有个玻璃窗,玻璃上的污渍可能比远处的风景更“清晰”。我遇到过好几次这种情况,后来加了“粗搜 + 精搜”两段式策略才解决。

// 伪代码: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 时常用的经验:

  1. 评价函数要选对:纹理丰富的场景用 Tenengrad,平滑场景用方差法,没有万能方案
  2. 搜索步长要自适应:粗搜大步快跑,精搜小步慢走,步长固定会浪费大量时间
  3. 死区处理:当清晰度变化小于阈值时,不要反复对焦,否则画面会一直抖动
  4. 温度补偿:镜头马达的响应会随温度变化,尤其是音圈马达,需要做温度查表补偿
  5. 边界保护:镜头不能真的走到物理极限,软件上要留安全余量

嗯,关于 AF 的原理就先讲这么多。这三种方式各有各的脾气,摸透了它们,你就能根据产品需求灵活组合了。