AF调优实战:对焦区域选择、对焦灵敏度调节、对焦马达校准、运动场景对焦策略

自动对焦(AF)是相机体验的基石。用户按下快门,最怕的就是拍糊了。我做了这么多年相机系统,可以说AF调优是最考验耐心和细节的活。今天咱们就聊聊AF调优的几个核心维度:区域怎么选、灵敏度怎么调、马达怎么校准、运动场景怎么应对。

核心观点:AF调优不是单一参数的调整,而是对焦区域、灵敏度、马达特性、场景策略四者的协同优化。任何一个环节掉链子,最终成像都会出问题。

AF调优实战知识体系 AF调优核心 对焦区域选择 中心/多点/跟踪 对焦灵敏度调节 步长/阈值/响应 对焦马达校准 VCM/闭环/温度 运动场景策略 预测/锁定/追焦 中心权重优先 人脸/物体跟踪 AF搜索步长 对比度阈值 无限远校准 温度补偿表 运动预测算法 快门延迟补偿 协同优化 → 快速、准确、平滑的对焦体验

1. 对焦区域选择:不是越大越好

很多人觉得对焦区域越大越好,其实不然。我见过不少项目,默认把对焦区域设成整个画面,结果在复杂场景下对焦来回跳。你想想看,画面里同时有近处的花和远处的山,AF该听谁的?

实际项目中,我一般建议这样配置:

  • 中心权重模式:默认场景,用户点击屏幕前先用中心区域快速锁定
  • 多点对焦:适合风景、集体照,AF会在多个区域中选最近的主体
  • 跟踪对焦:适合拍娃、拍宠物,一旦锁定就持续跟踪

我的经验:在调试多点对焦时,注意区域之间的权重分配。我曾经遇到一个case,左右区域权重太高,导致拍集体照时总是对焦到边缘的人身上,中间的人反而虚了。后来把中心区域权重提升到1.5倍,问题解决。

2. 对焦灵敏度调节:快不等于好

灵敏度这个参数,说白了就是AF响应变化的快慢。调得太灵敏,画面稍微动一下就重新对焦,拍视频时你会看到画面一直在「呼吸」。调得太迟钝,主体移动了半秒AF还没反应。

我个人习惯把灵敏度分为三个等级:

场景 灵敏度等级 典型参数
静态拍照 AF搜索步长 8,对比度阈值 0.3
日常视频 AF搜索步长 12,对比度阈值 0.2
运动抓拍 AF搜索步长 20,对比度阈值 0.1

这里有个坑要注意。AF搜索步长越大,对焦速度越快,但精度会下降。我见过有人把步长调到30,结果对焦总是在目标附近来回震荡,永远停不下来。嗯,这就是典型的「过冲」问题。

警告:不要为了追求速度而盲目提高灵敏度。过高的灵敏度会导致对焦环反复调整,不仅影响用户体验,还会增加功耗和马达磨损。

3. 对焦马达校准:硬件是基础

软件调得再好,马达不准也是白搭。对焦马达校准,说白了就是让软件知道「马达走到这个位置,镜头到底对焦在多少米」。我遇到过最头疼的问题,就是同一批次的马达,个体差异能达到10%以上。

校准流程一般包括:

  1. 无限远校准:让马达走到物理极限,记录此时的对焦值
  2. 近端校准:让马达走到最近对焦距离,记录对焦值
  3. 线性度测试:在中间取5-10个点,验证马达行程是否线性
  4. 温度补偿:不同温度下马达特性会漂移,需要建立补偿表
// 马达校准示例代码(简化版)
typedef struct {
    int32_t far_end_code;      // 无限远对应的DAC值
    int32_t near_end_code;     // 近端对应的DAC值
    int32_t linearity_error;   // 线性度误差(单位:um)
    int32_t temp_coeff;        // 温度补偿系数
} MotorCalibration_t;

MotorCalibration_t g_motor_cal;

void motor_calibrate(void) {
    // 1. 驱动马达到无限远物理限位
    motor_drive_to_limit(MOTOR_DIR_FAR);
    g_motor_cal.far_end_code = motor_get_current_code();
    
    // 2. 驱动马达到近端物理限位
    motor_drive_to_limit(MOTOR_DIR_NEAR);
    g_motor_cal.near_end_code = motor_get_current_code();
    
    // 3. 验证线性度
    int32_t step = (g_motor_cal.near_end_code - g_motor_cal.far_end_code) / 10;
    for (int i = 0; i <= 10; i++) {
        int32_t target = g_motor_cal.far_end_code + step * i;
        motor_move_to(target);
        // 用激光测距仪验证实际位移
        int32_t actual = laser_measure_distance();
        // 记录误差
    }
}

关键点:温度补偿表一定要做。我有个血的教训——某款手机在夏天户外拍视频,AF越来越不准,最后发现是马达温度从25°C升到45°C后,行程偏移了将近15%。从那以后,我坚持每款新马达都要做-10°C到60°C的全温区标定。

4. 运动场景对焦策略:预测比反应更重要

拍运动物体,最忌讳的就是「等对焦好了再拍」。等你对好了,主体早跑出画面了。运动场景的核心策略是预测——根据主体过去的运动轨迹,提前算出它下一步会出现在哪里。

我常用的运动对焦策略分三步:

  • 锁定阶段:用户点击屏幕或检测到人脸时,快速锁定主体
  • 跟踪阶段:持续计算主体的位置和速度,用卡尔曼滤波预测下一帧的位置
  • 补偿阶段:考虑快门延迟,在按下快门前提前调整对焦位置

举个例子,如果检测到主体以2m/s的速度靠近相机,而快门延迟是100ms,那么AF需要在按下快门前就把对焦位置往近端调整20cm。这个补偿量看起来不大,但对于大光圈镜头来说,20cm可能就是虚焦和清晰的区别。

一个小技巧:运动场景下,我建议把AF的「死区」设小一点。死区是指主体移动多少距离AF才重新触发。静态场景死区可以设大(比如50cm),避免频繁对焦。运动场景死区要设小(比如10cm),保证及时响应。

5. 实战中的避坑指南

最后分享几个我踩过的坑,希望能帮你少走弯路:

  • 不要忽略马达的「回程差」:VCM马达从远到近和从近到远,同一个DAC值对应的位置可能差几十微米。校准时要分别做正向和反向的映射表。
  • 注意场景切换时的AF策略:从拍近景切换到拍远景,如果直接让马达从近端跳到远端,用户会看到画面「刷」一下模糊再清晰。我习惯加一个平滑过渡,让马达在200ms内匀速移动过去。
  • 低光场景要降速:光线不足时,对比度检测的噪声会变大。这时候如果AF还按正常速度搜索,很容易误判。我一般会在亮度低于50lux时,把AF搜索速度降低30%。

AF调优没有银弹。每个项目都有自己的脾气,关键是要理解原理,然后根据实际场景去试、去调、去验证。希望今天的分享能给你一些启发。


公众号:蓝海资料掘金营,微信deep3321